PHP中变量拼接SQL查询失效,报MariaDB语法错误如何解决?
问题原因与解决方案
核心问题:缺失字符串值的单引号
硬编码查询里,字符串类型的username和dvd值是用单引号包裹的(比如'kaas'、'dvd 2'),但变量拼接时直接把变量值拼进SQL语句,没有添加单引号,导致生成的SQL语法完全错误。
举个例子,当$_SESSION['name']值为kaas、$_POST['dvd']值为dvd 2时,拼接后的SQL是:
SELECT * from hired WHERE username = kaas AND dvd = dvd 2
数据库会把kaas、dvd识别为列名,而不是字符串值;后面的2就成了无意义的语法片段,直接触发语法错误,这就是你看到near '2'报错的原因。
正确的解决方式
绝对不要用字符串拼接的方式构造SQL(还会引发SQL注入风险),应该使用参数化查询(预处理语句),以PHP为例:
MySQLi 示例
// 假设$conn是已建立的数据库连接 $stmt = $conn->prepare("SELECT * from hired WHERE username = ? AND dvd = ?"); $stmt->bind_param("ss", $_SESSION['name'], $_POST['dvd']); // "ss"表示两个字符串类型参数 $stmt->execute(); $result = $stmt->get_result(); // 处理查询结果
PDO 示例
// 假设$pdo是已建立的PDO连接 $stmt = $pdo->prepare("SELECT * from hired WHERE username = :username AND dvd = :dvd"); $stmt->execute([ ':username' => $_SESSION['name'], ':dvd' => $_POST['dvd'] ]); $result = $stmt->fetchAll(); // 处理查询结果
如果非要临时用字符串拼接(不推荐,有注入风险),必须给变量值加上单引号,同时要转义特殊字符:
// 仅临时测试用,生产环境禁止 $username = mysqli_real_escape_string($conn, $_SESSION['name']); $dvd = mysqli_real_escape_string($conn, $_POST['dvd']); $query = "SELECT * from hired WHERE username = '$username' AND dvd = '$dvd'";
内容的提问来源于stack exchange,提问作者Fal
相关产品推荐
相关产品推荐

