我正在尝试创建一个目录,您可以在其中根据您提供的参数进行搜索。naam 是产品的名称,而 wood 是给定的字符。稍后在脚本中,我将查询的这一部分粘贴到第一部分。
谢谢
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%' ";
作为旁注,SQL Injection
如果变量的值(s)来自外部,则查询很容易受到攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements
,您可以摆脱在值周围使用单引号。
使用双引号。
或转义单引号。
也请不要做你目前正在做的事情。
不要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 子句中的特殊字符。