2012-02-16 77 views
3

我想在表格中插入新行。我希望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"); 
?> 

可悲的是,當我測試它在我的網站,我得到這個錯誤:

Error: Duplicate entry '0' for key 'PRIMARY'

mysql_insert_id()不工作?哪裏不對?

+0

你不會有一個有效的mysql_insert_id(),直到你在當前會話/連接的插件。解決方法:AUTOINCREMENT pk(在表創建腳本中)。 – 2012-02-16 20:57:44

回答

2

問題是你要求最後一個插入ID,並且你沒有插入任何東西。

  1. 如果沒有,將你的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命令或使用參數。

我希望這會有所幫助。

+0

我想我的ID字段自動增量轉換,但我得到這個回:#1062 - ALTER TABLE導致AUTO_INCREMENT重測序,從而導致重複條目「1」鍵「PRIMARY」 – felice 2012-02-16 21:04:12

+0

刪除表格提交您的ID,不是再次添加它用auto_increment選項。此錯誤是因爲您已經在該表中記錄。但請確保您沒有在其他地方使用已有的ID。 – 2012-02-16 21:08:34

+0

非常感謝你,它現在完美! :) – felice 2012-02-16 21:13:18

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()只返回當前連接創建的最後一個ID。您第一次運行時尚未插入任何數據,因此您什麼都得不到。

您的版本非常容易受到競爭條件的影響。不能保證你使用mysql_insert_id()檢索到的最後一個ID不會被另一個並行運行的腳本副本檢索到,並且可以從這個腳本副本中被狙擊出來。

+0

感謝上帝的auto_increment。 – felice 2012-02-16 21:14:13

4

公告上的主鍵列應該是auto_increment。當您執行mysql_insert_id()時,它將從該連接執行的最後一個查詢中檢索id。

由於INSERT是您當前正在執行的查詢,因此會出錯。

嘗試

INSERT INTO announcements 
(date_field, title, text) 
VALUES (CURDATE(),'$_POST[title]','$_POST[text]') 

只需更換 'DATE_FIELD', '標題' 和 '文本' 適用的列名。

或者下面還應該工作,如自動增量值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

假設您的表格設置正確,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。 (也就是說,它會給你以前的插入值,而不是下一個插入值。)

2

您可能想要在創建表時添加「自動增量」。
這會在插入內容時自動添加一個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