it-swarm.com.de

$ wpdb fügt NULL nicht in die Tabellenspalte ein

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 Zeichenfolge '', 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?

12
Dejan Stosic

Aktualisieren:

Seit WordPress 4.4. Dies wird jetzt von den Methoden insert, update, replace und delete von wpdb unterstützt, und das Ticket # 15158 wurde geschlossen als fixed .

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

Andererseits ist die Unterstützung für null in wpdb::prepare() derzeit geschlossen als wontfix in ticket # 12819 .

Vorherige Antwort:

NULL wird nicht unterstützt:

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

Derzeit wird NULL nicht von $wpdb->prepare() unterstützt, das die Eingabe über die Funktion vsprintf formatiert.

Schauen Sie sich diese offenen Trac-Tickets an:

Diese Tickets sind ungefähr 4 Jahre alt, also würde ich den 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 Folgendes mit dem Filter query versuchen:

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

woher

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

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

Möglicherweise möchten Sie eine eindeutigere Zeichenfolge als 'NULL' verwenden, um sie zu ersetzen, möglicherweise '###NULL###'.

9
birgire

wpdb->update ist standardmäßig 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 wpdb::$field_types nichts anderes angegeben ist.

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 Methode wpdb->prepare hacken (auf einem Entwickler-Server, der regelmäßig gelöscht wird :)), um die SQL vor der Rückkehr zu sichern, werden Sie feststellen, dass die Ersetzung vor wpdb->prepare erfolgt:

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

Wie von @birgire vorgeschlagen, kann es sich jedoch durchaus um eine Beschränkung auf prepare handeln, die zu diesem Austausch geführt hat.

3
s_ha_dum

Ich möchte weiter erläutern, wie dies in WP 4.4 und darüber hinaus gemacht wird. Sie müssen sowohl das Daten- als auch das Formatelement, das Sie als Nullwert festlegen möchten, auf einen PHP 'Null'-Wert 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'
            ]);
2
Mario Hendricks