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
相关产品推荐
相关产品推荐

