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

PHP脚本执行无返回结果,但SQL查询在phpMyAdmin可正常获取数据

问题分析与解决

问题描述

使用以下PHP脚本从数据库获取数据时,脚本输出vacio,但将SQL语句在phpMyAdmin中执行能正常返回数据:

//create connection
$conn = new mysqli($servername, $username, $password, $dbname);
mysqli_set_charset($conn,"utf8");

if ($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
    return;
}

$sql = "SELECT 
tarea.id as id,
tarea.usuario_asignado as usuario_asignado_id,
users.nombre as usuario_asignado_nombre,
users.apellidos as usuario_asignado_apellidos,
users.email as usuario_asignado_email,
tarea.descripcion as descripcion,
tarea.latitud as latitud,
tarea.longitud as longitud,
tarea.ubicacion as ubicacion,
tarea.titulo as titulo,
tarea.edificio as edificio,
tarea.planta as planta,
tarea.estancia as estancia,
tarea.categoria as categoria_id,
categoria.categoria as categoria_categoria,
tarea.subcategoria as subcategoria_id,
subcategoria.subcategoria as subcategoria_subcategoria,
tarea.tipo as tipo_id,
tipo.tipo as tipo_tipo,
tarea.fecha_hora_vencimiento as fecha_hora_vencimiento,
tarea.fecha_hora_inicio_programada as fecha_hora_inicio_programada,
tarea.fecha_hora_inicio_efectiva as fecha_hora_inicio_efectiva,
tarea.fecha_hora_fin as fecha_hora_fin,
tarea.expediente as expediente_id,
exp.titulo as expediente_titulo,
tarea.asignada_a_usuario as asignada_a_usuario,
tarea.asignada_a_grupo as asignada_a_grupo,
tarea.grupo as grupo_id,
grupo.grupo_int as grupo_int,
tarea.estado as estado_id,
estado.estado as estado_estado

FROM tb_tareas tarea

LEFT JOIN tb_usuarios_internos userint ON tarea.usuario_asignado = userint.id_usuario
LEFT JOIN tb_usuarios users ON users.id = userint.id_usuario
LEFT JOIN tb_categorias_tareas categoria ON categoria.id = tarea.categoria
LEFT JOIN tb_subcategoria_tareas subcategoria ON subcategoria.id = tarea.subcategoria
LEFT JOIN tb_tipos_tareas tipo ON tipo.id = tarea.tipo
LEFT JOIN tb_expedientes exp ON exp.id = tarea.expediente
LEFT JOIN tb_grupos_internos grupo ON grupo.id = tarea.grupo
LEFT JOIN tb_estados_tareas estado ON estado.id = tarea.estado
WHERE tarea.usuario_asignado = '182'
ORDER BY estado.estado DESC, tarea.fecha_hora_inicio_programada
 ";
$result = $conn->query($sql);

$response = array();

if ($result->num_rows > 0){
    while($row = $result->fetch_assoc()){
        array_push($response,$row);
    }
    $conn->close;
header('Content-Type: application/json');
echo json_encode($response);
}
else {
    echo "vacio";
}

脚本存在的问题及修复方案

1. 未处理SQL执行失败的情况

$conn->query($sql)如果执行失败会返回false,此时调用$result->num_rows会触发错误,脚本直接进入else分支输出vacio,但无法得知SQL实际出错原因。

修复:添加SQL执行结果检查,输出错误信息:

$result = $conn->query($sql);
if (!$result) {
    die("SQL执行错误: " . $conn->error);
}

2. 数据库连接关闭语法错误

$conn->close缺少括号,无法正确调用关闭连接的方法,应改为$conn->close();。

3. 冗余代码

die("Connection failed: " . $conn->connect_error);之后的return毫无意义,因为die已经终止脚本执行,直接删除即可。

4. 字符集设置的引号转义冗余

mysqli_set_charset($conn,"utf8");里的双引号不需要转义,改为mysqli_set_charset($conn, "utf8");或使用单引号mysqli_set_charset($conn, 'utf8');更清晰。

修复后的完整脚本示例

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
mysqli_set_charset($conn, "utf8");

if ($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT 
tarea.id as id,
tarea.usuario_asignado as usuario_asignado_id,
users.nombre as usuario_asignado_nombre,
users.apellidos as usuario_asignado_apellidos,
users.email as usuario_asignado_email,
tarea.descripcion as descripcion,
tarea.latitud as latitud,
tarea.longitud as longitud,
tarea.ubicacion as ubicacion,
tarea.titulo as titulo,
tarea.edificio as edificio,
tarea.planta as planta,
tarea.estancia as estancia,
tarea.categoria as categoria_id,
categoria.categoria as categoria_categoria,
tarea.subcategoria as subcategoria_id,
subcategoria.subcategoria as subcategoria_subcategoria,
tarea.tipo as tipo_id,
tipo.tipo as tipo_tipo,
tarea.fecha_hora_vencimiento as fecha_hora_vencimiento,
tarea.fecha_hora_inicio_programada as fecha_hora_inicio_programada,
tarea.fecha_hora_inicio_efectiva as fecha_hora_inicio_efectiva,
tarea.fecha_hora_fin as fecha_hora_fin,
tarea.expediente as expediente_id,
exp.titulo as expediente_titulo,
tarea.asignada_a_usuario as asignada_a_usuario,
tarea.asignada_a_grupo as asignada_a_grupo,
tarea.grupo as grupo_id,
grupo.grupo_int as grupo_int,
tarea.estado as estado_id,
estado.estado as estado_estado

FROM tb_tareas tarea

LEFT JOIN tb_usuarios_internos userint ON tarea.usuario_asignado = userint.id_usuario
LEFT JOIN tb_usuarios users ON users.id = userint.id_usuario
LEFT JOIN tb_categorias_tareas categoria ON categoria.id = tarea.categoria
LEFT JOIN tb_subcategoria_tareas subcategoria ON subcategoria.id = tarea.subcategoria
LEFT JOIN tb_tipos_tareas tipo ON tipo.id = tarea.tipo
LEFT JOIN tb_expedientes exp ON exp.id = tarea.expediente
LEFT JOIN tb_grupos_internos grupo ON grupo.id = tarea.grupo
LEFT JOIN tb_estados_tareas estado ON estado.id = tarea.estado
WHERE tarea.usuario_asignado = '182'
ORDER BY estado.estado DESC, tarea.fecha_hora_inicio_programada
 ";

$result = $conn->query($sql);
// 检查SQL是否执行成功
if (!$result) {
    die("SQL错误: " . $conn->error);
}

$response = array();

if ($result->num_rows > 0){
    while($row = $result->fetch_assoc()){
        array_push($response,$row);
    }
    $conn->close(); // 修复关闭连接的语法
    header('Content-Type: application/json');
    echo json_encode($response);
}
else {
    echo "vacio";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:57:20