【问题标题】:Mysql condition becoming string after adding variable添加变量后Mysql条件变为字符串
【发布时间】:2021-12-15 22:51:27
【问题描述】:

添加$city$findname变量后Mysql条件变为字符串 正如我所宣传的 ("") '".$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 />";
}

【问题讨论】:

  • 请查看编辑器图片 执行此操作:sql1 = {query with variables and substitution}; sql2 = {query with literals}; 然后检查 sql1 == sql2
  • 确保你在 $_POST 中获得了价值
  • @Akina 会在这里为我写下这两行!
  • @Mahmodul 尝试添加不带双引号和. 的字符串变量
  • $wpdb-&gt;get_results("SELECT * from directory WHERE city LIKE '$city' OR findname LIKE '$findname'");

标签: php mysql wordpress


【解决方案1】:

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

$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 Injection

您可以将PDO 添加到您的代码中,这样您的查询将如下所示

"SELECT * FROM directory WHERE city LIKE ? OR findname LIKE ?"

PDO 会为您处理转义的引号。由于您几乎可以肯定芝加哥搜索词周围有引号,因此您的查询可能找不到您想要的记录,但它在语法上是正确的。为了解决您遇到的其他问题,您需要确保初始化 city 值的任何内容都不会人为地将引号括起来。

【讨论】:

    【解决方案2】:

    这样使用

    $show_details = $wpdb->get_results("SELECT * FROM directory WHERE city LIKE '",$city,"' OR findname LIKE '",$findname,"'");
    

    【讨论】:

    • 正如我所说的 ("") '",$city,"' 其余部分变得无效.. 返回 NULL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2015-09-05
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多