当用真正的转义字符串插入记录值时,mysql查询搜索

时间:2012-11-10 04:11:13

标签: php mysql

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

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

这么简单的例子就是:

数据库记录中的

有foo'bar。

现在我想搜索foo bar或foo'bar as like但我一直收到mysql错误。

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

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

2 个答案:

答案 0 :(得分: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() ); 

但是你应该开始在PHP中使用PDO而不是弃用的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%'模式,因此您应该意识到,随着数据的增长,这将非常缓慢。请参阅我的演示文稿Full Text Search Throwdown

答案 1 :(得分:0)

Nooooooooo!不要使用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']; 
}