我可以';I don’我的同类查询无法正常工作


I can't get my like query to work

我正在尝试创建一个目录,您可以在其中根据给出的参数进行搜索。naam是产品的名称,woord是给定的字符。稍后在脚本中,我将查询的这一部分粘贴到第一部分。

谢谢

if(strlen($whereQuery) > 0) 
    $whereQuery .= 'AND naam LIKE '%'.$woord.'%'';
else
    $whereQuery = 'WHERE naam LIKE '%'.$woord.'%'';

我宁愿使用双引号来避免混淆,

if(strlen($whereQuery) > 0) 
    $whereQuery .= " AND naam LIKE '%" .$woord. "%' ";
else
    $whereQuery = " WHERE naam LIKE '%" .$woord. "%' ";

或者简单地,

if(strlen($whereQuery) > 0) 
    $whereQuery .= " AND naam LIKE '%$woord%' ";
else
    $whereQuery = " WHERE naam LIKE '%$woord%' ";

附带说明一下,如果变量的值(s)来自外部,那么查询就容易受到SQL Injection的攻击。请看下面的文章来了解如何防止它。通过使用PreparedStatements,您可以摆脱在值周围使用单引号的情况。

  • 如何防止PHP中的SQL注入

使用双引号。

或者转义单引号。


此外,请不要做你目前正在做的事情。

不要在新代码中使用mysql_*函数。它们不再被维护,并被正式弃用。是否看到红框?了解准备好的语句,并使用PDO或MySQLi-本文将帮助您决定哪一个。如果你选择PDO,这里有一个很好的教程。

您需要转义作为查询一部分的引号:

if(strlen($whereQuery) > 0) 
    $whereQuery .= 'AND naam LIKE ''%'.$woord.'%''';
else
    $whereQuery = 'WHERE naam LIKE ''%'.$woord.'%''';

或者使用单引号和双引号的组合。

任何带有颜色编码的编辑器都会立即向您显示问题。只需查看问题中的代码即可。

试试这个:

$whereQuery = ($whereQuery ? $whereQuery." AND" : " WHERE")." naam LIKE '%".$woord."%'";

这样可以避免重复整个"LIKE"部分两次;)

此外,请确保已正确逃离$woord。在这种情况下,mysql_real_escape_string是不够的。您还需要通过preg_replace("/[%_]/","''$1",$woord);运行它来转义WHERE子句中的特殊字符。