9

我正在使用下面的代码上传文件并使用 mysqli 将数据插入“图像”表:

<?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: %s\n", 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();

}

}
?>

因此,例如,如果我将 2 个图像“cat.png”和“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 页面并在那里进行上传。所以我遇到的问题是不会出现错误,因为它们在单独的页面上。

4

7 回答 7

5

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

$lastID = $mysqli->insert_id;

然后稍后引用 $lastID。

从下面提取我的评论:

$lastID = $insert->insert_id;

我认为这与交换句柄名称有关 - $mysqli、$insert 等。

希望我正确阅读了这个问题......

于 2012-07-23T16:48:36.867 回答
1

检查500 ErrorFirebug -> Net tab/Chrome Developer tools -> Network tab 中的响应。即使没有以文本形式返回,这也将帮助您调试语法/语义错误,而不是逻辑错误。

于 2012-08-10T05:15:07.380 回答
0

首先,当您回显 $lastID 时会发生什么?您是否将值输出到屏幕?

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

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

于 2012-07-28T22:11:03.390 回答
0

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

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

于 2012-07-30T12:04:58.823 回答
0

如果第二次插入失败,则

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

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

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

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);
于 2012-08-02T00:41:01.980 回答
0

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

将最后一个参数 $_POST['numQuestion'][$i] 分配给一个变量,并在绑定方法调用中使用这个变量。我猜这要么未定义,评估为 null,并且绑定失败,因为您不能将 null 绑定为字符串,或者绑定不能使用多维数组,因为它期望作为引用传递的变量。

试试这个:

//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 列中看到带有 '' 的 DB 条目,则 $_POST['numQuestion'][$i] 没有被设置,并且您的代码中的其他地方有问题与无关数据库访问。

于 2012-08-02T02:22:51.413 回答
0

试图找出可能失败的地方。

第二个查询没有问题,您成功获得最后一个插入ID。我为第二个查询的变量使用了静态值,它工作得很好。即使您可以硬编码值 n 检查。

请注意以下事项:

  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 请求>>单击它>>单击“响应”选项卡,如果您回显或响应。所以,回显错误和 print_r() 来帮助调试

于 2012-08-08T07:32:49.617 回答