PDO қатесі: SQLSTATE [HY000]: Жалпы қателік: 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);

Сұрауда толтырғыштар бар (: толтырғыш ). Бірақ сол LIMIT толтырғыштарды қосу үшін маған қолмен әдіс ( bindValue ) керек, себебі басқаша оларды қозғалтқыш оларды жолға айналдырады.

Параметрлердің қате санының қатесін алудың қажеті жоқ, сондықтан барлық толтырғыштар дұрыс бекітілген (менің болжауымша).

Сұрау:

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

Барлық толтырғыштар мәндері bindValue() арқылы қолмен байланыстыратын соңғы екі LIMIT қоспағанда, $ критерийлерінде орналасады.

17
1) Тек криптиялық кодының орнына адамға оқуға болатын қате туралы хабарды қосу жақсы болар еді. 2) Қатенің қай жерден пайда болатындығын көру үшін нақты сұрауыңызды көрсетіңіз.
қосылды автор deceze, көзі
: күшіне қосыласыз ба? $ limit сөзсіз шынымен бе?
қосылды автор deceze, көзі
@deceze Егер адамда оқылатын хабар болған болса, онда мен: а) бәлкім, қазір шешілген болса, б) егер жоқ болса, онда оны осында енгізіңіз. Бұл толық қателік туралы хабар болды, маған сеніңіз.
қосылды автор silkfire, көзі
@davidstrachan PHP нұсқасының неге «адам оқи алатын қате туралы хабарды» қайтармайтынын білесіз бе?
қосылды автор silkfire, көзі
@deceze Иә, $ criteria тек бір мәнді қамтиды: 'strength' => string '1g' (length = 2)
қосылды автор silkfire, көзі
Google-де іздеуге тырысыңыз «PDO байланыстыратын LIMIT параметрлері»
қосылды автор Royal Bg, көзі
Қате: 2031 (CR_PARAMS_NOT_BOUND) Хабарлама: Дайындалған үзіндіде параметрлер үшін деректер жоқ Мәлімет dev.mysql.com/doc/refman/5.0/en/error-messages-client.html
қосылды автор david strachan, көзі

7 жауаптар

You cannot use ->bind* and ->execute($params). Use either or; if you pass parameters to execute(), those will make PDO forget the parameters already bound via ->bind*.

18
қосылды

Осындай қате 2031 бірдей параметр атауы бар екі мәнді байланыстыру кезінде шығарылуы мүмкін, мысалы:

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

сақ болыңыз.

18
қосылды
Бұл жауап менің күнімді сақтады!
қосылды автор JWizard, көзі

Бұл ерекшелік, егер сіз сұранымды толтырғыштармен орындауға тырыссаңыз, пайда болады

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

орнына

$stmt = $db->prepare('SELECT * FROM tbl WHERE ID > ?');
4
қосылды

Қолмен бөлімінен:

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

Сізге әдісті таңдау керек. Сіз екеуін де араластыра алмайсыз.

3
қосылды
Басқа мәндер үшін bindParam / bindValue пайдалану мүмкін емес ... ауырады.
қосылды автор silkfire, көзі
PDO :: ATTR_EMULATE_PREPARES, шын) - бұл қосу эмуляцияға дайындалу керек емес пе? Менің ойымша, бұл басқаша, бірақ өте адастырады.
қосылды автор silkfire, көзі
@silkfire қараңыз stackoverflow.com/questions/10014147/… .
қосылды автор Álvaro González, көзі
@silkfire - Міндетті жазу үшін, мен оны жай ғана бекітіп қойдым.
қосылды автор Álvaro González, көзі
Мен нұсқаулықты келтіргеніңізге ризамын!
қосылды автор Mel_T, көзі

Бұл нақты жауап емес, бірақ бұл қате, мысалы, сызықшамен сөзді толтырғыш ретінде пайдалануға тырыссаңыз, мысалы:

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

Жақсы пайдалану

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

2
қосылды

Сондай-ақ, сіздің SQL сіздің AUTO_INCREMENT өрісін UPDATE-ға талпындыра бастаған кезде (ең болмағанда MySQL/PDO-да) орын алады.

1
қосылды

Бұл параметрлерге сәйкес келмеген жағдайда орын алады. Мысалға:

$q = $db->prepare("select :a, :b");
$q->execute([":a"=>"a"]);
0
қосылды