|
|
|
| как получить id тока что вставленной записи программа пишется на пхп | |
|
|
|
|
|
|
|
для: ren
(07.05.2007 в 17:07)
| | mysql_insert_id() | |
|
|
|
|
|
|
|
для: Loki
(07.05.2007 в 17:10)
| | пасиб!! | |
|
|
|
|
|
|
|
для: ren
(07.05.2007 в 17:11)
| | А я как дурак создавал переменную, присваливал ей значение текущей даты, потом помещал это все в таблицу, после чего делал еще раз запрос на строку с этой датой - и вуаля :) | |
|
|
|
|
|
|
|
для: ren
(07.05.2007 в 17:07)
| | Можно еще использовать функцию MySQL last_insert_id(). Работает корректнее и не обнуляется между запросами. | |
|
|
|
|
|
|
|
для: WebTech
(10.05.2007 в 12:10)
| | Да одинаково они на самом деле работают... обе в рамках сессии текущего клиента. | |
|
|
|
|
|
|
|
для: cheops
(10.05.2007 в 13:06)
| | Работают они по разному.
http://dev.mysql.com/doc/refman/5.1/en/mysql-insert-id.html
The value of mysql_insert_id() is affected only by statements issued within the current client connection. It is not affected by statements issued by other clients.
Also note that the value of the SQL LAST_INSERT_ID() function will contain the value of the first automatically generated value that was successfully inserted (starting from 5.1.12) or the first automatically generated value if any rows were successfully inserted (before 5.1.12). Another difference is that LAST_INSERT_ID() is not updated if you set an AUTO_INCREMENT column to a specific non-special value.
The reason for the difference between LAST_INSERT_ID() and mysql_insert_id() is that LAST_INSERT_ID() is made easy to use in scripts while mysql_insert_id() tries to provide a little more exact information of what happens to the AUTO_INCREMENT column. | |
|
|
|
|
|
|
|
для: Trianon
(10.05.2007 в 13:44)
| | До версии 5.1 ещё дожить нужно... в любом случае, если запрос не выполнился, то получать значение счётчика AUTO_INCREMENT смысла не имеет, также вероятно не часто требуется это значение при одновременной вставки нескольких записей...
PS Вообще любопытно... я всегда пользовался mysql_insert_id(), но считал, что предпочтительнее LAST_INSERT_ID(), а оказывается всё наоборот :). В любом случае mysql_insert_id() удобнее использовать в скриптах, а LAST_INSERT_ID() в хранимых процедурах. | |
|
|
|
|
|
|
|
для: cheops
(10.05.2007 в 14:02)
| | >До версии 5.1 ещё дожить нужно...
ну хорошо. Вот Вам за "рыбу" гроши:
http://dev.mysql.com/doc/refman/4.1/en/mysql-insert-id.html
на мой взгляд принципиальная разница между ними в том, что на запрос отвечает сервер, который может и не знать об истории клиента. А на функцию - именно клиент.
А если учитывать, что php (особенно в виде модуля) пытается, насколько я знаю, повторно использовать уже установленные соединения с MySQL, то серверу эту самую информацию уж точно актуальной взять неоткуда.
>PS Вообще любопытно... я всегда пользовался mysql_insert_id(), но считал, что предпочтительнее LAST_INSERT_ID(), а оказывается всё наоборот :). В любом случае mysql_insert_id() удобнее использовать в скриптах, а LAST_INSERT_ID() в хранимых процедурах.
Ну - это само собой :) Но применяя хранимые процедуры, уже вовсю можно работать с транзакциями, триггерами и прочим объемным серверным барахлом (и с нетерпением ждать реализации секвенций) , при этом школьный подход к первичным ключам через автоинкрементное поле уже выглядит как-то несолидно :) | |
|
|
|
|
|
|
|
для: Trianon
(10.05.2007 в 14:20)
| | >А если учитывать, что php (особенно в виде модуля) пытается, насколько я знаю, повторно
>использовать уже установленные соединения с MySQL, то серверу эту самую информацию уж
>точно актуальной взять неоткуда.
Тут не совсем это имеется в виду, он повторно использует соединение, если встречает ещё одну функцию mysql_connect() с теми же параметрами соединения в скрипте, где соединение уже установлено. Для другого скрипта или его копии существующее соединение использоваться не будет, а откроется новое. У сервера тоже актуальная информация, так как протокол сессионный испльзуется. | |
|
|
|
|
|
|
|
для: cheops
(10.05.2007 в 15:06)
| | Мне бы Вашу уверенность.
Оно всё так - по здавому смыслу.
А на практике я нарывался на поведение м... несовсем соответствующее описанию.
Когда без явно установленного соединения php-скрипт спокойно подхватывал соединение чужое.
Когда вызов mysql_close() закрывал соединение, открытое чужим mysql_connect() .
Да и описание http://php.net/mysql_connect прозрачным не назовешь.
Нет там ничего ни про единый скрипт, ни про ограничения реентерабельности вызова.
В комментах (User Contributed Notes) вообще ужасы расписаны.
Протокол - оно конечно хорошо. У меня сомнения в его реализации. Корректной реализации.
А mysql (который не mysqli) он еще и старый к тому же.
Это всё лирика, конечно. Но в ситуации с php я предпочту применить mysql_insert_id() нежели дергать сервер запросом. | |
|
|
|
|
|
|
|
для: Trianon
(10.05.2007 в 16:08)
| | >А на практике я нарывался на поведение м... несовсем соответствующее описанию.
Хм... интересно, может тараканы текущей версии... вероятно для надёжности нужно явно использовать дескрипторы соединения (хотя не уверен, что это панацея)...
PS Мануал да местами очень туманно описывает состояние дел... почему мне собственно и не нравится посылать туда людей...
>Но в ситуации с php я предпочту применить mysql_insert_id() нежели дергать сервер запросом.
А дёргать и не придётся, как правило, LAST_INSERT_ID() применяют по следующей схеме
<?php
$query = "INSERT INTO tbl VALUES (NULL,...)";
mysql_query($query);
...
$query = "INSERT INTO subtbl VALUES (NULL, ..., LAST_INSERT_ID())";
mysql_query($query);
?>
|
Т.е. непосредственно используют в следующем запросе. | |
|
|
|
|
|
|
|
для: cheops
(10.05.2007 в 16:46)
| | Именно такой конструкции я и опасался.
Впрочем, сейчас проверю.
<?php include 'config.inc.php';
function rep($x)
{
echo "<PRE>".htmlspecialchars($x)."</PRE>\r\n";
flush();
}
$query = "INSERT INTO tbl1(id, stamp) VALUES (NULL,NOW())";
mysql_query($query);
rep("query: $query");
for($i = 10; $i; $i--, sleep(1))
rep("Wait $i sec");
$query = "INSERT INTO tbl2(id, stamp, ref) VALUES (NULL,NOW(),LAST_INSERT_ID())";
mysql_query($query);
rep("query: $query");
?>
|
Вроде как напрасно опасался.
1 2007-05-10 18:23:19 1
2 2007-05-10 18:23:19 2
3 2007-05-10 18:23:29 3
4 2007-05-10 18:25:28 4
5 2007-05-10 18:25:30 5
6 2007-05-10 18:25:38 6
7 2007-05-10 18:25:43 7
8 2007-05-10 18:25:48 8
9 2007-05-10 18:25:55 9
10 2007-05-10 18:25:58 10
11 2007-05-10 18:26:05 11
|
| |
|
|
|