これが私の試みです:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
私が投稿した直後にそれを理解しました:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));
while ($results = $query->fetch())
{
echo $results['column'];
}
名前付きパラメーターを使用する場合、 MySQL データベースの部分一致で使用LIKE
する方法は次のとおりです。%
WHERE column_name LIKE CONCAT('%', :dangerousstring, '%')
名前付きパラメーターは:dangerousstring
です。
%
つまり、ユーザー入力ではなく、分離された独自のクエリで明示的にエスケープされていない記号を使用します。
編集: Oracle データベースの連結構文は、連結演算子:||
を使用するため、単純に次のようになります。
WHERE column_name LIKE '%' || :dangerousstring || '%'
ただし、@bobince がここで言及しているように、注意事項があります。
問題は 、ワイルドカードとして機能させずに、検索文字列でリテラル
%
または文字 を許可したい場合です。_
そのため、like とパラメーター化を組み合わせるときに注意すべき点がもう 1 つあります。
$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';
}
これを試すこともできます。私は同様の問題に直面していますが、研究の結果を得ました。
$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);
私はphp妄想からこれを得ました
$search = "%$search%";
$stmt = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();
そして、それは私にとっては非常に簡単です。彼が言うように、クエリに送信する前に「完全なリテラルを最初に準備する」必要があります
PDO は "%" をエスケープします (SQL インジェクションにつながる可能性があります) : 前のコードを使用すると、部分的な文字列の一致を探すときに望ましい結果が得られますが、訪問者が文字 "%" を入力すると、入力しなくても結果が得られます。データベースに何かが保存されている (SQL インジェクションを引き起こす可能性がある)
私は多くのバリエーションを試しましたが、すべて同じ結果で、PDO は望ましくない/興奮しない検索結果の先頭にある "%" をエスケープしています。
誰かがその周りの言葉を見つけたら共有する価値がありましたが、共有してください
これを機能させる唯一の方法は、 %$search% を別の変数に入れることでした。
if(isset($_POST['submit-search'])){
$search = $_POST['search'];
}
$query = 'SELECT * FROM posts WHERE post_title LIKE :search';
$value ="%$search%";
$stmt= $pdo->prepare($query);
$stmt->execute(array(':search' => $value));
私が使用したwhileループで、これが最善の方法であるかどうかはわかりません:
while ($r = $stmt->fetch(PDO::FETCH_ASSOC)){