Uso de $wpdb->update pero confundido con WHERE y SET
Estoy confundido sobre cómo usar WHERE en $wpdb->update :/
Estas últimas líneas de mi código DEBEN actualizar una tabla con una dirección IP cuando se activa el software. Si cambian de IP, registra la segunda dirección IP.
Ahora se activa PERO no registra las IPs en la tabla y genera un error en el log, y sé que estoy entendiendo mal el $wpdb->update.
Antes usaba código MySQL en un script y DB separados y funcionaba, pero mi error es solo de consulta mala.
El error dice: Unknown column '0' in 'where clause' for query UPDATE ma1n_ipn_data_tbl
SET 0
= '118.210.134.xxx' WHERE 0
= '1'
CÓDIGO:
AQUÍ están las líneas más claramente si el código de abajo se pega incorrectamente: http://prntscr.com/mkiukd
Necesito ayuda si pudieran dar un ejemplo de: actualizar tabla establecer IP a $variable desde getip.php donde item_name = etc.. Gracias :P CÓDIGO:
//TODO FUNCIONA ARRIBA//
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" ); //ANTES
} 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" ); //ANTES
} else {
echo false;
}
} //ERROR
//Unknown column '0' in 'where clause' for query UPDATE `ma1n_ipn_data_tbl` SET `0` = '118.210.134.xxx' WHERE `0` = '1'
Necesitas consultar la documentación de la función, disponible aquí.
La función acepta los siguientes argumentos:
- $table El nombre de la tabla.
- $data Un array de PHP donde las claves son las columnas y los valores son los valores a insertar en esas columnas.
- $where Un array de PHP donde la clave es el nombre de la columna y el valor es el valor a verificar.
Y dos argumentos opcionales más que pueden usarse para forzar que los valores del segundo y tercer argumento sean de ciertos tipos. Consulta la documentación para más información sobre estos.
Lo que has hecho es mezclar sintaxis de PHP y SQL para el segundo y tercer argumento ($row->ip_address_01 = $ipONactivate
está asignando $ipONactivate
a $row->ip_address_01
, no creando un array). También estás intentando usar el valor de una columna de una consulta previa (ej. $row->ip_address_01
) como nombre de columna.
Necesitas formatear tus argumentos así:
$wpdb->update(
$ipn_table,
array(
'ip_address_01' => $ipONactivate
),
array(
'payer_email' => $serial,
'item_name' => $product,
)
);
Esa función actualizará la columna ip_address_01
, de cualquier fila donde payer_email
sea $serial
y item_name
sea $product
. El SQL equivalente sería:
$sql = "UPDATE {$ipn_table} SET ip_address_01='{$ipONactivate}' WHERE payer_email='{$serial}' AND item_name='{$product}'";
La ventaja de la función es que te ahorra tener que escribir la consulta completa (solo necesitas los nombres de columna y valores) y también prepara y escapa correctamente los valores por ti, evitando vulnerabilidades a inyecciones SQL (a las que estarías expuesto si usaras mi ejemplo SQL tal cual).

Gracias por la explicación Jacob. Tanto tú como Krzysiek han sido muy pacientes y serviciales con los que aprendemos más lentamente, y creo que apreciamos más las explicaciones simplemente porque, siento que, a veces la documentación puede ser un poco "griego", dependiendo de la fuente (sin juego de palabras) y las diferentes formas de hacer lo mismo por parte de diferentes personas en la web puede resultar confuso, pero tú lo explicaste muy bien.
Ni siquiera voy a intentar el código hasta que lo lea, compare y lo entienda. De nuevo, gracias. :)
