You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mysqli_query()执行PHP查询无结果,但在phpMyAdmin中正常返回数据

解决PHP中mysqli_query返回0行但phpMyAdmin正常的问题

看起来你的问题核心是相同的SQL在phpMyAdmin能返回结果,但PHP执行时返回0行,而且基础查询正常、连接也没问题,大概率是字符编码不匹配或者查询上下文的小差异导致的,下面给你一步步排查和解决的方案:

1. 优先检查数据库连接的字符集

这是这类场景最常见的原因:phpMyAdmin默认使用的字符集(比如utf8mb4)和PHP mysqli连接的默认字符集不一致,导致WHERE子句中带特殊字符的字符串(比如'Nome da capacitação'里的ç)无法匹配到表中的数据。

解决方法:在连接成功后立刻设置字符集,修改你的连接代码:

mysqli_report(MYSQLI_REPORT_STRICT);
try {
    $connection = mysqli_connect("localhost", "root", "", "test_db", "3308");
    // 添加这一行,匹配你的数据库字符集(通常是utf8mb4)
    mysqli_set_charset($connection, 'utf8mb4');
} catch (mysqli_sql_exception $e) {
    die("连接失败: " . $e->getMessage());
}

你可以先在phpMyAdmin里查看你的表/数据库的字符集(比如在表结构页面的顶部),确保mysqli_set_charset的参数和它完全一致。

2. 验证WHERE条件的匹配逻辑

如果字符集设置后还是不行,你可以简化查询来定位问题:

  • 先把外层的WHERE条件暂时改成1=1(取消过滤),执行后看PHP是否能返回数据。如果能,说明问题确实出在WHERE里的字符串匹配上。
  • 尝试把WHERE里的字符串换成表中不带特殊字符的titulo值(比如如果有'Instituicao'不带ç),看PHP能否返回结果,进一步确认是特殊字符的匹配问题。

3. 检查查询的一致性和隐性错误

虽然你说查询完全相同,但还是可以做个验证:

  • 在PHP里执行echo $query;,把输出的SQL复制到phpMyAdmin里执行,确认是否真的完全一致(比如有没有换行、转义字符的差异)。
  • 即使$result返回true,也可以打印mysqli_error($connection)和mysqli_num_rows($result)来确认有没有隐性的警告或行数:
$result = mysqli_query($connection, $query);
echo "错误信息: " . mysqli_error($connection) . "<br>";
echo "返回行数: " . mysqli_num_rows($result) . "<br>";

额外的查询优化建议(非当前问题,但能提升性能)

你的原查询多次JOIN了同一个表,可以优化成更简洁的结构,比如用CASE或者一次JOIN获取所需数据,不过这不会影响当前的返回行数问题,只是后续可以考虑:

SELECT 
    COALESCE(
        ir_long.resposta_text,
        c.longitude
    ) AS Longitude
FROM indicadores i
LEFT JOIN indicadores_respostas ir_nome ON ir_nome.id_indicador = i.id
LEFT JOIN indicadores_secoes_itens isi_nome ON isi_nome.id = ir_nome.id_secao_item AND isi_nome.titulo = 'Nome da capacitação'
LEFT JOIN indicadores_respostas ir_instit ON ir_instit.id_indicador = i.id
LEFT JOIN indicadores_secoes_itens isi_instit ON isi_instit.id = ir_instit.id_secao_item AND isi_instit.titulo = 'Instituição'
-- 关联获取Longitude的响应
LEFT JOIN indicadores_respostas ir_long ON ir_long.id_indicador = i.id
LEFT JOIN indicadores_secoes_itens isi_long ON isi_long.id = ir_long.id_secao_item AND isi_long.titulo = 'Longitude'
-- 关联获取Cidade对应的经度
LEFT JOIN indicadores_respostas ir_cidade ON ir_cidade.id_indicador = i.id
LEFT JOIN indicadores_secoes_itens isi_cidade ON isi_cidade.id = ir_cidade.id_secao_item AND isi_cidade.titulo = 'Cidade'
LEFT JOIN cidades c ON c.cidades_id = CAST(ir_cidade.resposta_text AS SIGNED)
WHERE isi_nome.id IS NOT NULL OR isi_instit.id IS NOT NULL;

内容的提问来源于stack exchange,提问作者Felipe Marcolin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:37:45