2013-06-24 28 views
15

Otrzymuję ten denerwujący błąd i chociaż mam pomysł, dlaczego go otrzymuję, nie mogę na całe życie znaleźć dla niego rozwiązania .Błąd PDO: SQLSTATE [HY000]: Ogólny błąd: 2031

if ($limit) { 
    $sth->bindValue(':page', $page - 1, PDO::PARAM_INT); 
    $sth->bindValue(':entries_per_page', $page * $entries_per_page, PDO::PARAM_INT); 
} 

$sth->execute($criteria); 

Zapytanie zawiera symbole zastępcze (:placeholder). Ale aby dodać te symbole zastępcze LIMIT, muszę użyć metody ręcznej (bindValue), ponieważ w przeciwnym razie silnik zamieni je w łańcuchy.

Nie otrzymuję błędu Nieprawidłowa liczba parametrów, więc wszystkie symbole zastępcze zostały poprawnie powiązane (zakładam).

Zapytanie:

SELECT `articles`.*, `regional_municipalities`.`name` AS `regional_municipality_name`, 
     `_atc_codes`.`code` AS `atc_code`, `_atc_codes`.`name` AS `substance` 
FROM `articles` 
LEFT JOIN `_atc_codes` 
ON (`_atc_codes`.`id` = `articles`.`atc_code`) 
JOIN `regional_municipalities` 
ON (`regional_municipalities`.`id` = `articles`.`regional_municipality`) 
WHERE TRUE AND `articles`.`strength` = :strength 
GROUP BY `articles`.`id` 
ORDER BY `articles`.`id` 
LIMIT :page, :entries_per_page 

Wszystkie wartości zastępcze znajdują się w kryteriach $, z wyjątkiem dwóch ostatnich krańcowe, które wiążą się z ręcznie bindValue().

+1

spróbować wyszukiwanie w google „PDO wiążące parametry Limit” –

+0

1) To byłoby miło obejmują ludzką czytelny komunikat o błędzie, a nie tylko z tajemniczym kodem, 2) Pokaż aktualną kwerendę tak możemy zobaczyć, skąd bierze się błąd. – deceze

+0

@deceze Jeśli istniała tam jakaś ludzka czytelna wiadomość, powinienem: a) prawdopodobnie rozwiązać ją do tej pory, b) jeśli nie, to ją tutaj zawarłem. To był pełny komunikat o błędzie, zaufaj mi. – silkfire

Odpowiedz

17

Nie można używać ->bind*i->execute($params). Użyj albo; jeśli przekażesz parametry do execute(), spowoduje to, że PDO zapomni parametry już powiązane przez ->bind*.

3

Od the manual:

public bool PDOStatement::execute ([ array $input_parameters ])

Execute the prepared statement. If the prepared statement included parameter markers, you must either:

  • call PDOStatement::bindParam() to bind PHP variables to the parameter markers: bound variables pass their value as input and receive the output value, if any, of their associated parameter markers

  • or pass an array of input-only parameter values

Musisz wybrać metodę. Nie można mieszać obu.

+0

Nie mogę użyć' bindParam'/'bindValue' dla innych wartości ... westchnienie. – silkfire

+0

@silkfire Zobacz http://stackoverflow.com/questions/10014147/limit-keyword-on-mysql-with-prepared-statement-maybe-still-a-bug/10014200#10014200 dla innych pomysłów. –

+0

'PDO :: ATTR_EMULATE_PREPARES, true)' - czy nie powinno to ** włączyć ** emulowanych przygotowań? Myślę, że jest odwrotnie, bardzo myląca. – silkfire

13

ten sam błąd 2031 może być wydane, gdy jeden wiążą dwie wartości o tej samej nazwie, jak w parametrze:

  • $sth->bindValue(':colour', 'blue');
  • $sth->bindValue(':colour', 'red');

..so, uważaj.

+0

Ta odpowiedź uratowała mój dzień! – JWizard

2

Wyjątek ten pojawia się również w przypadku próby uruchomienia kwerendy zastępcze zamiast przygotowuje statment takich jak

$stmt = $db->query('SELECT * FROM tbl WHERE ID > ?'); 

zamiast

$stmt = $db->prepare('SELECT * FROM tbl WHERE ID > ?'); 
-1

Wyjątkiem zdarza się również (przynajmniej w MySQL/PDO), gdy twój SQL próbuje ZAKTUALIZOWAĆ pole AUTO_INCREMENT.

2

To nie dokładnie odpowiedź, ale ten błąd ma miejsce również wtedy, gdy spróbujesz użyć słowa z myślnikiem jako zastępcze, na przykład:

$sth->bindValue(':page-1', $page1);

Więc lepiej wykorzystywać

$sth->bindValue(':page_1', $page1);

0

Dzieje się tak, jeśli masz niedopasowane parametry.Na przykład:

$q = $db->prepare("select :a, :b"); 
$q->execute([":a"=>"a"]); 
Powiązane problemy