在表格中插入新行和自动ID号码

时间:2012-02-16 20:50:16

标签: php mysql insert

我想在表格中插入一个新行。我希望自动生成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()无效吗?有什么问题?

5 个答案:

答案 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而你没有插入任何内容。

  1. 如果不是,则将db中的ID字段转换为自动增量。
  2. 将您的公告
  3. 插入数据库
  4. 然后使用mysql_insert_id请求id来获取它。
  5. 但是我发现你只是在插入时才使用它,然后你无论如何都不需要这个功能。只需插入没有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

为AUTO_INCREMENT列生成的ID