Interogare $wpdb update în plugin actualizează doar o coloană

30 ian. 2017, 16:25:21
Vizualizări: 19K
Voturi: 0

Fac o actualizare în panoul de administrare WooCommerce, la editarea detaliilor comenzii. Am două probleme:

  1. Doar coloana 'download-count' este actualizată.
  2. Nu pot prinde nicio eroare SQL.

Totuși, când folosesc aceeași interogare într-un fișier php separat, funcționează corect. Ce este greșit și cum pot obține erorile SQL sau măcar interogarea trimisă?

$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'");

Aici este "versiunea php separată", care funcționează:

$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
Comentarii

Nu văd cum această interogare ar putea funcționa în orice situație. Pare a fi un cod PHP invalid.

Mark Kaplun Mark Kaplun
30 ian. 2017 17:39:51

@MarkKaplun, Serios? Funcționează într-un fișier php separat? De ce nu ar funcționa?

hal hal
30 ian. 2017 19:13:22

hmmm, poate este modul în care ai formatat codul... dar despre ce „standalone” vorbești, nu ar trebui să fie nicio diferență, decât dacă codul este diferit. Cred că prin logare vei identifica problema imediat

Mark Kaplun Mark Kaplun
30 ian. 2017 20:08:04

Am inserat fișierul php în postarea principală de mai sus. Aceeași interogare, dar fără niciun wrapper $wpdb->query.

hal hal
30 ian. 2017 21:52:08

de aceea nu este același cod... probabil ar trebui să instalați pluginul Query Monitor și să vedeți ce interogare este trimisă efectiv. În orice caz, $wpdb are o metodă update pe care ați putea să o folosiți pentru a îmbunătăți lizibilitatea

Mark Kaplun Mark Kaplun
31 ian. 2017 06:21:15
Toate răspunsurile la întrebare 1
0

A trebuit să folosesc două interogări separate. Sintaxa $wpdb->update nu poate gestiona calculele bazate pe valoarea existentă. Dar pentru celelalte două câmpuri funcționează. Deci, așa:

$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 feb. 2017 14:42:57