2012-05-16 12 views
5

Mam problem wiązania LIMIT część zapytania SQL. Dzieje się tak, ponieważ zapytanie jest przekazywane jako ciąg znaków. Widziałem tutaj another Q, która zajmuje się parametrami wiązania, nic, co zajmuje się nazwanymi symbolami zastępczymi w tablicy.Ustawienie PDO/MySQL LIMIT z Nazwany Placeholder'ów

Oto mój kod:

public function getLatestWork($numberOfSlides, $type = 0) { 

$params = array(); 
$params["numberOfSlides"] = (int) trim($numberOfSlides); 
$params["type"] = $type; 

$STH = $this->_db->prepare("SELECT slideID 
    FROM slides 
    WHERE visible = 'true' 
     AND type = :type 
    ORDER BY order 
    LIMIT :numberOfSlides;"); 

$STH->execute($params); 

$result = $STH->fetchAll(PDO::FETCH_COLUMN); 

return $result;   
} 

Błąd Dostaję jest: Syntax error or access violation near ''20'' (20 jest wartością $numberOfSlides).

Jak mogę to naprawić?

+0

spróbuj $ params [ "numberOfSlides"] = (intval (przycinania ($ numberOfSlides)); dokładny –

+1

DUP http://stackoverflow.com/questions/10437423/how-can-i-pass-an -array-of-parametry PDO-jeszcze-jeszcze-ich-określ typy/10438026 # 10438026 – goat

Odpowiedz

9

Problemem jest to, że execute() quotes the numbers i traktuje jako ciągi:

z podręcznika - tablicę wartości z tak wielu elementów, jak istnieją powiązane parametry w wykonywanej instrukcji SQL. Wszystkie wartości są traktowane jako PDO :: PARAM_STR.

<?php 
public function getLatestWork($numberOfSlides=10, $type=0) { 

    $numberOfSlides = intval(trim($numberOfSlides)); 

    $STH = $this->_db->prepare("SELECT slideID 
           FROM slides 
           WHERE visible = 'true' 
           AND type = :type 
           ORDER BY order 
           LIMIT :numberOfSlides;"); 

    $STH->bindParam(':numberOfSlides', $numberOfSlides, PDO::PARAM_INT); 
    $STH->bindParam(':type', $type, PDO::PARAM_INT); 

    $STH->execute(); 
    $result = $STH->fetchAll(PDO::FETCH_COLUMN); 

    return $result; 
} 
?> 
+0

http://www.php.net/manual/en/pdostatement.execute.php#76966 –

+0

Dzięki za szczegółowe wyjaśnienie , ale teraz mam inny problem: 'ścisłe standardy: tylko zmienne powinny być przekazywane przez odniesienie' –

+0

Musiałem wziąć 'intval (trim ($ numberOfSlides))' z bindParam, teraz działa :) –

3

Sugeruję wiążące params i zmuszając ich typ:

$STH->bindParam(':numberOfSlides', $numberOfSlides, PDO::PARAM_INT); 
$STH->execute();