我正在创建一个系统,允许您添加上传了多张图片的邮件。然而,当我尝试将所有图像位置插入到具有表'消息'中的外键的表中时(因此每个图像都知道它属于哪个消息),所有图像的上传都很顺利,我得到了以下错误:
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中去做,但它似乎不起作用。
答案 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