PDO xatosi: SQLSTATE [HY000]: Umumiy xato: 2031

Men bu zerikarli xatoni qabul qilyapman va garchi men uni nima uchun olganimni bilsam-da, hayotim uchun bu yechim topa olmayman.

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);

So'rovda joy egalari (: placeholder ) mavjud. Biroq, o'sha LIMIT plombalarning qo'shish uchun men qo'lda usulni ( bindValue ) ishlatishim kerak, chunki aks holda ular datchiklari ularni stragarlarga aylantiradi.

Men xato parametrlari noto'g'ri sonini topolmayapman, shuning uchun barcha joylar to'g'ri qo'yilgan (menimcha).

So'rov:

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

Barcha to'ldiriladigan qiymatlar $ mezonida joylashgan bo'lib, oxirgi ikki LIMITdan tashqari, qo'l bilan bindValue() bilan bog'lanadi.

17
1) Faqat shifrlangan kod o'rniga inson tomonidan o'qilishi mumkin bo'lgan xato xabari qo'shish yaxshi bo'lar edi, 2) Sizning haqiqiy so'rovingizni ko'rsating, shuning uchun xatolik qayerdan kelib chiqqanini bilib olamiz.
qo'shib qo'ydi muallif deceze, manba
: strong ga bog'langan ishonchingiz komilmi? Albatta $ limit haqiqatmi?
qo'shib qo'ydi muallif deceze, manba
@deceze Agar u erda inson tomonidan o'qib eshittiriladigan xabarlar bo'lsa edi, men bo'lar edim: a) ehtimol, hozircha hal qilindi; b) agar bo'lmasa, bu yerga shu jumladan. Bu to'liq xato xabar edi, menga ishoning.
qo'shib qo'ydi muallif silkfire, manba
@davidstrachan Nima uchun mening PHP versiyam "odamlarga o'qilishi mumkin xato xabari" ni qaytarmasligini bilasizmi?
qo'shib qo'ydi muallif silkfire, manba
@deceze Ha, $ criteria faqat bitta qiymatdan iborat: 'strength' => string '1g' (long = 2)
qo'shib qo'ydi muallif silkfire, manba
Google'da "PDO majburiy LIMIT parametrlari" da qidirishga harakat qiling
qo'shib qo'ydi muallif Royal Bg, manba
Xato: 2031 (CR_PARAMS_NOT_BOUND) Xabar: tayyorlangan bayonotda parametrlar uchun ma'lumot berilmadi. Hujjatlar dev.mysql.com/doc/refman/5.0/en/error-messages-client.html
qo'shib qo'ydi muallif david strachan, manba

7 javoblar

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
qo'shib qo'ydi

Xuddi shu xato 2031 bir xil parametr nomi bilan bir xil bo'lgan ikkita qiymatni, masalan, quyidagi hollarda berilishi mumkin:

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

ehtiyot bo'ling.

18
qo'shib qo'ydi
Bu javob mening kunimni saqlab qoldi!
qo'shib qo'ydi muallif JWizard, manba

Bu istisno, shuningdek, masalan, qoidalar tayyorlash o'rniga to'ldirish egalari bilan so'rovni bajarishga harakat qilsangiz paydo bo'ladi

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

ning o'rniga

$stmt = $db->prepare('SELECT * FROM tbl WHERE ID > ?');
4
qo'shib qo'ydi

Qo'llanma dan:

Umumiy versiya PDOStatement :: execute ([array $ input_parameters])

     

Tayyorlangan bayonotni bajaring. Agar tayyorlangan bayonotga qo'shilsa   parametr markerlari uchun yoki bo'lishi kerak:

     
      
  • PDOStatement :: bindParam() funktsiyasini PHP parametrlarini parametr markerlariga bog'lash uchun chaqiring: bog'langan parametrlarga kirish qiymati sifatida   agar ular mavjud bo'lsa, ularning tegishli parametrlarini qabul qilish qiymatini qabul qilish   belgilar

  •   
  • yoki faqat kiritilgan parametr qiymatlari qatorini

  • ga o'tkazing   

Bir usulni tanlashingiz kerak. Ikkalasini ham aralashtirib bo'lmaydi.

3
qo'shib qo'ydi
Boshqa qiymatlar uchun bindParam / bindValue kodidan foydalana olmayman.
qo'shib qo'ydi muallif silkfire, manba
PDO :: ATTR_EMULATE_PREPARES, rost) - bu yoqish taqlid qilib tayyorlanmasligi kerak emasmi? O'ylaymanki, bu boshqa yo'ldir, lekin juda noto'g'ri.
qo'shib qo'ydi muallif silkfire, manba
qo'shib qo'ydi muallif Álvaro González, manba
@silkfire - Bu yozuvni aniqlab olish uchun, men uni tuzganman.
qo'shib qo'ydi muallif Álvaro González, manba
Qo'llanmani keltirayotganingiz uchun minnatdorman!
qo'shib qo'ydi muallif Mel_T, manba

Bu aniq javob emas, lekin bu xat, shuningdek, chiziqcha bilan so'zni joy egalari sifatida ishlatmoqchi bo'lsangiz ham bo'ladi, masalan:

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

Shunday qilib, yaxshiroq foydalaning

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

2
qo'shib qo'ydi

Istisno, shuningdek, (agar hech bo'lmasa MySQL/PDO-da) bo'lsa, SQL sizning AUTO_INCREMENT maydonini UPDATE qilishga urinadi.

1
qo'shib qo'ydi

Parametrlarni mos kelmasa, bu sodir bo'ladi. Misol uchun:

$q = $db->prepare("select :a, :b");
$q->execute([":a"=>"a"]);
0
qo'shib qo'ydi
PhP |BotsUz
PhP |BotsUz
93 ishtirokchilar

Phpni o'rganishni Hohlasangiz https://t.me/joinchat/AAAAAE-KRc5dd5tPMmGmWA A'zo bo'lin