Query $wpdb di aggiornamento nel plugin aggiorna solo una colonna

30 gen 2017, 16:25:21
Visualizzazioni: 19K
Voti: 0

Sto eseguendo un aggiornamento dall'area amministrativa di WooCommerce, nella modifica dei dettagli dell'ordine. Ho due problemi:

  1. Viene aggiornata solo la colonna 'download-count'
  2. Non riesco a catturare alcun errore SQL

Tuttavia, quando uso la stessa query in un file PHP autonomo, funziona correttamente. Cosa c'è che non va e come posso ottenere gli errori SQL o almeno la query inviata?

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

Ecco la versione "standalone" in PHP che funziona:

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

Non vedo come questa query possa funzionare in qualsiasi situazione. Sembra un codice PHP non valido.

Mark Kaplun Mark Kaplun
30 gen 2017 17:39:51

@MarkKaplun, Davvero? Funziona in un file php autonomo? Perché non dovrebbe funzionare?

hal hal
30 gen 2017 19:13:22

hmmm, forse è il modo in cui hai formattato il codice... ma cos'è questo "standalone" di cui parli, non dovrebbe esserci alcuna differenza, a meno che il codice non sia diverso. La mia ipotesi è che con il logging attivo individuerai il problema in un attimo

Mark Kaplun Mark Kaplun
30 gen 2017 20:08:04

Ho inserito il file php nel post principale sopra. La stessa query, ma senza alcun wrapper $wpdb->query.

hal hal
30 gen 2017 21:52:08

quindi non è lo stesso codice... probabilmente dovresti installare il plugin Query Monitor e vedere quale query viene effettivamente inviata. In ogni caso, $wpdb ha un metodo update che potresti voler utilizzare per migliorare la leggibilità

Mark Kaplun Mark Kaplun
31 gen 2017 06:21:15
Tutte le risposte alla domanda 1
0

Ho dovuto utilizzare due query separate. La sintassi $wpdb->update non può gestire calcoli basati sul valore esistente. Ma per gli altri due campi funziona. Ecco come ho fatto:

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

$expiry_date = date("Y-m-d", strtotime("+ 30 days")); // Data di scadenza tra 30 giorni
$expiry_time = $expiry_date . ' 00:00:00'; // Aggiungiamo l'orario di scadenza

$wpdb->query("UPDATE $table SET 
    download_count = (download_count + 1) // Incrementa il contatore dei download
    WHERE order_id = '$post_id'");

$wpdb->update( $table, 
    array( 
        'downloads_remaining' => '1', // Imposta i download rimanenti a 1
        'access_expires' => $expiry_time // Imposta la data di scadenza
    ), 
    array( 'order_id' => $post_id ), // Condizione WHERE
    array( '%s', '%s' ), // Formato dei valori
    array( '%d' ) // Formato della condizione
);
21 feb 2017 14:42:57