PHP 8.3.2连接MySQL时输出键名而非值的问题求助
问题:PHP查询返回字段名而非实际值
我之前能正常运行的PHP代码现在出问题了,当前使用Homebrew安装在M1 Mac mini上的PHP 8.3.2。代码执行后,输出的是重复的字段名而非数据库中的实际值,但同样的SQL语句在phpMyAdmin里能正常执行。
出错代码
$sql = "SELECT 'Title', 'Author', 'Author (Last, First)', 'Year Published', 'Publisher' FROM bb_2_4_23 ORDER BY " . $_SESSION["order"] . " LIMIT ". $number_per_page . " OFFSET " . $_SESSION["start"]; //mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "<div class='book'>"; echo "<a href= 'book.php?title=". $row["Title"] . "'><i>". $row["Title"] . "</a></i> <br>by " . $row["Author"]. "<br>"; echo $row["Publisher"]. " " . $row["Year Published"] . "<br>"; echo "</div>"; } } else { echo "<p>No books could be found.</p>"; }
输出现象
输出结果重复显示字段名(多次重复):
Title
by Author
Publisher Year Published
也就是$row输出的是键名对应的字符串而非数据库中的实际数据,我怀疑是不是PHP与MySQL关联数组的处理方式有变化,但查文档代码应该是可行的。
解决方案
问题根源在SQL语句:你用单引号包裹字段名,MySQL会把这些单引号里的内容当成字符串常量返回,而不是去读取对应字段的实际值。
- 修正SQL语句:把字段名的单引号换成反引号(`),对于包含空格、括号的特殊字段名,必须用反引号包裹;无特殊字符的字段名也可以省略反引号:
// 修正后的SQL语句 $sql = "SELECT `Title`, `Author`, `Author (Last, First)`, `Year Published`, `Publisher` FROM bb_2_4_23 ORDER BY " . $_SESSION["order"] . " LIMIT ". $number_per_page . " OFFSET " . $_SESSION["start"];
额外提醒:你的代码存在SQL注入风险,直接拼接$_SESSION["order"]、$number_per_page等变量到SQL语句中是不安全的。建议改用预处理语句,或者对排序字段做白名单校验(只允许指定的字段名作为排序依据),避免恶意注入攻击。
内容的提问来源于stack exchange,提问作者Peter Wiley
相关产品推荐
相关产品推荐

