2012-03-12 44 views
4

我試圖用這個分頁功能基本搜索:PDO混合無名和命名參數

$construct = '? AND ? AND..'; 

$query = $database->prepare('SELECT * FROM something WHERE something LIKE ' . $construct . ' LIMIT :offset, :results'); 

我將它們混合的唯一原因是因爲未命名參數不能因爲INT值一個PHP的bug顯然是:https://bugs.php.net/bug.php?id=44639

但是,如果我不混合他們,我怎麼能使用綁定搜索可變數量的術語?

更新

與它玩弄後,我解決了它或多或少使用命名參數和一些循環:

// build prepared statement 
    $construct = ''; 
    for ($x = 0; $x <= $searchArrayCount; $x++) { 
     $construct .= ($x < $searchArrayCount) 
        ? ":var$x OR name LIKE " 
        : ":var$x LIMIT :start, :perPage"; 
    } 

    $query = $database->prepare('SELECT something FROM something WHERE name LIKE ' . $construct); 

    // bind parameters 
    for ($x = 0; $x <= $searchArrayCount; $x++) { 
     $searchArray[$x] = "%$searchArray[$x]%"; 
     $query->bindParam(":var$x", $searchArray[$x]); 
    } 

    $query->bindParam(':start', $searchArrayCount, PDO::PARAM_INT); 
    $query->bindParam(':perPage', $perPage, PDO::PARAM_INT); 

如果有要去這個我喜歡一個更優化的方式被告知。

回答

0

面對類似的問題,到底我只是跳過LIMIT子句中綁定參數:

sprintf('LIMIT %d, %d', $offset, $size); 

另一個解決方法(如果您的系統支持的話)是切換到本地參數綁定。顯然,仿真層是展現此行爲的仿真層:

$database->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); 
1

未命名的參數可以具有int值。只需在綁定函數中定義顯式類型。

變量數據類型可能存在問題。之前使用intval()函數是很好的。

您在未命名的數據類型的解決方案可以是這樣的:

$counter = 0; 

//build prepared statement 

$query = $database->prepare('SELECT something FROM something WHERE 0 OR '. 
implode(' OR ', array_fill(0 , $searchArrayCount, 'name LIKE ?')). 
     ' LIMIT ?, ?'); 

// bind parameters 
foreach($searchArray as $value) 
{ 
    $counter++; 
    $query->bindValue($counter, ('%'.$value.'%'), PDO::PARAM_STR); 
} 

$query->bindValue(($counter+1), ($page*$perPage), PDO::PARAM_INT); 
$query->bindParam(($counter+2), $perPage, PDO::PARAM_INT); 

注意我用,而bindValue()bindParam()之前。 並注意從LIMIT的第一個參數。如果計數將在這裏,則選擇將在數據的末尾開始,並且不會返回任何行。