Cum obții mesajele de eroare când $wpdb->insert() returnează false?

23 aug. 2017, 15:03:48
Vizualizări: 29.3K
Voturi: 17

$wpdb->insert() returnează false, ceea ce înseamnă că inserarea a eșuat. Acum, aș dori să știu de ce eșuează inserarea.

Conform acestui tichet https://core.trac.wordpress.org/ticket/32315 problema ar putea fi că valoarea este fie prea lungă, fie conține caractere invalide.

Iată interogarea de inserare:

$result = $wpdb->insert('table', $ins_args, array('%d', '%d', '%s', '%s', '%s', '%s'));

Este dificil să arăt valorile array-ului $ins_args deoarece unele valori sunt destul de lungi. În special cea pentru câmpul numit value. Dar folosesc tipul longtext pentru acel câmp. Și această inserare este folosită frecvent. Și de cele mai multe ori funcționează cu succes. Deci pare într-adevăr o problemă de codare sau dimensiune.

Cum pot afla care este problema? $wpdb->last_error este gol

10
Comentarii

Verifică $wpdb->last_error pentru eroare la inserare

Anton Lukin Anton Lukin
23 aug. 2017 15:06:35

@Anton Lukin Da, scuze, trebuia să menționez asta. Am încercat desigur dar este gol.

Peter Westerlund Peter Westerlund
23 aug. 2017 15:14:34

Încearcă să depanezi. Folosește $wpdb->last_query după inserare, apoi rulează acest query prin clientul mysql pentru a vedea eroarea. Este posibil?

Anton Lukin Anton Lukin
23 aug. 2017 15:17:51

@Anton Lukin Chiar dacă ultima interogare este un insert(), $wpdb->last_query imediat după afișează o interogare de tip SELECT * FROM .....

Peter Westerlund Peter Westerlund
23 aug. 2017 15:31:23

Putem câștiga :) adaugă savequeries în wp-config.php https://wordpress.stackexchange.com/a/110270/126253

Anton Lukin Anton Lukin
23 aug. 2017 15:34:17

@Anton Lukin La naiba, am greșit cu return-ul. Returnează false, nu 0. E puțin dificil să obții interogările în footer deoarece operațiunile mele se fac cu ajax. Dar am încercat să le plasez după codul în php pe care îl apelează ajax. Și apoi l-am apelat din browser. Acum am descoperit că ceva se întrerupe pe parcurs, în buclă. Trebuie să analizez despre ce e vorba. Dar e ceva mai departe după insert-ul eșuat. Deci încă există o problemă acolo. Dar e greu de depanat... O să continui să încerc...

Peter Westerlund Peter Westerlund
23 aug. 2017 15:57:42

@Anton Lukin Bine, am găsit acum interogarea. Deci, se pare că aceasta eșuează: [75] => Array ( [0] => INSERT INTO results (parent_id, parent_id, key_code, value, url, cat_ids) VALUES (0, 7, 'posts', '', '', '') [1] => 0.0037600994110107 [2] => do_action('wp_ajax_my_save_result'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, my_save_result, pw_save, PW->save_result, PW->get_posts )

Peter Westerlund Peter Westerlund
23 aug. 2017 16:09:02

este ok dublul parent_id, parent_id în interogarea ta?

Anton Lukin Anton Lukin
23 aug. 2017 16:12:13

@Anton Lukin Scuze, asta e greșit, al doilea este parent_x_id. Vreau să-l fac un pic secret.

Peter Westerlund Peter Westerlund
23 aug. 2017 16:15:45

Bine, am reușit să o rezolv prin curățarea url și value cu esc_url() și esc_html() înainte de insert();. Totuși, e neplăcut că nu există mesaje de eroare despre asta...

Peter Westerlund Peter Westerlund
23 aug. 2017 16:37:24
Arată celelalte 5 comentarii
Toate răspunsurile la întrebare 2
3
18

Metoda $wpdb->insert() returnează false dacă rândul nu a putut fi inserat. În caz contrar, returnează numărul de rânduri afectate (care va fi întotdeauna 1).

Puteți activa sau dezactiva afișarea erorilor cu show_errors și hide_errors, respectiv.

<?php $wpdb->show_errors(); ?> 
<?php $wpdb->hide_errors(); ?> 

De asemenea, puteți afișa eroarea (dacă există) generată de cea mai recentă interogare cu print_error.

<?php $wpdb->print_error(); ?> 

Puteți folosi și câmpul $last_error, care va conține textul celei mai recente erori generate de MySQL.

22 ian. 2019 13:18:56
Comentarii

Ar fi bine să vedem un exemplu al câmpului $last_error. Este doar $wpdb->last_error?

Simon East Simon East
23 ian. 2019 07:07:02

Da, exact $wpdb->last_error

Krzysiek Dróżdż Krzysiek Dróżdż
23 ian. 2019 09:01:07

Rețineți că, dacă o scriere este întreruptă din cauza unei coloane prea lungi, nu este returnată nicio eroare. Adică, $wpdb->last_error va fi gol, iar nici $wpdb->show_errors() și nici $wpdb->hide_errors() nu vor ajuta. Consultați răspunsul meu de mai jos pentru o metodă de a modifica acest comportament.

Brian C Brian C
28 aug. 2020 11:40:47
2

Din păcate, wp-db.php returnează false fără nicio eroare, dacă datele pe care încercați să le scrieți într-o coloană sunt prea lungi pentru a încăpea. Acest lucru devine un coșmar de depanat fără a verifica în mod explicit lungimea fiecărei coloane (și este greu de știut lungimile, deși wp-db.php oferă funcții interne pentru aceasta).

Am creat o mică suprascriere care modifică comportamentul wpdb pentru a returna o eroare în acest scenariu. Pentru a o instala, trebuie doar să copiați și să lipiți codul în fișierul WordPress wp-content/db.php. Aceasta suprascrie doar o singură metodă scurtă din wpdb (process_fields()) pentru a adăuga un mesaj de eroare care identifică coloana care este prea lungă. Rețineți că db.php va supraviețui actualizărilor de nucleu și puteți elimina fișierul wp-content/db.php în orice moment pentru a reveni la wpdb original.

Deși folosesc acest lucru personal, ca de obicei, testați înainte de utilizare și folosirea este pe propria răspundere.

Codul de eroare este preluat inițial dintr-o idee a lui Liam Murphy aici.

Gist pentru drop in db.php aici

28 aug. 2020 11:37:14
Comentarii

În sfârșit rezolvat în WordPress v5.9. https://core.trac.wordpress.org/ticket/32315#comment:82

Bence Szalai Bence Szalai
9 feb. 2022 19:07:52

În sfârșit!! Mulțumesc.

Brian C Brian C
10 feb. 2022 04:54:08