PHP:使用LIKE选择器时防止SQL注入

PHP:使用LIKE选择器时防止SQL注入,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我有一个PHP脚本,它使用mysqli使用一个非常简单的搜索语句。声明如下: SELECT * FROM JobTracker WHERE JobName LIKE'%$jobName%' 现在我想阻止SQL注入,但我无法理解语法 我尝试过像“%”这样的和像“%”这样的和类似“%”+?+“%” 但都不管用。此SQL语句阻止注入的正确语法是什么 $jobName = real_escape_string($jobName); $stmt = mysqli->prepare("SELECT

我有一个PHP脚本,它使用mysqli使用一个非常简单的搜索语句。声明如下:

SELECT * FROM JobTracker WHERE JobName LIKE'%$jobName%'
现在我想阻止SQL注入,但我无法理解语法

我尝试过像“%”这样的
和像“%”这样的
类似“%”+?+“%”

但都不管用。此SQL语句阻止注入的正确语法是什么

$jobName = real_escape_string($jobName);

$stmt = mysqli->prepare("SELECT * FROM JobTracker WHERE JobName LIKE '%?%'");
$stmt->bind_param("s", $jobName);
$stmt->execute();
PDO语句对于防止SQL注入非常有用。

您有两种选择:

  • 在输入中应允许特殊字符
    %
    \
    作为通配符:

    ... LIKE CONCAT('%', ?, '%')
    
  • 不允许使用通配符:

    ... LIKE ?
    
    $jobName = '%'.str_replace(array("_","%"),array("\\_","\\%"),$jobName).'%';
    

在这里,请参阅关于SO=>的这篇文章,它不适用于LIKE选择器,因为我想使用“%”来获取包含字符串的值。除了防止SQL注入之外,您可能还想阻止拒绝服务机会。如果有人输入一个空白字符串,您将返回整个表。当您说它不工作时,您的意思是什么,语句是否正在运行,是否存在错误,或者您是否尝试输入SQL并接受它?致命错误:对非对象调用成员函数bind_param()。这就是它给我的错误。您运行的是什么版本的PHP?将
放在引号中将是一个字符串,并且永远不会与绑定参数关联。这个(答案)可能应该添加到该选项中,因为OP声明它不适用于LIKE选择器,根据,如果不能使用通配符,也可以使用
=
运算符。然后,您可以使用
%
\
作为它们的原始含义。对不起,我的意思是,如果您没有按照第二个示例将
%
关联到输入。