-2

PHP で PDO 経由で SQL Server DB に接続しています。私の質問は、while ループが実行されるたびにパラメーターを名前付きプレース マーカーにバインドできないのはなぜですか? コードは次のとおりです。

    public function search($search, $field)
{
    $c = new PDO("sqlsrv:Server=localhost;Database=$this->_db", $this->_user, $this->_pass);

    $sql = "
    SELECT Title 
    FROM Table WHERE 1=1"; 
    //form array of search terms stored in serachArray variable
    $searchArray = explode(' ', $search );
    //count objects in array
    $num_search_terms = count( $searchArray );
    $i = 0;//for search term array (starts at 0)
    $x = 1;//for parameter incrementin (starts at 1)
    while( $i <= ( $num_search_terms -1 ) )
    {
        $sql .= "
        AND $field LIKE :s".$x;
        $stmt = $c->prepare( $sql );

        $currTerm = "%" . $searchArray[ $i ] . "%";

        $stmt->bindParam( ':s'.$x, $currTerm );         

        $i++;
        $x++;
    }

    $stmt->execute();

    while ( $row = $stmt->fetch( PDO::FETCH_OBJ ) )
    {
       print $row->Title;
    }
}

結果セットはエラーなしで空を返しています。この検索から返されるデータが必ずあるはずです。検索語を 1 つだけ入力すると、問題なく動作します。ただし、複数入力すると、常に結果が得られません。

4

1 に答える 1

6

ループ内で各不完全なクエリ フラグメントを準備しています。一度だけ準備し、完全なSQL クエリを準備する必要があります。

更新:ドキュメントをどこで探したかわかりませんが、bindParam()マニュアル ページにはいくつかの例があります。

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

ループ内でこれを行うと、何も役に立ちません。

$stmt->bindParam( ':s'.$x, $currTerm );  

...しかし、$stmt直前に新しいオブジェクトを削除して作成します。

于 2012-12-04T15:53:36.777 に答える