如何使用MySQL和PHP创建一个通配符搜索函数


How to create a wildcard search function using MySQL and PHP

目前我正在编辑一些PHP/Javascript代码的数据库网站,使用MySQL来存储它的数据。到目前为止,如果我在输入数据行输入框中搜索某些内容,则会显示从MySQL提取的搜索结果。但是,我想输入一个通配符函数,这样,如果我输入"EXAMPLE *",搜索结果将拉出包含单词EXAMPLE的数据。

我正在编辑的代码目前使用这个从MySQL拉出搜索结果:

<?php
$query = "SELECT * FROM database.table";
echo $_GET['DATA1'];
if(($_GET['DATA1'] === "") && ($_GET['DATA2'] === "")) {
}
else
{
     $query .= " where 1=1 ";
     $query .= ($_GET['DATA1'] === "") ? '' : ' and DATA1A = "'.$_GET['DATA1'].'"';
     $query .= ($_GET['DATA2'] === "") ? '' : ' and DATA2A = "'.$_GET['DATA2'].'"';
}
$result=mysql_query($query);
while ($row=mysql_fetch_row($result))
{
      echo "<tr>";
echo "<td>".$row[0]."</td>";
echo "<td>".$row[1]."</td>;
?>

我对PHP不太熟悉,有人能解释一下上面的代码是做什么的(特别是'$query .='部分),以及我如何改变它,以便通配符功能可以工作?谢谢你!(另外,我在列标题上省略了一些html代码,因为它们并不真正相关)。

此代码只搜索包含确切单词的记录,因为它使用比较操作DATA1A =" '.$_GET['DATA1'].'"

使用搜索,你应该使用MySQL的"LIKE"操作,通过替换

 $query .= ($_GET['DATA1'] === "") ? '' : ' and DATA1A = "'.$_GET['DATA1'].'"';
 $query .= ($_GET['DATA2'] === "") ? '' : ' and DATA2A = "'.$_GET['DATA2'].'"';

 $query .= ($_GET['DATA1'] === "") ? '' : ' and DATA1A LIKE "%'.$_GET['DATA1'].'%"';
 $query .= ($_GET['DATA2'] === "") ? '' : ' and DATA2A LIKE "%'.$_GET['DATA2'].'%"';

更多信息见MySQL文档http://dev.mysql.com/doc/refman/5.0/fr/string-comparison-functions.html

PS:我强烈建议使用PDO准备查询,以避免SQL注入攻击对您的网站或至少转义一些特殊字符,可能会导致一些问题,如'和%。我建议您使用以下代码:

<?php
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname='.$db_name, $user, $pass, $pdo_options);
$param=array();
$query = "SELECT * FROM database.table";
echo $_GET['DATA1'];
if(($_GET['DATA1'] === "") && ($_GET['DATA2'] === "")) {
}
else
{
     $query .= " where 1=1 ";
     $query .= ($_GET['DATA1'] === "") ? '' : ' and DATA1A LIKE ?';
     if($_GET['DATA1'] != "") array_push($param,"%".$_GET['DATA1']."%");
     $query .= ($_GET['DATA2'] === "") ? '' : ' and DATA2A LIKE ?';
     if($_GET['DATA2'] != "") array_push($param,"%".$_GET['DATA2']."%");
}
$req = $bdd->prepare($query);
$req->execute($param);
while ($row=$req->fetch())
{
      echo "<tr>";
echo "<td>".$row['DATA1A']."</td>";
echo "<td>".$row['DATA2A']."</td>";
      echo "</tr>";
}
?>

我没有试过,但是应该可以

如果$_GET['DATA1']或$_GET['DATA2']不为空,代码将把where 1=1附加到$query。然后,如果$_GET['DATA1']不为空,它将追加and DATA1A = "XXX"。(其中XXX为$_GET['DATA1']的内容)。$_GET['DATA2']也一样。

您需要在MySQL中使用LIKE函数来使用通配符

 $query .= " where 1=1 ";
 $query .= ($_GET['DATA1'] === "") ? '' : ' and DATA1A LIKE "%'.$_GET['DATA1'].'%"';
 $query .= ($_GET['DATA2'] === "") ? '' : ' and DATA2A LIKE "%'.$_GET['DATA2'].'%"';