Come ottenere i messaggi di errore quando $wpdb->insert() restituisce false?
$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
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.

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

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()
né $wpdb->hide_errors()
saranno d'aiuto. Vedi la mia risposta qui sotto per un modo per modificare questo comportamento.

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.

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