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?
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.
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###'
.
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 inwpdb::$field_types
nichts anderes angegeben ist.
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.
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.
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'
]);