1

だから私はを使って挿入をしmysql_real_escape_string ましたが、今はそれらのレコードの「いいね」検索を行う方法を理解できないようです...

どんな助けでもいただければ幸いです。多分これを行うためのより良い方法がありますか?

とても簡単な例は次のようになります:

DBレコードにはfoo'バーがあります。

今、私はfoobarまたはfoo'barを同様に検索したいのですが、mysqlエラーが発生し続けます。

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

また、テーブルのレコードが「foo'bar」に設定されているかどうかを知りたいのですが、LIKEで「foobar」だけを検索するにはどうすればよいですか。

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() ); 

ただし、PHPで廃止されたmysql拡張機能の代わりにPDOの使用を開始する必要があります。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%'

SQLLIKE述語は全文検索ではないことを理解する必要があります。空白や句読点など、パターン文字列内の文字のシーケンスのみを検索します。これらの余分な文字を使用しない場合、それらの文字を含むデータは一致しません。


PS:LIKE '%word%'パターンを使用しているので、データが大きくなるにつれてこれは非常に遅くなることに注意する必要があります。私のプレゼンテーション全文検索スローダウンを参照してください。

于 2012-11-10T04:13:03.047 に答える
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']; 
} 
于 2012-11-10T04:22:10.900 に答える