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?
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.
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' );
où
/**
* 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.
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 danswpdb::$field_types
.
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.
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.
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'
]);