[英]insert new row with auto incremental id is not added as last entry in the database
[英]Insert new row in a table and auto id number
我想在表格中插入一个新行。 我希望自动生成id,而不是用户询问。 用户仅提供标题和文本 。 我用PHP编写了这段代码:
<?php
$hostname = "localhost";
$database = "mydb";
$username = "myuser";
$password = "mypsw";
$link = mysql_connect( $hostname , $username , $password ) or
die("Attention! Problem with the connection : " . mysql_error());
if (!$link)
{
die('Could not connect: ' . mysql_error());
}
mysql_query("SET NAMES ‘utf8’",$link);
mysql_select_db("mydb", $link);
$lastid=mysql_insert_id();
$lastid=$lastid+1;
$sql="INSERT INTO announcements VALUES ('$lastid',CURDATE(),'$_POST[title]','$_POST[text]')";
if (!mysql_query($sql,$link))
{
die('Error: ' . mysql_error());
}
mysql_close($link);
header("Location: announcement.php");
?>
可悲的是,当我在我的网站上测试它时,我收到此错误:
错误:键'PRIMARY'重复输入'0'
mysql_insert_id()
无效吗? 怎么了?
不要这样做。 mysql将很乐意为您创建一个auto_increment列:
CREATE TABLE x (
id int not null primary key auto_increment
^^^^^^^^^^^^^^---add this to your PK field
);
INSERT INTO x (id) VALUES (null); // creates id = 1
INSERT INTO x (id) VALUES (null); // creates id = 2
mysql_insert_id()仅返回CURRENT连接创建的最后一个id。 您第一次运行时尚未插入任何数据,因此您什么也得不回来。
您的版本非常容易受到竞争条件的影响。 无法保证您使用mysql_insert_id()检索的最后一个ID不会被另一个并行运行的脚本副本检索到,并且会从该脚本副本中删除。
公告的主键列应为auto_increment。 当你执行mysql_insert_id()时,它会从该连接执行的最后一个查询中检索id。
因为INSERT是您当前正在执行的查询,所以它会出错。
尝试
INSERT INTO announcements
(date_field, title, text)
VALUES (CURDATE(),'$_POST[title]','$_POST[text]')
只需将“date_field”,“title”和“text”替换为适用的列名称即可。
或者,以下内容也应该起作用,因为AutoIncrement值中的NULL值应该是可接受的
INSERT INTO announcements VALUES (NULL,CURDATE(),'$_POST[title]','$_POST[text]')
如发布的其他建议中所述,您应确保将announcements表的主键字段设置为auto_increment。
只是为了完成,当你想使用你刚插入的行的id时,你会使用mysql_insert_id(),即如果你想要选择你刚刚插入的行,你可以做
'SELECT * FROM announcements WHERE id = '.mysql_insert_id()
假设您的表设置正确, id
字段为AUTO_INCREMENT
,您只需要执行INSERT,而不指定id
的值。 这意味着您必须指定要插入的列的名称。 所以这一行:
$sql="INSERT INTO announcements VALUES ('$lastid',CURDATE(),'$_POST[title]','$_POST[text]')";
变成了这个
$sql="INSERT INTO announcements (`date`,`title`,`text`) VALUES (CURDATE(),'$_POST[title]','$_POST[text]')";
我猜到你的列名可能是什么。 显然,他们需要匹配您的表定义。
如果你这样做,那么mysql_insert_id()
函数将返回你刚刚插入的行的id
。 (也就是说,它会为您提供上一个插入的值,而不是下一个插入的值。)
问题是你要求最后一个插入ID,你没有插入任何东西。
但我发现你只是在插入时才使用它,然后无论如何你都不需要这个功能。 只需插入没有这样的ID
"insert into announcements (InsertDate, Title, Text) VALUES (CURDATE(), '$_POST[title]', '$_POST[text]')";
在使用$ _POST或$ _GET或任何其他用户输入值的值时,您应该非常小心查询。 有可能通过表单字段执行SQLInjection,所以我建议你使用mysql escape命令或使用参数。
我希望这有帮助。
您可能希望在创建表时向表中添加“自动增量”。
这将在插入内容时自动添加id。
例如
CREATE TABLE announcements
(
id int NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
some_date int(11),
title varchar(200),
text varchar(3000)
);
mysql_insert_id
“检索前一个查询为AUTO_INCREMENT列生成的ID” - http://php.net/manual/en/function.mysql-insert-id.php
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.