Insertar WPDB o si existe Actualizar


21

No estoy muy familiarizado con WPDB o SQL en general, pero tengo una tabla personalizada para mi proyecto y estoy tratando de asignarle algunos metadatos. Lo que "me gustaría" que ocurra es que si existe una fila, actualícela y, si no, insértela. He leído Insertar y Actualizar en el Codex WPDB pero ninguno de los dos entró en una situación de "uno u otro". Pensé que podría trabajar con la actualización, por lo que mi código hasta ahora se ve así:

$wpdb->update(
    $wpdb->prepare(
        $wpdb->prefix.'item_info',
        array(
            'post_id'       => $post_id,
            'item_stock'    => $item_stock
        ),
        array('post_id' => $post_id)
    )
);

¿Tiene WordPress algo así como "IF IF Update, ELSE Insert", o necesito ejecutar SQL personalizado para lograr esto, o necesito consultar primero la base de datos para ver si existe una ID en mi tabla y luego decidir si actualizar o lo inserta?

Respuestas:


23

Primero, estás usando prepareincorrectamente. Parece que tienes $wpdb->updatelos argumentos envueltos de $wpdb->prepareesa manera. Eso no funcionará. En efecto, está pasando updateun único argumento: la salida de prepare. Pruebe algo simple como lo siguiente y verá por qué eso no funciona:

$post_id = 123;
$item_stock = 567;
var_dump(
  $wpdb->prepare(
    $wpdb->prefix.'item_info',
    array(
        'post_id'       => $post_id,
        'item_stock'    => $item_stock
    ),
    array('post_id' => $post_id)
  )
);

Y $wpdb->update()corre preparepor ti .

En segundo lugar, si este fuera yo, me saltearía la función auxiliar y escribiría una ON DUPLICATE KEY UPDATEconsulta adecuada :

$sql = "INSERT INTO {$wpdb->prefix}item_info (post_id,item_stock) VALUES (%d,%s) ON DUPLICATE KEY UPDATE item_stock = %s";
// var_dump($sql); // debug
$sql = $wpdb->prepare($sql,$post_id,$item_stock,$item_stock);
// var_dump($sql); // debug
$wpdb->query($sql);

Esto supone que post_ides un UNIQUEíndice oPRIMARY KEY . Si su estructura de tabla es lo que creo que es, deje que la base de datos lo maneje.


Esto fue increíblemente útil ... ¡Gracias por su tiempo s_ha_dum!
Jake

Prepare devuelve false para mí, no hay otros errores de db. Si ejecuta la consulta manualmente en phpmyadmin, funciona como se esperaba. También comprobé que las variables son lo que deberían ser. ¿Alguna idea?
trainoasis

1
¿Qué pasa si post_id no es la CLAVE PRIMARIA?
Mike Kormendy

18

¿Lo has intentado $wpdb->replace? Según WP Codex:

Reemplace una fila en una tabla si existe o inserte una nueva fila en una tabla si la fila aún no existía.

Lo he probado en algunos complementos y hace el trabajo al tratar de evitar errores únicos de duplicación de ID, etc.

Más información en el códice


Esto funcionó para mí, mientras que la consulta personalizada no lo hizo, gracias por mencionar replace ()
trainoasis el

Esta es la respuesta correcta a la pregunta.
Tyler Jones

66
Vale la pena señalar que $wpdb->replacees una sobrescritura destructiva de todo el registro, mientras que $wpdb->updatesolo actualiza los campos específicos incluidos en la $datamatriz
MatthewLee

0

Debe verificar si la fila existe primero.

Lo más probable es que desee intentar obtener el ID o la clave principal de la fila que está tratando de actualizar, y $wpdb->updatesi lo hace o $wpdb->insertno.


14
Un ejemplo de cómo verificar si la ID o la clave principal existe realmente haría que esta sea una respuesta útil. Esto es casi como reiterar la pregunta.
Jake
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.