web-dev-qa-db-fra.com

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

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 les mêmes. Est-ce que je fais quelque chose de mal?

12
Dejan Stosic

Mettre à 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é en tant que fixed .

Merci à @dmsnell pour commenting à 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 la fonction vsprintf formatage.

Découvrez ces billets de Trac ouverts:

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

Vous devriez jeter un coup d'oeil à la source comme suggéré par @s_ha_dum.

Une solution possible:

Si vous êtes aventureux, vous pouvez essayer ce qui suit 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 voudrez peut-être utiliser une chaîne plus unique que 'NULL' pour remplacer, peut-être '###NULL###' à la place.

9
birgire

wpdb->update est 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 toutes les valeurs dans $ 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 les suivants:

Valeurs de format possibles :% s en tant que chaîne; % d en entier (nombre entier) et% f en float. (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éfinir 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 a lieu avant le wpdb->prepare:

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

Bien que, comme suggéré par @birgire, il se peut bien que ce soit une limite à prepare qui a incité ce remplacement.

3
s_ha_dum

Je voudrais expliquer plus en détail comment faire cela dans WP 4.4 et au-delà. Vous devez définir à la fois les éléments de données et de format que vous souhaitez définir comme nuls, avec une valeur PHP 'nulle'.

L'exemple dans 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'
            ]);
2
Mario Hendricks