簡體   English   中英

PHP / MYSQL-使用mysql_insert_id插入多行?

[英]PHP/MYSQL - Inserting multiple rows using mysql_insert_id?

背景:

我正在從客戶表單將基本客戶信息上載到數據庫。 當客戶端單擊“完成”時,輸入的信息((名稱城市國家等)將存儲在client_info表中。

作為替代,客戶端也可以將圖像上傳到服務器。 這些圖像的信息( image_pathimage_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM