1

所以我已经完成了插入,mysql_real_escape_string 但现在我似乎无法弄清楚如何对这些记录进行“喜欢”搜索......

任何帮助,将不胜感激。也许有更好的方法来做到这一点?

如此简单的例子是:

在数据库记录中有 foo' 栏。

现在我想搜索 foo bar 或 foo' bar 一样,但我不断收到 mysql 错误。

$term = "foo' bar";
$sql = mysql_query("SELECT * FROM artists WHERE artist_name LIKE '%$term%'") or die ( mysql_error() ); 

还想知道表中的记录是否设置为“foo' bar”如何在 LIKE 中仅搜索“foo bar”

4

2 回答 2

2
$term = "foo' bar";
$term_escaped = mysql_real_escape_string($term);
$sql = mysql_query("SELECT * FROM artists WHERE artist_name LIKE '%$term_escaped%'") or die ( mysql_error() ); 

但是您应该开始使用 PDO 而不是 PHP 中已弃用的 mysql 扩展。当您将查询参数与 PDO 一起使用时,您不需要转义值:

$term = "foo' bar";
$stmt = $pdo->prepare("SELECT * FROM artists WHERE artist_name LIKE CONCAT('%',?,'%')");
if ($stmt === false) {
    die(print_r($pdo->errorInfo(), true));
}
if ($stmt->execute(array($term)) === false) {
    die(print_r($stmt->errorInfo(), true));
}

重新更新您的问题:

听起来您问的是与原始问题相反的问题,即你们中的一些数据包含文字单引号字符,并且您想要搜索没有引号字符的匹配项。

只是不要在使用 LIKE 搜索的模式中使用引号字符。

WHERE artist_name LIKE '%foo bar%'

您应该了解 SQL LIKE 谓词不是全文搜索。它只搜索您的模式字符串中的字符序列,包括空格和标点符号等。如果您不使用这些额外字符,则包含这些字符的数据将不匹配。


PS:由于您正在使用该LIKE '%word%'模式,因此您应该知道随着数据的增长,这将非常缓慢。请参阅我的演示文稿全文搜索Throwdown

于 2012-11-10T04:13:03.047 回答
0

呜呜呜!不要使用mysql。使用 pdo。

require_once('../php_custom_classes/database.php');

$testObj = new Database();
$newObj = new PDO("mysql:host=".$this->hostName.";dbname=".$this->dbName, $this->username, $this->password);


$term = 'foo bar';
$sql = "SELECT * FROM artists WHERE artist_name LIKE '%$term%'";
$stmt = $newObj->prepare($sql);
$stmt->execute();
while($row = $stmt->fetch()) { 
    echo $row['article_id']; 
} 
于 2012-11-10T04:22:10.900 回答