2013-10-01 3 views
0

Я пытаюсь получить последний вставленный идентификатор нескольких вставленных строк.Как выбрать последний вставленный идентификатор на конкатенированные значения

record_id является автоматическое приращение

$sql = "INSERT INTO records (record_id, user_id, status, x) values "; 
     $varray = array(); 

     $rid = $row['record_id']; 
     $uid = $row['user_name']; 
     $status = $row['status']; 
     $x = $row['x']; 

     $varray[] = "('$rid', '$uid', '$status', '$x')"; 

     $sql .= implode(',', $varray); 

     mysql_query($sql); 

     $sql2 = "INSERT INTO status_logs (id, record_id, status_id, date, timestamp, notes, user_id, x) VALUES"; 

     $varray2[] = "(' ', mysql_insert_id(), '$status', '$uid', '$x')"; 

     $sql2 .= implode(',', $varray2); 

     mysql_query($sql2); 

Это результат:

INSERT INTO records (record_id, user_id, notes, x) values ('', '1237615', 'this is a note', 'active') 

INSERT INTO status_logs (log_id, record_id, status_id, date, timestamp, notes, user_id, x) VALUES('', INSERT INTO records (record_id, user_id, notes, x) values ('', '1237615', 'this is a note', 'active') 

INSERT INTO status_logs (log_id, record_id, status_id, date, timestamp, notes, user_id, x) VALUES('', mysql_insert_id(), '1', '2013:05:16 00:00:01', '', this is a note'', '1237615', 'active'), '1', '2013:05:16 00:00:01', '', this is a note'', '1237615', 'active') 

Там нет значения для mysql_insert_id().

+0

Возможно, вы захотите немного узнать о PDO, который является более безопасным способом вставки данных в ваши SQL-запросы. – Duniyadnd

+0

вы всегда можете сделать запрос сразу после этого, выбрав «MAX (id)», это не было бы доказательством дурака (возможно, двумя представлениями в одно и то же время), но, по крайней мере, было бы началом, в качестве альтернативы принять накладные расходы на выполнение отдельных запросов. –

ответ

0

Вы смешивания функцию mysql_insert_id() PHP и SQL INSERT синтаксиса оператора.

Либо использование функция MySQL LAST_INSERT_ID() в VALUES пункте INSERT заявления

INSERT INTO records (user_id, notes, x) VALUES('1237615', 'this is a note', 'active'); 
INSERT INTO status_logs (record_id, status_id, date, timestamp, notes, user_id, x) 
VALUES(LAST_INSERT_ID(), '1', ...); 
     ^^^^^^^^^^^^^^^^^ 

или получить последний вставленный идентификатор, сделав отдельный вызов mysql_insert_id() сразу после первого mysql_query(). И затем используйте это значение, когда вы в качестве параметра для второго запроса.

$sql = "INSERT INTO records (user_id, ...) 
     VALUES(...)"; 
$result = mysql_query($sql); 
if (!$result) { 
    die('Invalid query: ' . mysql_error()); //TODO beter error handling 
} 
$last_id = mysql_insert_id(); 
//   ^^^^^^^^^^^^^^^^^^ 

$sql2 = "INSERT INTO status_logs (record_id, ...) 
     VALUES $last_id, ...)"; 
$result = mysql_query($sql); 
if (!$result) { 
    die('Invalid query: ' . mysql_error()); //TODO beter error handling 
} 

Примечание:

  • Вам не нужно указывать auto_incremented столбец в списке столбцов. Просто пропустите это.
  • Использование по крайней мере, какая-то ошибка обработки в коде

На стороне записки: Вместо того, чтобы интерполировать строки запроса и оставить его широко открыты для SQL-инъекций рассмотреть возможность использования prepared statements либо mysqli_* или PDO ,

+0

Спасибо! Это решило мою проблему. – woninana

0

Если я неправильно читаю ваш код, вы вызываете функцию PHP mysql_insert_id из SQL?

Что вам нужно сделать, это сначала захватить это в PHP-переменную, а затем использовать переменную в SQL. Что-то вроде этого:

// Run the first query 
mysql_query($sql); 

// Grab the newly created record_id 
$recordid= mysql_insert_id(); 

Затем во второй вставляет только использовать:

$varray2[] = "(' ', $recordid, '$status', '$uid', '$x')"; 
Смежные вопросы