MySQL-Почему LAST_INSERT_ID () не работает для меня?

У меня есть следующий код:

public function createNewGuide($userID,$guideName) { $sql =" INSERT INTO myTable(name, updated) VALUES ('$guideName', 'NOW()')"; //Process query $this->query($sql); // This inserts the new row $this->query('LAST_INSERT_ID()'); // This throws an error return $this->query_result; } 

Моя функция запроса выглядит так:

  private function query($sql) { $this->query_result = mysql_query($sql, $this->conn) or die("Unable to query local database <b>". mysql_error()."</b><br>$sql"); } 

Я получаю следующую ошибку:

Ошибка базы данных MySQL: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'LAST_INSERT_ID ()'

Я googled и посмотрел на подобные проблемы, но не нашел ответ 🙁

Я не пробовал функцию PHP mysql_insert_id () , поскольку я действительно хотел бы сделать это с помощью SQL.

Почему бы просто не использовать mysql_insert_id для PHP?

Независимо от того, …

 SELECT LAST_INSERT_ID() 

… должен работать до тех пор, пока в таблице будет столбец автоматического увеличения .

Вы забыли SELECT:

 "SELECT LAST_INSERT_ID()" 

Это не будет работать без SELECT:

 SELECT LAST_INSERT_ID(); 

или просто используйте mysql_insert_id , это php-функция, которая делает то же самое на уровне php. Однако используйте первый метод, если ваши идентификаторы таблицы BIGINT.

Если у вас несколько ссылок базы данных в одном окружении, вы всегда должны указывать идентификатор ссылки.

В случае функции php mysql_insert_id вы всегда должны вызывать ее с помощью mysql_insert_id( $link_id );

Если вы вызываете его по SQL-запросу, используя SELECT LAST_INSERT_ID( link_id ) .

Поскольку вы используете функции mysql_* , почему бы просто не использовать mysql_insert_id вместо вызова LAST_INSERT_ID() ?

Тем не менее, ошибка SQL, которую вы получаете, вероятно, связана с тем, что SQL-запрос, который вы отправляете на сервер, следующий:

 LAST_INSERT_ID() 

Вместо этого:

 select LAST_INSERT_ID() 

Должен быть select , если вы выполняете SQL-запрос, чтобы … выбрать … некоторые данные.

Парни уже ответили, что вам не хватает префикса SELECT.

Кстати, вам следует посмотреть инструкцию INSERT … у нее есть ясная дверь для SQL-инъекции, если $guideName не экранируется.

LAST_INSERT_ID() возвращает ноль, если ни одна строка не была вставлена.

Вы должны проверить, действительно ли ваш INSERT преуспел. Всегда проверяйте возвращаемое значение mysql_query() и других функций, которое обычно является FALSE если произошла ошибка.

 $sql =" INSERT INTO myTable(name, updated) VALUES ('$guideName', 'NOW()')"; if ($this->query($sql) === FALSE) { die(mysql_error()); } if (($result = $this->query("SELECT LAST_INSERT_ID()")) === FALSE) { die(mysql_error()); } if (($row = mysql_fetch_array($result)) === FALSE) { die(mysql_error()); } $id = $row[0]; 
 SELECT LAST_INSERT_ID(); 

На твоем месте. Я бы сначала вставлял / вставлял last_insert_id из командной строки или браузера запросов, прежде чем php. Как минимум, это, по крайней мере, подтвердит или отклонит правильный синтаксис sql.

Я согласен с тем, кто говорит, что вы должны использовать mysql_insert_id , но если вы хотите использовать LAST_INSERT_ID , вы можете использовать это:

 function getLastInsertId($db_connection) { $result = 0; if($query_result = mysql_query("SELECT LAST_INSERT_ID();", $db_connection)) { $temp = mysql_fetch_row($query_result); $result = $temp[0]; } return $result; } 

Я думаю, что ваша таблица имеет столбец datetime / timestamp и ваш запрос имеет значение NOW() varchar вместо значения datetime , поэтому ваш SQL query должен иметь значение false .

Если запрос возвращает false вы не получите последний вставленный id (всегда для текущего соединения).

Если SELECT LAST_INSERT_ID (); возвращает 0;

Используйте этот запрос:

SELECT LAST_INSERT_ID (Id) из таблицы_пользователя по LAST_INSERT_ID (Id) desc limit 1;

он даст вам необходимый результат.