$ wpdb n'insérera pas NULL dans la colonne du tableau

13

Quand j'essaye 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 la mettra 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 les mêmes. Est-ce que je fais quelque chose de mal?

Dejan Stosic
la source

Réponses:

9

Mise à jour:

Depuis WordPress 4.4. ceci est maintenant pris en charge par les insert, update, replaceet les deleteméthodes de wpdbet le billet # 15158 a été fermé comme fixe .

Merci à @dmsnell d'avoir commenté cette mise à jour.

D'un autre côté, le nullsupport dans wpdb::prepare()est actuellement fermé en tant que wontfix dans le ticket # 12819 .

Réponse précédente:

NULL non supporté:

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

Actuellement, NULLn'est pas pris en charge par $wpdb->prepare(), qui prend l'entrée via la fonction de formatage vsprintf .

Découvrez ces billets Trac ouverts:

Ces billets ont environ 4 ans, donc je ne retiendrais pas mon souffle tant que cela ne serait pas soutenu par le noyau ;-)

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

Une solution possible:

Si vous êtes aventureux, vous pouvez essayer ce qui suit avec le queryfiltre:

    // 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 voudrez peut-être utiliser une chaîne plus unique que 'NULL'remplacer, peut-être à la '###NULL###'place.

Birgire
la source
2
la prise en charge de la configuration a NULLété ajoutée dans r34737 , il n'est donc plus nécessaire de contourner le
problème
3

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

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

http://codex.wordpress.org/Class_Reference/wpdb#UPDATE_rows

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

Valeurs de format possibles :% s sous forme de chaîne; % d comme entier (nombre entier) et% f comme flottant. (Voir ci-dessous pour plus d'informations.) Si omis, toutes les valeurs de $ where seront traitées comme des chaînes.

http://codex.wordpress.org/Class_Reference/wpdb#UPDATE_rows

Vous pouvez lire la source et déterminer le processus.

Si vous piratez la wpdb->prepareméthode (sur un serveur de développement qui est nettoyé périodiquement :)) pour vider le SQL avant juste avant le retour, vous verrez que le remplacement se produit avant wpdb->prepare:

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

Cependant, comme suggéré par @birgire, cela pourrait bien être une limite à ce preparequi a incité ce remplacement.

s_ha_dum
la source
2

Je voudrais expliquer plus en détail comment procéder dans WP 4.4 et au-delà. Vous devez définir à la fois les données et l'élément de format que vous souhaitez annuler sur une valeur PHP «nulle».

L'exemple du 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'
            ]);
Mario Hendricks
la source