$ wpdb n'insère pas NULL dans la colonne de la table

10

Quand j'essaie quelque chose comme ça

    $status = NULL;

    $wpdb->update(
            'table',
            array( 
                'status' => $status,
            ), 
            array( 'id' => 1 ) 
    );

Dans la colonne "status", j'ai maintenant une chaîne vide '' , elle ne le définira tout simplement pas à NULL.

La colonne peut être NULL bien sûr. J'ai également testé $ wpdb- > query et $ wpdb- > prepare et les résultats sont identiques. Est-ce que je fais quelque chose de mal?

    
posée Dejan Stosic 05.05.2014 - 15:01

3 réponses

8

Mise à jour:

Depuis WordPress 4.4. ceci est maintenant supporté par les méthodes insert , update , replace et delete de wpdb et le ticket # 15158 a été fermé car est corrigé .

Merci à @dmsnell pour commenter à propos de cette mise à jour.

D'autre part, le support null dans wpdb::prepare() est actuellement fermé en tant que wontfix dans le ticket # 12819 .

Réponse précédente:

NULL non pris en charge:

Il semble que vous deviez écrire votre propre code SQL personnalisé pour mettre à jour la valeur avec NULL .

Actuellement, NULL n'est pas pris en charge par $wpdb->prepare() , qui prend les entrées via le vsprintf fonction de formatage.

Découvrez ces tickets Trac ouverts:

Ces billets ont environ 4 ans, je ne vais donc pas retenir mon souffle tant que cela n’est pas supporté par le core ;-)

Vous devriez jeter un coup d’œil à la source comme l’a suggéré @s_ha_dum.

Solution possible:

Si vous êtes aventureux, vous pouvez essayer les solutions suivantes avec le filtre query :

    // Add a filter to replace the 'NULL' string with NULL
    add_filter( 'query', 'wpse_143405_query' );

    global $wpdb;
    $wpdb->update(
        'table',
        array( 
            'status' => 'NULL',
        ), 
        array( 'id' => 1 ) 
    );

    // Remove the filter again:
    remove_filter( 'query', 'wpse_143405_query' );

/**
 * Replace the 'NULL' string with NULL
 * 
 * @param  string $query
 * @return string $query
 */

function wpse_143405_query( $query )
{
    return str_ireplace( "'NULL'", "NULL", $query ); 
}

Vous pouvez utiliser une chaîne plus unique que 'NULL' à remplacer, peut-être '###NULL###' à la place.

    
réponse donnée birgire 05.05.2014 - 16:48
3

wpdb->update utilise par défaut une chaîne pour tous les types de données.

  
    

format
        (array | string) (facultatif) Un tableau de formats à mapper sur chacune des valeurs de $ data. Si chaîne, ce format sera utilisé pour     tous     les valeurs dans $ data. Si omis, toutes les valeurs de $ data seront traitées     sous forme de chaînes sauf indication contraire dans wpdb::$field_types .

  
     

enlace

Vous pouvez spécifier un format, mais les spécificateurs autorisés sont les suivants:

  
    

Valeurs de format possibles :% s en tant que chaîne; % d en entier (nombre entier) et     % f comme float. (Voir ci-dessous pour plus d'informations.) Si omis, toutes les valeurs     dans $ où sera traité comme une chaîne.

  
     

enlace

Vous pouvez lire le code source et élaborez le processus.

Si vous piratez la méthode wpdb->prepare (sur un serveur dev qui est nettoyé périodiquement :)) pour vider le code SQL juste avant le retour, vous verrez que le remplacement intervient avant wpdb->prepare :

string(48) "UPDATE 'table' SET 'status' = %s WHERE 'id' = %s"

Bien que, comme suggéré par @birgire, il pourrait bien y avoir une limite à prepare qui a provoqué ce remplacement.

    
réponse donnée s_ha_dum 05.05.2014 - 16:48
2

J'aimerais expliquer davantage comment procéder dans WP 4.4 et les versions ultérieures. Vous devez définir à la fois les éléments de données et de format pour lesquels vous souhaitez que la valeur soit "nulle" en PHP.

L'exemple de ticket # 15158 est le suivant:

$wpdb->update($ttable, 
              [
                'user_id' => NULL,
                'status' => 'available',
                'update_time' => $now->format('Y-m-d H:i:s')
              ], [
                'therapist_id' => $therapist_id,
                'user_id' => $user_id,
                'start_time' => $ub['start_time']
              ], [
                 NULL,
                 '%s',
                 '%s'
              ], [
                 '%d',
                 '%d',
                 '%s'
            ]);
    
réponse donnée Mario Hendricks 26.11.2017 - 20:23

Lire d'autres questions sur les étiquettes