PHP无法获取SQL查询结果求助:变量替换失效已定位空格问题
问题分析与解决方案
问题根源
你碰到的这个问题核心原因很明确:$hash变量里带有多余的空白字符(比如空格)。当你直接把hash="3"写进SQL语句时,查询条件是精准匹配的hash = '3',但用变量时实际执行的是hash = ' 3'(假设变量带前导空格),数据库里存储的hash值没有空格,自然匹配不到结果,也就拿不到你预期的数字2了。
快速修复方案
解决这个问题最简单的办法就是用PHP的trim()函数去除变量首尾的空白字符(包括空格、换行符、制表符等),修改后的代码如下:
<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); require("db.php"); // 移除变量首尾的空白字符 $hash = trim($_GET["hash"]); $sql23 = "SELECT * FROM `game` WHERE `hash` = '$hash'"; if ($result=mysqli_query($link,$sql23)) { // 遍历查询结果 while ($row = mysqli_fetch_row($result)) { printf ("%s (%s)\n", $row[0], $row[1]); } // 释放结果集 mysqli_free_result($result); } ?>
关键安全提示
另外必须提醒你:当前代码存在严重的SQL注入风险——直接把用户输入的$_GET["hash"]拼接到SQL语句里,恶意用户可以构造特殊输入篡改你的SQL逻辑,甚至窃取或破坏数据库数据。
推荐改用**预处理语句(Prepared Statements)**来彻底解决这个问题,同时也能避免类似变量格式导致的查询异常,示例代码如下:
<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); require("db.php"); $hash = trim($_GET["hash"]); // 初始化预处理语句 $stmt = mysqli_prepare($link, "SELECT * FROM `game` WHERE `hash` = ?"); // 绑定参数("s"表示参数为字符串类型) mysqli_stmt_bind_param($stmt, "s", $hash); // 执行语句 mysqli_stmt_execute($stmt); // 获取结果集 $result = mysqli_stmt_get_result($stmt); // 遍历输出结果 while ($row = mysqli_fetch_row($result)) { printf ("%s (%s)\n", $row[0], $row[1]); } // 清理资源 mysqli_stmt_close($stmt); mysqli_free_result($result); ?>
内容的提问来源于stack exchange,提问作者atr
相关产品推荐
相关产品推荐

