Php 为什么Mysqli prepared语句不转义通配符(%and \)和反斜杠(\)?

Php 为什么Mysqli prepared语句不转义通配符(%and \)和反斜杠(\)?,php,mysql,mysqli,prepared-statement,sql-injection,Php,Mysql,Mysqli,Prepared Statement,Sql Injection,作为一种安全措施,我使用Mysqli prepared语句和bindvariables 我的代码如下所示: $what = trim($_GET['what']); $key_word = "%".$what."%"; $where_clause = " WHERE chair.company LIKE ? OR chair.business_category LIKE ? OR chair.summary LIKE ?"; $query = "SELECT chair.id_user, c

作为一种安全措施,我使用Mysqli prepared语句和bindvariables

我的代码如下所示:

$what = trim($_GET['what']);
$key_word = "%".$what."%";  
$where_clause = " WHERE chair.company LIKE ? OR chair.business_category LIKE ? OR chair.summary LIKE ?";
$query = "SELECT chair.id_user, chair.company   FROM chair" . $where_clause; 
$con = @mysqli_connect($hostname,$username,$password, $database_name);
$stmt = mysqli_prepare($con, $query);
$bind = mysqli_stmt_bind_param($stmt, 'sss', $key_word, $key_word, $key_word);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$bind = mysqli_stmt_bind_result($stmt,$business_id,$company);
while (mysqli_stmt_fetch($stmt))
    {
    echo htmlspecialchars($company)."<br>";
    }
发件人:

作为显式转义特殊字符的替代方法,许多MySQL API提供占位符功能,使您能够在语句字符串中插入特殊标记,然后在发出语句时将数据值绑定到它们。在本例中,API负责为您转义值中的特殊字符

我可以使用键盘中除\%\之外的所有字符,并正确转义和匹配。 我的问题是,这个准备好的语句不能转义通配符%和u和转义字符\。当我搜索%时,它列出数据库中的所有项目。当我搜索时,它会列出所有项目。 搜索\时,它与所需项目不匹配

我已经找到了一个,但是amswer从来没有满足我的要求,因为我必须在查询中使用通配符

答案是为了逃避他们,使用双反斜杠

即使这不是一个安全问题,为什么事先准备好的声明也不能逃避它们? 我在代码中使用它的方式有错误吗? 如何动态地避开它们?我可以使用哪一个函数?

准备好的语句可以正确地转义\。否则,它们将无法创建格式正确的语句,而这正是预处理语句的主要目的

除此之外,%和u只是字符串的特殊字符,而不是一般的字符串。因此,一般来说,没有必要逃避它们。如果您需要将它们转义为类似的比较,请明确执行以下操作:

$what = addcslashes($what, '%_');
除此之外,还支持使用除\:


%:它们是同类声明的一部分;如果他们逃跑了,他们就不会工作。
mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|';
        -> 1