2012-12-04 45 views
-2

我通過PHP中的PDO連接到SQL Server數據庫。我的問題是爲什麼每次while循環運行時都不能將參數綁定到指定的位置標記?以下是代碼:PDO BindParam不會在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; 
    } 
} 

結果集返回時爲空而沒有錯誤。肯定應該有這個搜索返回的數據。當我只輸入一個搜索詞時,它工作正常。但是,當我輸入一個以上時,我總是得不到結果。

+3

你錯了。你應該建立完整的查詢字符串,然後綁定參數。 –

回答

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對象。

+0

謝謝。那麼我可以一次綁定多個參數嗎?我正在努力尋找這方面的文件... –

+0

哦,對,我看到的是,但我不想單獨寫出每一個。無論如何循環它找到所有參數並自動執行它?所以它可以自動做':s1',$ s1等? –

+0

您必須調用'PDO :: prepare' * once *創建一個*'PDOStatement'對象,並且它們將所有*您的參數綁定到該唯一對象。我的印象是我沒有被理解。我的解釋中有沒有特定的部分可以改進? –