繁体   English   中英

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

[英]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,你没有插入任何东西。

  1. 如果不是,则将db中的ID字段转换为自动增量。
  2. 将您的公告插入数据库
  3. 然后使用mysql_insert_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM