$ wpdb fügt NULL nicht in die Tabellenspalte ein

13

Wenn ich so etwas versuche

    $status = NULL;

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

In der 'status'-Spalte habe ich jetzt eine leere Zeichenkette '', sie wird einfach nicht auf NULL gesetzt.

Die Spalte kann natürlich NULL sein. Ich habe auch $ wpdb-> query und $ wpdb-> prepare getestet und die Ergebnisse sind die gleichen. Mache ich etwas falsch?

Dejan Stosic
quelle

Antworten:

9

Aktualisieren:

Seit WordPress 4.4. Dies wird nun durch die unterstützte insert, update, replaceund deleteMethoden wpdbund das Ticket # 15158 wurde als geschlossen festgelegt .

Vielen Dank an @dmsnell für die Kommentare zu diesem Update.

Andererseits ist der nullSupport in wpdb::prepare()derzeit als Wontfix geschlossen in Ticket # 12819 .

Vorherige Antwort:

NULL nicht unterstützt:

Es sieht so aus, als müssten Sie Ihr eigenes benutzerdefiniertes SQL schreiben, um den Wert mit zu aktualisieren NULL .

Wird NULLz.Zt. von nicht unterstützt $wpdb->prepare(), das nimmt die Eingabe über die vsprintf- Formatierungsfunktion erfolgt.

Schauen Sie sich diese offenen Trac-Tickets an:

Diese Tickets sind ungefähr 4 Jahre alt, also würde ich meinen Atem nicht anhalten, bis dies vom Kern unterstützt wird ;-)

Sie sollten einen Blick auf die Quelle werfen, wie von @s_ha_dum vorgeschlagen.

Eine mögliche Problemumgehung:

Wenn Sie abenteuerlustig sind, können Sie mit dem queryFilter Folgendes ausprobieren :

    // 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' );

wo

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

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

Vielleicht möchten Sie eine eindeutigere Zeichenfolge verwenden, als sie 'NULL'zu ersetzen, vielleicht '###NULL###'stattdessen.

birgire
quelle
2
Die Unterstützung für die Einstellung NULLwurde in r34737 hinzugefügt , sodass keine Problemumgehung mehr erforderlich ist
dmsnell
3

wpdb->update Der Standardwert ist eine Zeichenfolge für alle Datentypen.

format
(array | string) (optional) Ein Array von Formaten, die jedem Wert in $ data zugeordnet werden sollen. Wenn string, wird dieses Format für alle Werte in $ data verwendet. Wenn nicht angegeben, werden alle Werte in $ data als Zeichenfolgen behandelt, sofern in nicht anders angegeben wpdb::$field_types.

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

Sie können ein Format angeben, die zulässigen Bezeichner sind jedoch:

Mögliche Formatwerte :% s als String; % d als Ganzzahl und% f als Gleitkomma. (Weitere Informationen finden Sie weiter unten.) Wenn diese Option nicht angegeben wird, werden alle Werte in $ where als Zeichenfolgen behandelt.

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

Sie können die Quelle durchlesen und den Prozess ausarbeiten.

Wenn Sie die wpdb->prepareMethode hacken (auf einem Dev-Server, der regelmäßig gelöscht wird :)), um die SQL vor der Rückkehr zu sichern, werden Sie feststellen, dass der Austausch vor dem wpdb->preparefolgenden Zeitpunkt erfolgt :

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

Obwohl es, wie von @birgire vorgeschlagen, durchaus eine Beschränkung sein kann prepare, die zu diesem Austausch geführt hat.

s_ha_dum
quelle
2

Ich möchte weiter erklären, wie dies in WP 4.4 und darüber hinaus gemacht wird. Sie müssen sowohl das Daten- als auch das Formatelement, für das Sie den Wert null festlegen möchten, auf einen PHP-Wert 'null' setzen.

Das Beispiel in Ticket # 15158 lautet wie folgt:

$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
quelle