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

Azure App Service + Azure MySQL数据库中执行SELECT查询仅返回'1'的问题排查

问题原因及修复方案

嘿,我来帮你拆解下你遇到的问题:

首先,你看到只返回'1'的直接原因很明确:
如果你用的是mysqli扩展连接数据库,$stmt->fetch()这个方法本身返回的是布尔值——查询成功就返回true,失败返回false。当你直接echo布尔值的时候,true就会被转换成字符串'1'输出,这就是你看到的结果,根本不是你要的查询数据~

另外你的代码还有两个必须修复的关键问题:

1. 用错了结果获取方式(针对mysqli)

如果是用mysqli的话,正确拿查询结果得这么做:

方法一:先获取结果集再取数据

error_reporting(E_ALL);
ini_set('display_errors',1);
include('dbconnectr.php');
$id = $_GET['id'];
// 改成用?做占位符,不要直接拼变量
$stmt = $con->prepare('select * from contents where id=?');
// 绑定参数,'i'表示id是整数类型,根据你的实际字段类型调整
$stmt->bind_param('i', $id);
$stmt->execute();
// 先拿到完整的结果集
$result_set = $stmt->get_result();
// 取一行关联数组(键是字段名)
$row = $result_set->fetch_assoc();
// 用print_r或者var_dump输出数组,别直接echo
print_r($row);

方法二:绑定结果变量

如果不需要整个数组,也可以直接绑定字段对应的变量:

$stmt = $con->prepare('select title, content from contents where id=?');
$stmt->bind_param('i', $id);
$stmt->execute();
// 把查询结果的字段绑定到变量上
$stmt->bind_result($title, $content);
// fetch成功会把值填充到绑定的变量里
if ($stmt->fetch()) {
    echo "标题:{$title},内容:{$content}";
}

2. 高危的SQL注入风险

你现在直接把$_GET['id']拼进SQL语句里:

$stmt = $con->prepare('select * from contents where id='.$id);

这等于完全浪费了预编译语句的安全作用!任何人都能构造恶意的id参数来攻击你的数据库,比如输入1 OR 1=1就能把整张表的数据都查出来,甚至删表。必须用上面的参数绑定方式,永远不要直接把用户输入拼进SQL里!

补充:如果是PDO扩展的情况

要是你的$con是PDO连接,那$stmt->fetch()默认会返回结果数组,但直接echo数组的话会输出Array而不是1,所以这种情况概率不高。不过就算是PDO,也得用参数绑定:

$stmt = $con->prepare('select * from contents where id=:id');
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($row);

总结下,你现在的核心问题是用错了mysqli_stmt的fetch方法,导致输出的是布尔值true对应的'1',同时还存在严重的SQL注入风险,按照上面的代码修改就能解决啦~

内容的提问来源于stack exchange,提问作者최정태

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:57:33