Insertar en WPDB o si existe Actualización

13

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 suceda es si existe una fila, actualícela y, si no, insértela. He leído Insertar y Actualizar en el Códice WPDB, pero ninguno de los dos realmente entró en una situación "cualquiera o". Pensé que podría trabajar con la actualización, por lo que mi código se parece a esto:

$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 como "SI existe una actualización, Insertar ELSE", o necesito ejecutar SQL personalizado para lograr esto, o debo consultar la base de datos primero para ver si existe una ID en mi tabla? Ya sea para actualizarlo o insertarlo?

    
pregunta Howdy_McGee 20.05.2014 - 22:14

3 respuestas

16

Primero, estás usando prepare incorrectamente. Parece que tienes los argumentos de $wpdb->update envueltos en $wpdb->prepare así. Eso no funcionará. En efecto, le está pasando a update un solo 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() ejecuta prepare para ti .

En segundo lugar, si este fuera yo, me salto la función de ayuda y hago una consulta ON DUPLICATE KEY UPDATE 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_id es un UNIQUE index o PRIMARY KEY . Si su estructura de tabla es lo que creo que es, deje que la base de datos lo maneje.

    
respondido por el s_ha_dum 21.05.2014 - 15:09
12

Has probado $wpdb->replace . Según el Codex WP:

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

Me he probado en algunos complementos y funciona al intentar evitar errores de duplicación de ID únicos, etc.

Más información en el códice

    
respondido por el e-crespo 05.09.2014 - 01:39
0

Debes verificar si la fila existe primero.

Lo más probable es que desees intentar obtener el ID o la clave principal de la fila que intentas actualizar, entonces $wpdb->update si lo hace o $wpdb->insert no

    
respondido por el felipelavinz 20.05.2014 - 22:40

Lea otras preguntas en las etiquetas