Использование $wpdb->update, но запутался в WHERE и SET

13 февр. 2019 г., 14:32:41
Просмотры: 15.2K
Голосов: 2

Я запутался в использовании WHERE в $wpdb->update :/ Эти последние строки моего кода ДОЛЖНЫ обновлять таблицу с IP-адресом при активации ПО. Если IP меняется, он записывает второй IP-адрес. Сейчас активация РАБОТАЕТ, но не записывает IP в таблицу и выдает ошибку в логе. Я понимаю, что неправильно использую $wpdb->update. Раньше я использовал MySQL-код в отдельном скрипте и БД, и он работал, но моя ошибка просто в плохом запросе. Ошибка гласит: Unknown column '0' in 'where clause' for query UPDATE ma1n_ipn_data_tbl SET 0 = '118.210.134.xxx' WHERE 0 = '1' КОД: Вот строки более четко, если код вставлен неправильно ниже: http://prntscr.com/mkiukd

Мне нужна помощь, если вы можете привести пример: обновить таблицу, установить IP в $variable из getip.php где item_name = и т.д.. Спасибо :P КОД:

                          //ВСЁ РАБОТАЕТ ДО ЭТОГО МОМЕНТА// 
        if ($row->ip_address_01 == 0){ 
         $wpdb->update($ipn_table, array( $row->ip_address_01 = $ipONactivate ),array(($row->payer_email = $serial) && ($row->item_name = $product)));  
    //  $sql=( "UPDATE $ipn_table SET ip_address_01 = $ipONactivate WHERE payer_email = $serial && item_name = $product" ); //БЫЛО РАНЬШЕ
     } else { 
        if ($row->ip_address_01 !== $ipONactivate && $row->ip_address_02 == 0){
        $wpdb->update($ipn_table, array( $row->ip_address_02 = $ipONactivate),array($row->payer_email = $serial && $row->item_name = $product));    
    //  $sql=( "UPDATE $ipn_table SET ip_address_02 = $ipONactivate WHERE payer_email = $serial && item_name = $product" ); //БЫЛО РАНЬШЕ
        } else {    
            echo false;
        }
       }                                                        //ОШИБКА
                        //Unknown column '0' in 'where clause' for query UPDATE `ma1n_ipn_data_tbl` SET `0` = '118.210.134.xxx' WHERE `0` = '1'
0
Все ответы на вопрос 1
2

Вам необходимо ознакомиться с документацией функции, которая доступна здесь.

Функция принимает следующие аргументы:

  • $table Имя таблицы.
  • $data PHP массив, где ключи - это названия столбцов, а значения - данные для вставки в эти столбцы.
  • $where PHP массив, где ключ - это название столбца, а значение - значение для проверки.

А также два дополнительных необязательных аргумента, которые могут использоваться для принудительного задания типов значений 2-го и 3-го аргументов. Подробнее об этом смотрите в документации.

Вы допустили ошибку, смешав синтаксис PHP и SQL во 2-м и 3-м аргументах ($row->ip_address_01 = $ipONactivate присваивает значение $ipONactivate переменной $row->ip_address_01, а не создает массив). Также вы пытаетесь использовать значение столбца из предыдущего запроса (например, $row->ip_address_01) в качестве имени столбца.

Вам нужно правильно форматировать аргументы следующим образом:

$wpdb->update(
    $ipn_table,
    array( 
        'ip_address_01' => $ipONactivate
    ),
    array(
        'payer_email' => $serial,
        'item_name'   => $product,
    )
);

Эта функция обновит столбец ip_address_01 в тех строках, где payer_email равен $serial и item_name равен $product. Эквивалентный SQL-запрос будет выглядеть так:

$sql = "UPDATE {$ipn_table} SET ip_address_01='{$ipONactivate}' WHERE payer_email='{$serial}' AND item_name='{$product}'";

Преимущество использования функции в том, что вам не нужно писать полный запрос (достаточно только указать имена столбцов и значения), а также функция автоматически подготавливает и экранирует значения, защищая вас от SQL-инъекций (чего не произойдет, если использовать мой SQL-пример в чистом виде).

13 февр. 2019 г. 14:52:39
Комментарии

Спасибо за объяснение, Джейкоб. И ты, и Кшишек были очень терпеливы и помогли даже таким тугодумам, как я. Думаю, мы ценим ваши объяснения ЕЩЁ БОЛЬШЕ именно потому, что документация иногда кажется "китайской грамотой" (в зависимости от источника, без обид), а разные способы сделать одно и то же, предлагаемые разными людьми в интернете, только запутывают. Но ты объяснил всё очень понятно.

Я даже не буду пробовать код, пока не прочитаю, не сравню и не пойму его до конца. Ещё раз спасибо. :)

Schmutly Schmutly
14 февр. 2019 г. 00:37:58

Вау. Какое красивое объяснение. Спасибо!

melvin melvin
10 июл. 2023 г. 13:12:35