mysql_insert_id - php obtener id insertado
obteniendo mysql_insert_id() al usar ON DUPLICATE KEY UPDATE con PHP (4)
Aquí está la respuesta, según lo sugerido por Alexandre:
cuando usa el id = LAST_INSERT_ID (id), establece el valor de mysql_insert_id = el ID actualizado, por lo que su código final debe verse así:
<?
$query = mysql_query("
INSERT INTO table (column1, column2, column3)
VALUES (value1, value2, value3)
ON DUPLICATE KEY UPDATE
column1 = value1,
column2 = value2,
column3 = value3,
id=LAST_INSERT_ID(id)
");
$my_id = mysql_insert_id();
Esto devolverá el valor correcto para $ my_id independientemente de la actualización o inserción.
He encontrado algunas respuestas para esto usando solo mySQL, pero esperaba que alguien pudiera mostrarme una forma de obtener el ID de la última fila insertada o actualizada de una base de datos de mysql al usar PHP para manejar las inserciones / actualizaciones.
Actualmente tengo algo como esto, donde column3 es una clave única, y también hay una columna de identificación que es una clave principal autoincrementada:
$query ="INSERT INTO TABLE (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1=value1, column2=value2, column3=value3";
mysql_query($query);
$my_id = mysql_insert_id();
$ my_id es correcto en INSERT, pero incorrecto cuando se está actualizando una fila (ON DUPLICATE KEY UPDATE).
He visto varias publicaciones con personas que aconsejan que uses algo como
INSERT INTO table (a) VALUES (0) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)
para obtener un valor de ID válido cuando se invoca la LLAVE EN DUPLICADO, pero ¿devolverá ese ID válido a la función mysql_insert_id()
PHP?
Aunque no se utiliza mysql_insert_id () y ON DUPLICATE KEY UPDATE, una excelente forma alternativa de obtener el valor de cualquier campo al actualizar otro encontrado here :
UPDATE table SET id=(@tempid:=id) , .... LIMIT 1;
SELECT @tempid;
Lo usé teniendo una tabla con (índice, estado) ''id'' índice principal de auto-incremento, y ''estado'' fue el campo en el que se realizó la actualización, pero necesitaba obtener ''id'' de la fila actualizada. Esta solución también prueba las condiciones de carrera como mysql_insert_id ().
Esta es mi solución donde usted coloca los datos en una sola matriz y se duplica / rellena automáticamente en la consulta "INSERT INTO ... ON DUPLICATE UPDATE ..".
Es excelente para el mantenimiento y, si lo desea, también puede convertirlo en una función / método.
// save to db:
$qData = [
"id" => mysql_real_escape_string($email_id),
"synd_id" => mysql_real_escape_string($synd_id),
"campaign_id" => mysql_real_escape_string($campaign_id),
"event_id" => mysql_real_escape_string($event_id),
"user_id" => mysql_real_escape_string($user_id),
"campaign_name" => mysql_real_escape_string($campaign_name),
"subject" => mysql_real_escape_string($subject),
"from_name"=> mysql_real_escape_string($from_name),
"from_email"=> mysql_real_escape_string($from),
"content"=> mysql_real_escape_string($html),
"link_to_template" => mysql_real_escape_string($hash),
"ext_campaign_id" => mysql_real_escape_string($ext_campaign_id),
"ext_list_id"=> mysql_real_escape_string($ext_list_id),
];
$q = "INSERT INTO email_campaigns (".
// i.e create a string like `id`, `synd_id`, `campaign_id`.. with linebreaks for readability
implode(", /n", array_map(function($k){ return "`$k`"; }, array_keys($qData)))
.")
VALUES (".
// i.e ''20'', ''532'', ''600'' ..
implode(", /n", array_map(function($v){ return "''$v''"; }, array_values($qData)))
." ) ON DUPLICATE KEY UPDATE ".
// i.e `synd_id`=''532'', `campaign_id`=''600'' ...
// id & link_to_template table keys are excluded based on the array below
implode(", /n", array_filter(array_map(function($k, $v){ if(!in_array($k, [''id'', ''link_to_template'']) ) return "`$k`=''$v''" ; }, array_keys($qData), array_values($qData)))) ;
Puede comprobar si la consulta era una inserción o una actualización (mysql_affected_rows (); devuelve 1 en la inserción y 2 en la actualización).
Si fuera un inserto, use mysql_insert_id, si fuera una actualización, necesitaría otra consulta.
<?php
$query ="INSERT INTO TABLE (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1=value1, column2=value2, column3=value3";
mysql_query($query);
if(mysql_affected_rows() == 1) { $id = mysql_insert_id(); }
else { // select ...
}
?>
Sé que no es exactamente lo que buscas pero es lo mejor que se me ocurre