数据未插入第二个表(MYSQLi)



我使用下面的代码,该代码使用mysqli:上传文件并将数据插入"Image"表

<?php
session_start();
$username="xxx";
$password="xxx";
$database="mobile_app";
$mysqli = new mysqli("localhost", $username, $password, $database);
/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %sn", mysqli_connect_error());
    die();
}
$result = 0;
//UPLOAD IMAGE FILE
move_uploaded_file($_FILES["fileImage"]["tmp_name"], "ImageFiles/" . $_FILES["fileImage"]["name"]);
$result = 1;
//INSERT INTO IMAGE DATABASE TABLE
$imagesql = "INSERT INTO Image (ImageFile) VALUES (?)";
if (!$insert = $mysqli->prepare($imagesql)) {
    // Handle errors with prepare operation here
}
//Dont pass data directly to bind_param store it in a variable
$insert->bind_param("s", $img);
//Assign the variable
$img = 'ImageFiles/' . $_FILES['fileImage']['name'];
$insert->execute();
//RETRIEVE IMAGEID FROM IMAGE TABLE
$lastID = $mysqli->insert_id;
//INSERT INTO IMAGE_QUESTION DATABASE TABLE
$imagequestionsql = "INSERT INTO Image_Question (ImageId, SessionId, QuestionId) VALUES (?, ?, ?)";

if (!$insertimagequestion = $mysqli->prepare($imagequestionsql)) {
    // Handle errors with prepare operation here
}
$sessid =  $_SESSION['id'] . ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '');
$insertimagequestion->bind_param("sss", $lastID, $sessid, $_POST['numQuestion'][$i]);
$insertimagequestion->execute();
//IF ANY ERROR WHILE INSERTING DATA INTO EITHER OF THE TABLES
if ($insert->errno) {
  // Handle query error here
}
$insert->close();
if ($insertimagequestion->errno) {
  // Handle query error here
}
$insertimagequestion->close();
}
}
?>

例如,如果我在"Image"数据库表中插入两个图像"cat.png"one_answers"dog.png",它会像这样插入:

ImageId         ImageFile
220             cat.png
221             dog.png

(ImageId为自动递增)

无论如何,我想做的是,当上传一个文件时,不仅将数据插入上面的表中,而且我还希望能够检索上面插入的ImageId,并将其放在下面的"Image_Question"表中,这样它就会是这样的:

 ImageId         SessionId      QuestionId
    220             cat.png      1
    221             dog.png      4

问题是它没有在第二个表"Image_Question"中插入任何数据,有人知道它为什么没有插入任何数据吗?php文件中没有错误。

要上传文件,用户在"QandATable.php"页面中为ajax上传器选择一个文件,当用户点击上传时,使用ajax,它将进入imageupload.php页面并在那里进行上传。所以我的问题是,不会出现错误,因为它们是在单独的页面上。

首先,保存从添加记录中获得的插入ID(在$insert->execute之后):

$lastID = $mysqli->insert_id;

然后稍后引用$lastID。

从下面调出我的评论:

$lastID = $insert->insert_id;

我认为这是为了交换句柄名称——$mysqli、$insert等。

希望我读对了这个问题。。。

在Firebug->网络选项卡/Chrome开发工具->网络选项卡中检查500 Error响应。即使没有任何内容以文本形式返回,这也将帮助您调试语法/语义错误,而不是逻辑错误。

首先,当您回显$lastID时会发生什么?你有一个值输出到屏幕上吗?

如果没有,我们需要首先修复它,以便$lastID返回正确的值。

您的插入代码似乎是正确的。

您应该从第一个表中获取最后插入的ID,并插入到第二个表中(Image_Question)。

我不知道PHP的编码,但这个任务也很简单。因为这个操作将在DAO类内部执行。所以,不管是PHP还是JAVA。

如果第二次插入失败,则

if ($insertimagequestion->error) {
    // Handle query error here
   echo $insertimagequestion->error;
}

这应该告诉你在执行语句时抛出的错误是什么

您的PHP代码似乎很好,错误可能是由于外键约束或DB表上的任何其他约束造成的。

PS:我认为你应该验证你允许上传的文件类型,这样人们就不能上传*.php或*.js文件,这可能会导致灾难性的XSS攻击。此外,为了避免使用与用户上传的文件名相同的文件名,您可能需要使用一些随机变量作为前缀,因此现在可以使用

//notice uniqid(time()) for randomness, also move the declaration of $img higher
//Assign the variable
$img = "ImageFiles/" . uniqid(time()) . $_FILES["fileImage"]["name"];
move_uploaded_file($_FILES["fileImage"]["tmp_name"], $img);
...
//Dont pass data directly to bind_param store it in a variable
$insert->bind_param("s", $img);

与mysqli绑定使用对变量的引用。我不认为你在第二个bind命令中的最后一个参数引用了你期望的方式

将最后一个参数$_POST['numQuestion'][$i]分配给变量,并在绑定方法调用中使用此变量。我猜这可能是未定义的,计算结果为null,绑定失败,因为您不能将null绑定为字符串,或者绑定不能使用多维数组,因为itexpects是作为引用传递的变量。

试试这个:

//Below will set a default value of empty string if the POST variable is not set
$postVar = isset($_POST['numQuestion'][$i])?$_POST['numQuestion'][$i]:'';
$insertimagequestion->bind_param("sss", $lastID, $sessid, $postVar);

完成此操作后,如果您在数据库中的QuestionId列中看到带有"的条目,则没有设置$_POST['numQuestion'][$i],并且您的代码中的其他地方出现了与数据库访问无关的错误。

试图找出故障所在。

第二个查询没有问题,并且您成功地获得了最后一个插入id。我在第二次查询中使用了静态值作为变量,效果很好。甚至您也可以对签出的值进行硬编码。

注意以下事项:

  1. 绑定参数是否获取所有值
print_r() $lastID, $sessid, $_POST['numQuestion'][$i] 
This Will not create problem unless database has contraints of not accepting empty or null values.
  1. 利用检查条件来找出哪里出了问题
if (!$insertimagequestion = $mysqli->prepare("$imagequestionsql")) {
    // Handle errors with prepare operation here
    echo "Prepare statement err";
}
if ($insert->errno) {
  // Handle query error here
    echo "insert execution error";
}

虽然这是一个ajax,但您可以使用Chome的Developer Tool来调试ajax请求。

  1. 按F12打开Chrome 中的开发工具

  2. 转到"网络"选项卡>>对要在表单上发送的ajax请求执行操作>>您可以找到已发送的ajax请求>>单击它>>单击"响应"选项卡,如果您有回声或响应。因此,echo error和print_r()可以帮助调试

相关内容

  • 没有找到相关文章

最新更新