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,提问作者최정태
相关产品推荐
相关产品推荐

