Come ottenere i messaggi di errore quando $wpdb->insert() restituisce false?

23 ago 2017, 15:03:48
Visualizzazioni: 29.3K
Voti: 17

$wpdb->insert() restituisce false che significa che l'inserimento è fallito. Ora, vorrei sapere perché fallisce l'inserimento.

Secondo questo ticket https://core.trac.wordpress.org/ticket/32315 il problema potrebbe essere che il valore è troppo lungo o contiene caratteri non validi.

Ecco la query di inserimento:

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

È difficile mostrare i valori dell'array $ins_args poiché alcuni valori sono piuttosto lunghi. In particolare quello per il campo chiamato value. Ma uso il tipo longtext per quel campo. E questo inserimento viene utilizzato spesso. E nella maggior parte dei casi funziona con successo. Quindi sembra davvero un problema di codifica o dimensione.

Come posso scoprire qual è il problema? $wpdb->last_error è vuoto

10
Commenti

Controlla $wpdb->last_error per l'errore di inserimento

Anton Lukin Anton Lukin
23 ago 2017 15:06:35

@Anton Lukin Sì scusa avrei dovuto dirlo. L'ho ovviamente già provato ma è vuoto.

Peter Westerlund Peter Westerlund
23 ago 2017 15:14:34

Prova a fare debug. Usa $wpdb->last_query dopo l'inserimento, poi esegui questa query tramite client mysql per vedere l'errore. È possibile?

Anton Lukin Anton Lukin
23 ago 2017 15:17:51

@Anton Lukin Anche se l'ultima query è un insert(), il $wpdb->last_query subito dopo mostra una query SELECT * FROM .....

Peter Westerlund Peter Westerlund
23 ago 2017 15:31:23

Possiamo farcela :) aggiungi savequeries nel tuo wp-config.php https://wordpress.stackexchange.com/a/110270/126253

Anton Lukin Anton Lukin
23 ago 2017 15:34:17

@Anton Lukin Accidenti mi sono sbagliato sul valore di ritorno. Restituisce false, non 0. È un po' difficile ottenere le query nel footer visto che le mie operazioni vengono fatte con ajax. Ma ho provato a inserirlo dopo il codice nel php che viene chiamato da ajax. E poi l'ho chiamato dal browser. Ora ho scoperto che qualcosa si interrompe nel percorso, nel ciclo. Devo analizzare cosa succede. Ma è qualcosa che avviene dopo l'insert fallito. Quindi c'è ancora un problema lì. Ma è difficile da debugare.. Continuerò a provare...

Peter Westerlund Peter Westerlund
23 ago 2017 15:57:42

@Anton Lukin Ok, ora ho trovato la query. Quindi, apparentemente questo fallisce: [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 ago 2017 16:09:02

va bene avere doppio parent_id, parent_id nella tua query?

Anton Lukin Anton Lukin
23 ago 2017 16:12:13

@Anton Lukin Scusa è sbagliato, il secondo è parent_x_id. Volevo mantenerlo un po' segreto.

Peter Westerlund Peter Westerlund
23 ago 2017 16:15:45

Okay, sono riuscito a risolverlo sanificando l'url e il value con esc_url() e esc_html() prima dell'insert();. Comunque è un peccato che non ci siano messaggi di errore a riguardo...

Peter Westerlund Peter Westerlund
23 ago 2017 16:37:24
Mostra i restanti 5 commenti
Tutte le risposte alla domanda 2
3
18

Il metodo $wpdb->insert() restituisce false se la riga non può essere inserita. Altrimenti, restituisce il numero di righe interessate (che sarà sempre 1).

Puoi attivare e disattivare la visualizzazione degli errori rispettivamente con show_errors e hide_errors.

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

Puoi anche stampare l'errore (se presente) generato dalla query più recente con print_error.

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

Puoi anche utilizzare il campo $last_error, che conterrà il testo dell'errore più recente generato da MySQL.

22 gen 2019 13:18:56
Commenti

Sarebbe utile vedere un esempio del campo $last_error. È semplicemente $wpdb->last_error?

Simon East Simon East
23 gen 2019 07:07:02

Sì, esattamente $wpdb->last_error

Krzysiek Dróżdż Krzysiek Dróżdż
23 gen 2019 09:01:07

Nota che, se una scrittura viene interrotta perché una colonna è troppo lunga, non viene restituito alcun errore. Cioè, $wpdb->last_error sarà vuoto, e né $wpdb->show_errors()$wpdb->hide_errors() saranno d'aiuto. Vedi la mia risposta qui sotto per un modo per modificare questo comportamento.

Brian C Brian C
28 ago 2020 11:40:47
2

Sfortunatamente, wp-db.php restituisce false senza alcun errore, se i dati che si sta tentando di scrivere in una colonna sono troppo lunghi per essere contenuti. Questo diventa un incubo da debug senza verificare esplicitamente la lunghezza di ogni colonna (ed è difficile conoscere le lunghezze, anche se wp-db.php fornisce funzioni interne).

Ho creato un piccolo override drop-in che modifica il comportamento di wpdb per restituire un errore in questo scenario. Per installarlo, è sufficiente copiarlo e incollarlo nel file wp-content/db.php di WordPress. Sovrascrive solo un singolo, breve metodo di wpdb (process_fields()) per aggiungere un messaggio di errore che identifica la colonna troppo lunga. Nota che db.php sopravviverà agli aggiornamenti del core, e puoi semplicemente rimuovere il file wp-content/db.php in qualsiasi momento per tornare al wpdb core puro.

Anche se lo uso personalmente, come al solito, testa prima dell'uso e l'utilizzo è a tuo rischio e pericolo.

Il codice di errore è originariamente tratto da un'idea di Liam Murphy qui.

Gist per il drop-in db.php qui

28 ago 2020 11:37:14
Commenti

Finalmente risolto in WordPress v5.9. https://core.trac.wordpress.org/ticket/32315#comment:82

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

Finalmente!! Grazie.

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