J'insère des données dans la table personnalisée à l'aide du $wpdb->insert
. Cependant, en cas d'erreur, il semble que je ne reçois aucune information de $wpdb->last_error
. Quelle pourrait en être la cause?
J'ai déjà cette configuration définie dans wp-config
define('WP_DEBUG', false);
define('SAVEQUERIES', true);
Le code est comme ci-dessous:
$result = $wpdb->insert($this->table, $data_);
if (false === $result) {
error_log($wpdb->last_error);
}
$this->table
et $data_
sont remplis correctement car ils fonctionnent correctement. Mais je ne semble pas avoir aucune information sur la requête qui a échoué. Existe-t-il un moyen d'obtenir la requête exécutée dans $wpdb->insert
?
Solution
OK alors j'ai compris le problème. La requête d'insertion échouait car l'une des données de colonne était énorme et dépassait la taille de colonne de la base de données. La colonne était varchar(500)
mais les données réelles contenaient plus de 500 caractères, échouant ainsi la requête. J'ai changé la colonne en TEXT
et l'insertion a réussi sans erreur.
essaye ça
$wpdb->show_errors();
$result = $wpdb->insert($this->table, $data_);
Si vous voulez le query , ce sera $wpdb->last_query
(notez que vous n'avez pas non plus besoin de SAVEQUERIES
, c'est seulement si vous voulez un journal de every query ($wpdb->queries
)
last_error
est ... eh bien, l'erreur!
Mise à jour: Explication possible pour que last_error
soit vide - il s'agit de la source de wpdb::query()
:
// If we're writing to the database, make sure the query will write safely.
if ( $this->check_current_query && ! $this->check_ascii( $query ) ) {
$stripped_query = $this->strip_invalid_text_from_query( $query );
// strip_invalid_text_from_query() can perform queries, so we need
// to flush again, just to make sure everything is clear.
$this->flush();
if ( $stripped_query !== $query ) {
$this->insert_id = 0;
return false;
}
}
// Redacted code
// Keep track of the last query for debug..
$this->last_query = $query;
$this->_do_query( $query );
// Redacted code
// If there is an error then take note of it..
if ( $this->use_mysqli ) {
$this->last_error = mysqli_error( $this->dbh );
} else {
$this->last_error = mysql_error( $this->dbh );
}
En d'autres termes, WordPress semble vérifier la requête de manière préemptive et abandonnera s'il estime que cela échouera - dans ce cas, vous obtenez votre return false
mais aucune erreur ne sera définie (car elle n'a jamais été envoyée au serveur MySQL).
https://core.trac.wordpress.org/ticket/32315
Une des entrées de colonnes peut être plus grande que la colonne. Wordpress le détecte et n'envoie même pas la requête à la base de données.
Le Diff affiche un correctif pour wp-db que vous pouvez insérer pour obtenir plus d’informations dans le message last_error afin qu’il ne soit pas vide.