【问题标题】:Search - SQL statement搜索 - SQL 语句
【发布时间】:2011-12-06 22:53:53
【问题描述】:

我正在尝试编写搜索函数,它从用户那里获取其参数并使用 SQL 语句从 MySQL 数据库中获取结果。

声明:

$title = $_GET['title'];    
$result = mysql_query("SELECT name, phone, email from person where name= '$title'");

这个语句的问题是它只取了确切的名字;如果用户正在寻找“David”并且只输入“Da”,则不会找到任何结果。

我需要一个语句,当用户输入部分名称时,显示所有与“Da”匹配的内容。

【问题讨论】:

  • 请让您的帖子标题描述问题。
  • 请不要让您的代码保持原样。您至少必须对输入进行转义,最好使用参数化查询。

标签: php sql search


【解决方案1】:

您可以尝试通配符搜索,这不是最佳的,但应该可以:

$title = mysql_real_escape_string($_GET['title']);
$result = mysql_query("SELECT name, phone, email from person where name like '$title%'");

【讨论】:

  • 这只检查$title之后的通配符
  • @Jon:实际上它甚至没有这样做。
  • @Jon: OP 提到“如果用户查找“David”并且只输入“Da”,则将找不到结果!当用户输入部分名称时,我需要一个语句显示语句所有与“Da”匹配,所以我认为他只会在标题之后使用通配符,而不是之前。
  • @TomalakGeret'kal:错过了引述,Ash 已更正(感谢 Ash)。
【解决方案2】:

使用LIKE 条件

SELECT name, phone, email
FROM person
WHERE name LIKE '%$title%'

这会在name 中的任何位置搜索$title

【讨论】:

  • @Reem:为了记录,此查询将返回标题之前 AND 之后的所有匹配项。因此,如果搜索“da”,则要返回的行将包括“david”和“tada”。
  • @DigitalPrecision - 这就是我想要的,但感谢警告 OP。
  • @DigitalPrecision 感谢您的关注,声明已按照您的建议编辑
【解决方案3】:

使用 PDO 防止 SQL 注入攻击。 Read it,学习它,编码它,生活它。

您需要使用通配符 - %

<?php

$dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx', $user, $pass );

$sql = "SELECT name, phone, email from person where name LIKE :username";
$sth = $dbh->prepare( $sql );
$sth->bindValue( ':username', '%' . $_GET['title'] . '%', PDO::PARAM_STR );

$sth->execute();
$result = $sth->fetchAll( PDO::FETCH_OBJ );

print_r( $result );

【讨论】:

  • 这不会逃脱通配符吗?
  • 这正是我在生产代码中执行搜索功能的方式 - 通过将通配符绑定为值的一部分。
  • @TimG:这正是我的方式,通配符将连接到标题,而不是标题的一部分,但我很快得到了纠正。如果它适用于您的场景,这应该是 imo 的方式。然而,OP 确实声明他正在使用 mysql 程序调用,因此他切换到 PDO 的机会是有限的。
  • 说服人们转换是值得的——这很重要。 SQL 注入是一个巨大的问题,忽略它只会让情况变得更糟。您的查询,正如您发布的那样,在刻度线之外有通配符 - 这是不正确的。使用参数化查询时,无需担心刻度线 - 这是一个绑定参数。
【解决方案4】:

我建议你阅读这篇文章,它会对你有用:

http://www.w3schools.com/sql/sql_wildcards.asp

【讨论】:

  • w3schools 链接在 SO 上不受欢迎。技术有效性通常是low,并且已经被googlespamed。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
相关资源
最近更新 更多