Consulta $wpdb update en plugin solo actualiza una columna

30 ene 2017, 16:25:21
Vistas: 19K
Votos: 0

Estoy realizando una actualización desde el administrador de WooCommerce, editando los detalles del pedido. Tengo dos problemas:

  1. Solo se actualiza la columna 'download-count'.
  2. No puedo capturar ningún error SQL.

Sin embargo, cuando uso la misma consulta en un archivo php independiente, funciona correctamente. ¿Qué está mal y cómo puedo obtener los errores SQL o al menos la consulta enviada?

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

Aquí está la "versión php independiente", que funciona:

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

No veo cómo esta consulta puede funcionar en ninguna situación. Esto parece un código PHP inválido.

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

@MarkKaplun, ¿En serio? ¿Funciona en un archivo php independiente? ¿Por qué no funcionaría?

hal hal
30 ene 2017 19:13:22

hmmm, tal vez sea la forma en que formateaste el código... pero ¿qué es esto de "independiente" de lo que hablas? No debería haber ninguna diferencia, a menos que el código sea diferente. Supongo que con el registro activado detectarás el problema rápidamente.

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

Inserté el archivo php en el post principal anterior. La misma consulta, pero sin ningún envoltorio $wpdb->query.

hal hal
30 ene 2017 21:52:08

por lo tanto no es el mismo código... probablemente deberías instalar el plugin query monitor y ver qué consulta se está enviando realmente. En cualquier caso, $wpdb tiene un método update que podrías usar para mejorar la legibilidad

Mark Kaplun Mark Kaplun
31 ene 2017 06:21:15
Todas las respuestas a la pregunta 1
0

Tuve que usar dos consultas separadas. La sintaxis de $wpdb->update no puede manejar cálculos basados en el valor existente. Pero para los otros dos campos funciona. Así que quedó así:

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

$expiry_date = date("Y-m-d", strtotime("+ 30 days")); // Fecha de expiración 30 días después
$expiry_time = $expiry_date . ' 00:00:00'; // Hora de expiración a media noche

$wpdb->query("UPDATE $table SET 
    download_count = (download_count + 1) // Incrementar el contador de descargas
    WHERE order_id = '$post_id'");

$wpdb->update( 
    $table, 
    array( 
        'downloads_remaining' => '1', // Establecer descargas restantes a 1
        'access_expires' => $expiry_time // Establecer fecha de expiración
    ), 
    array( 'order_id' => $post_id ), // Condición WHERE
    array( '%s', '%s' ), // Formatos para los valores
    array( '%d' ) // Formato para la condición
);
21 feb 2017 14:42:57