我正在尝试从MySQL中获取一些数据,这些数据通过Ajax中的依赖选择包含单引号,但它没有返回任何结果。
我用了
$mysqli->real_escape_string
这也无济于事。
在我的数据库表中,我有这样的值:
奥顿"A",贾贡B"。使用依赖选择菜单,我需要在每个菜单下获取位置。
我的查询:
$ward_code = $mysqli->real_escape_string($_REQUEST['ward_code']);
$sql = "select pu_name, concat(pu_code,' - ',pu_name) pu_name from polling_unit where REPLACE(pu_ward_name,'\\','')='".$ward_code."'
AND pu_name NOT IN (SELECT pu_name FROM post_election_info ) order by CAST(pu_code AS UNSIGNED)";
正如 Nigel Ren 上面评论的那样,你应该学会使用查询参数。
像这样:
$sql = "SELECT pu_name, CONCAT(pu_code,' - ',pu_name) pu_name
FROM polling_unit
WHERE REPLACE(pu_ward_name,'\\','') = ?
AND pu_name NOT IN (SELECT pu_name FROM post_election_info)
ORDER BY CAST(pu_code AS UNSIGNED)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", $_REQUEST['ward_code']);
$stmt->execute();
不要在?
参数占位符两边加上引号。它不需要它们,它将始终被视为单个标量值。
不要在$_REQUEST['ward_code']
上做任何逃跑。使用查询参数时不需要它,它将始终被视为单个标量值。因此,它不能"脱离"任何带引号的字符串,即使它包含文字单引号。
使用查询参数是比担心转义是否正确更好的解决方案。这比让自己眼睛疲劳地看着所有的引号中的引号并想知道你是否正确平衡了它们要好。
查询参数更易于编码,并且对代码质量和安全性更安全。