web-dev-qa-db-ja.com

LIKEステートメントを使用してPDOパラメーター化クエリを作成するにはどうすればよいですか?

これが私の試みです:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');

$query->execute(array('value'));

while ($results = $query->fetch()) 
{
    echo $results['column'];
}
99

私が投稿した直後にそれを考え出した:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));

while ($results = $query->fetch())
{
    echo $results['column'];
}
121

Likeを%部分一致で使用するには、次のようにすることもできます:column like concat('%', :dangerousstring, '%') with named parameter :dangerousstring。言い換えれば、独自のクエリで明示的にエスケープされていない%記号を使用します。これらは分離されており、ユーザー入力ではありません。

Edit:私が見つけた別の連結構文は、連結演算子を使用することです:||、それは単純になります:where column like '%' || :dangerousstring || '%' etc

@bobinceは here に言及しています:

difficulty は、ワイルドカードとして機能させずに、検索文字列にリテラル%または_文字を許可する場合に使用されます。

そのため、likeとパラメーター化を組み合わせる際には注意が必要です。

74
Kzqai
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1, "%$value%", PDO::PARAM_STR);
$query->execute();

if (!$query->rowCount() == 0) 
{
    while ($results = $query->fetch()) 
    {
        echo $results['column'] . "<br />\n";
    }       
} 
else 
{
    echo 'Nothing found';
}
17
Blazer

これを試すこともできます。私は同様の問題に直面していますが、研究後に結果を得ました。

$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');

$stmt= $pdo_connection->prepare($query);

$stmt->execute(array(':search' => '%'.$search_term.'%'));

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($result);
10

これは動作します:

search `table` where `column` like concat('%', :column, '%')
4
kjdion84

これは php delusions から取得しました

$search = "%$search%";
$stmt  = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();

そしてそれは私にとっては非常に簡単に機能します。彼が言うように、クエリに送信する前に、「完全なリテラルを最初に準備する」必要があります

1
gavin

PDOは「%」をエスケープします(SQLインジェクションにつながる可能性があります):前のコードを使用すると、部分的な文字列に一致するように見えるときに希望する結果が得られます[〜#〜] but [〜# 〜]訪問者が文字「%」を入力すると、データベースに何も保存されていなくても結果が得られます(SQLインジェクションを引き起こす可能性があります)

多くのバリエーションを試してみましたが、すべて同じ結果で、PDOは「%」をエスケープして、不要な/不要な検索結果を導きます。

誰かがその周りにWordを見つけたら共有する価値があったが、それを共有してください

0
Ozkar R

クエリではなくPHPでそれをしたい場合

$string = 'this is a string';
$len = strlen($string);
$first = substr_replace($string, '%', 0,0); // insert % before the first character
$string = substr_replace($first, '%', $len+1,0); // insert % after the last one

$stringの値は'%this is a string%'

私はそれから関数を作り、私の好きなステートメントにそれを使用します

0
Samuel Gfeller