$ wpdb не вставить NULL у стовпчик таблиці


13

Коли я пробую щось подібне

    $status = NULL;

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

У стовпці "статус" тепер у мене порожній рядок '', він просто не встановить його на NULL.

Стовпець, звичайно, може бути NULL. Я також перевірив $ wpdb-> запит і $ wpdb-> підготувати, і результати однакові. Я роблю щось не так?

Відповіді:


9

Оновлення:

Оскільки WordPress 4.4. це тепер підтримується insert, update, replaceі deleteметоди wpdbі квиток # 15158 був закритий , як фіксований .

Дякуємо @dmsnell за коментар щодо цього оновлення.

З іншого боку, nullпідтримка в wpdb::prepare()на даний момент закрита як параметр в квитку № 12819 .

Попередня відповідь:

NULL Не підтримується:

Схоже, вам доведеться написати власний спеціальний SQL, щоб оновити значення NULL.

В даний час NULLне підтримується $wpdb->prepare(), що приймає вхід через функцію форматування vsprintf .

Ознайомтеся з цими відкритими квитками Trac:

Цим квиткам близько 4 років, тому я б не затримував дихання, поки це не підтримає ядро ​​;-)

Слід поглянути на джерело, як запропонував @s_ha_dum.

Можливе вирішення:

Якщо у вас є пригоди, ви можете спробувати наступне з 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 ); 
}

Можливо, ви хочете використовувати більш унікальний рядок, ніж 'NULL'замінити, можливо, '###NULL###'замість цього.


2
підтримка налаштувань NULLбула додана в r34737 , тому більше немає потреби в
обходженні

3

wpdb->update за замовчуванням для рядка для всіх типів даних.

формат
(масив | рядок) (необов'язково) Масив форматів, який буде відображено до кожного зі значень у $ data. Якщо рядок, цей формат буде використаний для всіх значень у $ data. Якщо пропущено, усі значення в $ даних будуть розглядатися як рядки, якщо інше не вказано в wpdb::$field_types.

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

Ви можете вказати формат, але допустимими специфікаторами є:

Можливі значення формату :% s як рядок; % d як ціле число (ціле число) і% f як плаваюча. (Див. Нижче для отримання додаткової інформації.) Якщо пропущено, усі значення в $, де будуть розглядатися як рядки.

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

Ви можете прочитати джерело та опрацювати процес.

Якщо ви зламаєте wpdb->prepareметод (на сервері розробників, який періодично очищається :)), щоб скинути SQL перед самим поверненням, ви побачите, що заміна відбувається раніше wpdb->prepare:

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

Хоча, як пропонує @birgire, це може бути обмеженням того, prepareщо спонукало до заміни.


2

Я хотів би далі пояснити, як це зробити в WP 4.4 і далі. Вам потрібно встановити як дані, так і елемент формату, які ви хочете мати нульове значення PHP 'null'.

Приклад у квитку №15158 такий:

$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'
            ]);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.