php - 添加变量后Mysql条件变为字符串
问题描述
$city
添加OR变量后 Mysql 条件变为字符串$findname
As I ad ("") '".$city."' 其余部分变得无效
$findname = $_POST['findname'];
$city = $_POST['city'];
$show_details = $wpdb->get_results("SELECT * from directory WHERE city LIKE '".$city."' OR findname LIKE '".$findname."'");
foreach ($show_details as $k => $v) {
echo $v->name . "<br />";
}
解决方案
首先,您可以通过以下方式测试您的假设是否正确:
$show_details = $wpdb->get_results("SELECT * from directory WHERE city LIKE 'Chicago' OR findname LIKE 'John Doe'");
这在语法上应该是正确的。因此,由于您的查询失败,很可能您的值本身存在问题,例如您拥有的Chicago可能用单引号括起来,例如'Chicago'
. 这会导致类似的东西
$show_details = $wpdb->get_results("SELECT * from directory WHERE city LIKE ''Chicago'' OR findname LIKE 'John Doe'");
这在语法上是不正确的。看到这一点,很明显需要正确处理单引号,也就是说,您的程序需要可靠地区分用于封装文本信息的单引号和可以作为数据一部分的单引号。
在我们的例子中,单引号问题在一些可修复的错误中表现出来。但是,如果恶意程序员发现您的代码没有正确区分您环绕文本数据的单引号和作为数据一部分的单引号,该怎么办?他们可能会故意在搜索词或其他数据中添加单引号来结束您的搜索命令,他们还会添加新的恶意代码命令。例如,您的数据可能是Chicago'; delete from directory;
. 附加为的值$city
将导致
$show_details = $wpdb->get_results("SELECT * from directory WHERE city LIKE '`Chicago'; delete from directory`;' OR findname LIKE 'John Doe'");
然后它会运行一些搜索命令,从你的数据库中删除目录,然后运行一些黑客不会关心的无效命令。这是一种称为SQL 注入的严重危险。
您可以将PDO添加到您的代码中,因此您的查询看起来像
"SELECT * FROM directory WHERE city LIKE ? OR findname LIKE ?"
PDO 会为您处理转义的报价。由于您几乎可以肯定在芝加哥搜索词周围有引号,因此您的查询可能找不到您想要的记录,但它在语法上是正确的。为了解决您遇到的另一个问题,您需要确保初始化 city 值的任何内容都不会人为地将引号括起来。
推荐阅读
- javafx - 是否可以在 JavaFX GUI 应用程序上执行无头 GUI 测试?
- macos - 无法在 MacOS 上设置 AppleId
- r - Microsoft Graph API - 错误 403“权限不足,无法完成操作”
- sql - 如何在 XMLA 中为 SSAS 使用 SQL?
- oracle - 使用oracle sql,如何将每个数字转换为和9
- python - 在同一网格上绘制多个数组但指定单独的颜色
- java - Spring @Bean Name,不适用于@Qualifier
- javascript - 你怎么知道哪些网站是 HTML 和 JS 以及哪些网站是使用 React、Angular 等通过 JS 呈现的?
- javascript - 从 json 中删除编号的键
- python-3.x - 二叉搜索树获得 AttributeError 的主要乐趣:'BTreeWordFinder' 对象没有属性 'showDepth'