Запрос $wpdb update в плагине обновляет только один столбец

30 янв. 2017 г., 16:25:21
Просмотры: 19K
Голосов: 0

Я выполняю обновление из админки WooCommerce, редактируя детали заказа. У меня две проблемы:

  1. Обновляется только столбец 'download-count'.
  2. Не получается перехватить SQL ошибки.

Однако, когда я использую тот же запрос в отдельном PHP файле, он работает корректно. В чем ошибка и как можно получить SQL ошибки или хотя бы увидеть отправленный запрос?

$table = $wpdb->prefix . 'woocommerce_downloadable_product_permissions';
$expiry_date = date("Y-m-d", strtotime("+ 30 days"));
$expiry_time = $expiry_date . ' 00:00:10';

$wpdb->query("UPDATE `$table` SET 
    `downloads_remaining` = '1',
    `access_expires` = '$expiry_time',
    `download_count` = (`download_count` + 1)
    WHERE `order_id` = '$post_id'");

Вот "отдельная PHP версия", которая работает:

$link = mysqli_connect($servername, $username, $password, $db);
$post_id = '219';

if (!$link) { exit; }

$expiry_date = date("Y-m-d", strtotime("+ 30 days"));
$expiry_time = $expiry_date . ' 00:00:00';
$table = 'hkmw_woocommerce_downloadable_product_permissions';
$query = "UPDATE `$table` SET 
    `downloads_remaining` = '1',
    `access_expires` = '$expiry_time',
    `download_count` = (`download_count` + 1)
    WHERE `order_id` = '$post_id';";

if (!mysqli_query($link,$query)) {
    printf("Errormessage: %s\n", mysqli_error($link));
}
mysqli_close($link);
5
Комментарии

Я не понимаю, как этот запрос может работать в любой ситуации. Это выглядит как некорректный PHP-код.

Mark Kaplun Mark Kaplun
30 янв. 2017 г. 17:39:51

@MarkKaplun, Серьёзно? Он работает в отдельном PHP-файле? Почему бы ему не работать?

hal hal
30 янв. 2017 г. 19:13:22

Хмм, возможно, дело в том, как ты отформатировал код... Но что ты имеешь в виду под "отдельным файлом", разницы вообще не должно быть, если только код не отличается. Думаю, если включить логирование, ты быстро найдешь проблему.

Mark Kaplun Mark Kaplun
30 янв. 2017 г. 20:08:04

Я вставил php-файл в основной пост выше. Тот же запрос, но без обертки $wpdb->query.

hal hal
30 янв. 2017 г. 21:52:08

поэтому это не тот же самый код... вам, вероятно, стоит установить плагин Query Monitor и посмотреть, какой запрос фактически отправляется. В любом случае, у $wpdb есть метод update, который вы могли бы использовать для улучшения читаемости кода

Mark Kaplun Mark Kaplun
31 янв. 2017 г. 06:21:15
Все ответы на вопрос 1
0

Мне пришлось использовать два отдельных запроса. Синтаксис $wpdb->update не может работать с вычислениями на основе существующего значения. Но для остальных двух полей он работает. Вот так:

$table = $wpdb->prefix . 'woocommerce_downloadable_product_permissions';

$expiry_date = date("Y-m-d", strtotime("+ 30 days"));
$expiry_time = $expiry_date . ' 00:00:00';

$wpdb->query("UPDATE $table SET 
    download_count = (download_count + 1)
    WHERE order_id = '$post_id'");

$wpdb->update( $table, array( 'downloads_remaining' => '1', 'access_expires' => $expiry_time), array( 'order_id' => $post_id ), array( '%s', '%s' ), array( '%d' ) );
21 февр. 2017 г. 14:42:57