我想在表格中插入一个新行。我希望自动生成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()
无效吗?有什么问题?
答案 0 :(得分:5)
不要这样做。 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不会被另一个并行运行的脚本副本检索到,并且会从该脚本副本中删除。
答案 1 :(得分:4)
公告的主键列应为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]')
如发布的其他建议中所述,您应确保将公告表的主键字段设置为auto_increment。
只是为了完成,当你想使用你刚刚插入的行的id时,你会使用mysql_insert_id(),即如果你想要选择你刚刚插入的行,你可以做
'SELECT * FROM announcements WHERE id = '.mysql_insert_id()
答案 2 :(得分:2)
假设您的表格设置正确,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
。 (也就是说,它会为您提供上一个插入的值,而不是下一个插入的值。)
答案 3 :(得分:2)
问题是你要求最后一个插入ID而你没有插入任何内容。
但是我发现你只是在插入时才使用它,然后你无论如何都不需要这个功能。只需插入没有ID的
"insert into announcements (InsertDate, Title, Text) VALUES (CURDATE(), '$_POST[title]', '$_POST[text]')";
在使用$ _POST或$ _GET或任何其他用户输入值的值时,您应该非常小心查询。有可能通过表单字段执行SQLInjection,所以我建议你使用mysql escape命令或使用参数。
我希望这会有所帮助。
答案 4 :(得分:2)
您可能希望在创建表时将“自动增量”添加到表中 这将在插入内容时自动添加id。
e.g。
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
“检索上一个查询” - http://php.net/manual/en/function.mysql-insert-id.php