120

これが私の試みです:

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

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

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

9 に答える 9

136

私が投稿した直後にそれを理解しました:

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

while ($results = $query->fetch())
{
    echo $results['column'];
}
于 2009-02-24T20:04:19.240 に答える
100

名前付きパラメーターを使用する場合、 MySQL データベースの部分一致で使用LIKEする方法は次のとおりです。%

WHERE column_name LIKE CONCAT('%', :dangerousstring, '%')

名前付きパラメーターは:dangerousstringです。

%つまり、ユーザー入力ではなく、分離された独自のクエリで明示的にエスケープされていない記号を使用します。

編集: Oracle データベースの連結構文は、連結演算子:||を使用するため、単純に次のようになります。

WHERE column_name LIKE '%' || :dangerousstring || '%'

ただし、@bobince がここで言及しているように、注意事項があります。

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

そのため、like とパラメーター化を組み合わせるときに注意すべき点がもう 1 つあります。

于 2011-09-09T04:54:27.243 に答える
20
$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';
}
于 2012-09-14T16:54:02.757 に答える
17

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

$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);
于 2015-08-05T11:10:53.000 に答える
2

私はphp妄想からこれを得ました

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

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

于 2019-07-15T13:16:24.807 に答える
0

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

私は多くのバリエーションを試しましたが、すべて同じ結果で、PDO は望ましくない/興奮しない検索結果の先頭にある "%" をエスケープしています。

誰かがその周りの言葉を見つけたら共有する価値がありましたが、共有してください

于 2015-09-27T00:39:12.647 に答える
-2

これを機能させる唯一の方法は、 %$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)){
于 2022-01-17T01:26:24.663 に答える