У меня есть следующий код:
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;
он даст вам необходимый результат.