web-dev-qa-db-fra.com

$ wpdb-> last_error n'affiche pas la requête en cas d'erreur

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.

1
Ghazanfar Mir

essaye ça

$wpdb->show_errors();
$result = $wpdb->insert($this->table, $data_);
1
user5200704

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

0
TheDeadMedic

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.

 enter image description here 

0
Liam Mitchell