首页 > 解决方案 > 添加变量后Mysql条件变为字符串

问题描述

$city添加OR变量后 Mysql 条件变为字符串$findnameAs 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 />";
}

标签: phpmysqlwordpress

解决方案


首先,您可以通过以下方式测试您的假设是否正确:

$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 值的任何内容都不会人为地将引号括起来。


推荐阅读