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?

Howdy_McGee
fuente

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.

s_ha_dum
fuente
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

e-crespo
fuente
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.

felipelavinz
fuente
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