[英]PHP/MYSQL - Inserting multiple rows using mysql_insert_id?
我正在從客戶表單將基本客戶信息上載到數據庫。 當客戶端單擊“完成”時,輸入的信息((名稱 , 城市 , 國家等)將存儲在client_info表中。
作為替代,客戶端也可以將圖像上傳到服務器。 這些圖像的信息( image_path , image_name )然后存儲在另一個單獨的表中,該表稱為client_images ,該表具有與client_info鏈接的外鍵 。
client_info表:
CREATE TABLE IF NOT EXISTS `client_info` (
`client_id` int(11) NOT NULL AUTO_INCREMENT,
`client_name` varchar(100) NOT NULL,
`client_city` varchar(100) NOT NULL,
`client_country` varchar(10) NOT NULL,
PRIMARY KEY (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10446 ;
client_images表:
CREATE TABLE IF NOT EXISTS `client_images` (
`image_id` int(11) NOT NULL AUTO_INCREMENT,
`image_path` varchar(100) NOT NULL,
`image_name` varchar(100) NOT NULL,
`client_id` int(11) NOT NULL,
PRIMARY KEY (`image_id`),
KEY `client_id` (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=415;
我已經成功地將一行上載到client_images表。 添加多個行會導致以下錯誤 :
Cannot add or update a child row: a foreign key constraint fails (`db`.`client_images`, CONSTRAINT `client_images_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `client_info` (`client_id`) ON DELETE CASCADE ON UPDATE CASCADE) : 1452
但是,當我通過控制台添加多行和一個已經存在的client_id進行測試時,它可以很好地工作。
例:
mysql> INSERT INTO client_images (image_path, image_name, client_id) VALUES ('pathname1', 'name1', 10241);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO client_images (image_path, image_name, client_id) VALUES ('pathname2', 'name2', 10241);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO client_images (image_path, image_name, client_id) VALUES ('pathname3', 'name3', 10241);
Query OK, 1 row affected (0.00 sec)
我需要指出的是,我將其排列如下:
文件: (create_article.php)
insert_client_info($client_name, $client_city, $client_country);
include('uploads.php');
?>
<?php mysql_close($connection); ?>
在uploads.php內部,我有一個foreach循環,該循環計算將要上傳的文件數量,在循環的最后,我目前具有一個功能insert_images($ image_path,$ image_name);
功能(insert_images):
function insert_images($directory_path, $image_name) {
global $connection;
$client_id=mysql_insert_id();
$query = "INSERT INTO client_images (
image_path, image_name, client_id
) VALUES (
'{$directory_path}', '{$image_name}', '{$client_id}'
)";
$result = mysql_query($query, $connection);
if ($result) {
// Success!
echo "<p></p>";
echo "Successfully uploaded the file.";
echo "<p></p>";
} else {
// Display error message.
echo "<p>" . mysql_error() ." : ".mysql_errno(). "</p>";
}
return $result;
}
閱讀其他類似的問題,我了解到致命弱點可能是mysql_insert_id() ,並且以某種方式使用了與foreach循環中第一個不同的另一個連接,從而導致出現上述的MYSQL錯誤。
謝謝/ EDZ
這部分:
$query = "INSERT INTO client_images (
image_path, image_name, client_id
) VALUES (
'{$directory_path}', '{$image_name}', '{$client_id}'
)";
將會:
$query = "INSERT INTO client_images (
image_path, image_name, client_id
) VALUES (
'$directory_path', '$image_name', $client_id
)";
您必須使用mysql_real_escape_string()對變量進行轉義,以防止SQL注入
$client_id
也是數字,因此不需要引用'$client_id'
添加多個行會導致以下錯誤:
最后一個插入ID是由當前MySQL會話中最新的INSERT生成的ID,該ID生成了一個自動遞增的ID。
當您插入第一個圖像時,最新的INSERT是client_info的圖像。
但是一旦到達第二張圖像,最新的INSERT就是第一張圖像,因此mysql_insert_id()返回的值是不同的。 同樣,每個后續的INSERT都會更改mysql_insert_id()返回的值。
您應該在 foreach循環開始插入圖像之前設置變量$ client_id,並將該變量傳遞給對insert_images()的每次調用。 在uploads.php中:
$client_id=mysql_insert_id();
foreach (...) {
insert_images($client_id, ...);
}
將$ client_id傳遞為insert_images()函數的參數,而不是在函數中設置$ client_id。
function insert_images($client_id, $directory_path, $image_name) {
...
}
PS:@tttony在提醒您注意SQL注入時有一個好處。
另請參閱我的演講《 SQL注入的神話和謬論》 ,或我的《 SQL反模式:避免數據庫編程的陷阱》一書中有關SQL注入的章節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.