如何使用MySQL和PHP创建通配符搜索功能

时间:2014-07-29 22:10:01

标签: javascript php mysql wildcard

目前,我正在为使用MySQL存储数据的数据库网站编辑一些PHP / Javascript代码。截至目前,如果我在输入数据行输入框中搜索某些内容,则会显示从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,有人可以解释一下上面的代码在做什么(特别是&#39; $ query。=&#39;部分),以及我如何更改它以便通配符功能可以工作吗?谢谢! (另外,我在列标题上遗漏了一些html代码,因为它们并不相关)。

3 个答案:

答案 0 :(得分:0)

如果$ _GET [&#39; DATA1&#39;]或$ _GET [&#39; DATA2&#39;]不为空,则代码会将where 1=1附加到$ query。如果$ _GET [&#39; DATA1&#39;]不为空,则会附加and DATA1A = "XXX"。 (其中XXX是$ _GET [&#39; DATA1&#39;]的内容)。同样适用于$ _GET [&#39; DATA2&#39;]。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

此代码仅搜索包含确切单词的记录,因为它使用比较操作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>";
}
?>

我没试过,但它应该有效