带有SQL语句的Foreach循环

时间:2014-05-19 16:29:05

标签: php mysql sql

我正在创建一个系统,允许您添加上传了多张图片的邮件。然而,当我尝试将所有图像位置插入到具有表'消息'中的外键的表中时(因此每个图像都知道它属于哪个消息),所有图像的上传都很顺利,我得到了以下错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`scrapll`.`scrapimage`, CONSTRAINT `scrapimage_ibfk_1` FOREIGN KEY (`scrap_id`) REFERENCES `scraps` (`scrap_id`))' in C:\xampp\htdocs\scrapll_m_nonstatic\process\new\scrap_process.php:132 Stack trace: #0 C:\xampp\htdocs\scrapll_m_nonstatic\process\new\scrap_process.php(132): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\htdocs\scrapll_m_nonstatic\process\new\scrap_process.php on line 132

仅当我尝试上传多张图片时才会发生这种情况。当我只上传一张图片时,根本没有问题。

以下是代码:

foreach($_FILES['scrapPhotos']['tmp_name'] as $key => $tmp_name ){
                $fileName = $_FILES['scrapPhotos']['name'][$key];
                $fileSize = $_FILES['scrapPhotos']['size'][$key];
                $fileTmp = $_FILES['scrapPhotos']['tmp_name'][$key];
                $fileType= $_FILES['scrapPhotos']['type'][$key];

                if($_FILES['scrapPhotos']['name'][$key]){
                    // Get file extension of uploaded file
                    $imgFileExtension = strrchr($fileName, ".");

                    // Check if file extension of uploaded file is valid
                    if(!in_array($imgFileExtension, $validFileExtensions)) {
                        echo $scrapErrors[0];
                    }
                    // Check if file size is valid (!> 10000000)
                    elseif($fileSize > MAXFILESIZE) {
                        echo $scrapErrors[1];
                    }
                    else {                  
                        // The path to Scrap image
                        $imgLoc = "../../../scrapll_m/static/img/user/scrap/orig/";

                        // Move files to appropiate location
                        $imgFile = sha1(uniqid($_FILES['scrapPhotos']['name'][$key]));
                        $imgFilePath = $imgLoc . $imgFile . $imgFileExtension;

                        // Store image(s) on the server
                        move_uploaded_file($_FILES['scrapPhotos']['tmp_name'][$key], $imgFilePath);

                        $insertImgQuery = 'INSERT INTO scrapimage (scrap_id, image_original_size, image_scrap_size) 
                                                    VALUES (LAST_INSERT_ID(), ?, ?)';
                        $prepInsertImg = $conn->prepare($insertImgQuery);
                        $prepInsertImg->execute(array($imgFilePath, $imgFilePath));
                    }
                }
            }

那么,为什么我不能让我的代码底部的SQL查询多次执行并将下一个图像位置的一行添加到数据库中?我已经把它放在foreach中去做,但它似乎不起作用。

3 个答案:

答案 0 :(得分:1)

基本上,数据库告诉您“scrap_id”列引用的FK不是有效值。您确定在“废料”表上有记录,因此scrap.scrap_id和scrapimage.scrap_id中的“ids”可以匹配吗?

答案 1 :(得分:1)

是的,就像lealhugui说的那样,你在scrapimage中插入了LAST_INSERT_ID()作为scrap_id的值。您的约束要求在具有相同ID的剪贴簿中存在一行。

在某个地方,可能在这个循环之上,你应该已经弄清楚了废料中这一行的scrap_id是什么。然后为每个scrapimage使用相同的id。

答案 2 :(得分:1)

LAST_INSERT_ID()在第一次迭代中的计算结果为0,您将0作为scrap_id插入行。在下一个循环迭代中,LAST_INSERT_ID()计算为......再次等待... 0。

另外,它只适用于auto_increment列,因此如果您想要自动增量scrap_id 插入NULL