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

时间:2012-07-23 15:44:57

标签: php mysql database 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: %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页面并在那里上传。所以我遇到的问题是不会出现任何错误,因为它们出现在单独的页面上。

7 个答案:

答案 0 :(得分:5)

首先,保存从记录添加中获得的插入ID(在$ insert-&gt;执行之后):

$lastID = $mysqli->insert_id;

然后再引用$ lastID。

从下面提出我的评论:

$lastID = $insert->insert_id;

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

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

答案 1 :(得分:1)

检查Firebug中的500 Error响应 - &gt;网络标签/ Chrome开发者工具 - &gt;网络选项卡。即使没有任何内容作为文本返回,这也可以帮助您调试语法/语义错误,而不是逻辑错误。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

您应该从第一个表中获取Last inserted ID并插入第二个表(Image_Question)。

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

答案 4 :(得分: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);

答案 5 :(得分:0)

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

将最后一个参数$ _POST ['numQuestion'] [$ i]分配给变量,并在bind方法调用中使用此变量。我猜这是未定义的,计算为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);

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

答案 6 :(得分:0)

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

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

照顾下面的内容:

  1. bind params是否获得所有值?
  2. print_r() $lastID, $sessid, $_POST['numQuestion'][$i] 
    This Will not create problem unless database has contraints of not accepting empty or null values.
    
    1. 利用检查条件找出出错的地方。
    2. 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.   
      3. 转到网络标签&gt;&gt;对表单上发送的ajax请求执行操作&gt;&gt;你可以找到发送的ajax请求&gt;&gt;点击它&gt;&gt;单击“响应”选项卡,如果有,您将找到错误   回应或回应。所以,回显错误和print_r()来帮助调试

      4.