数据未插入第二个表(MYSQLi)
Posted
技术标签:
【中文标题】数据未插入第二个表(MYSQLi)【英文标题】:Data is not being inserted into second table (MYSQLi) 【发布时间】:2012-07-21 21:19:09 【问题描述】:我正在使用下面的代码上传文件并使用 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”插入到“Image”数据库表中,它将像这样插入:
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 页面并在那里进行上传。所以我遇到的问题是不会出现错误,因为它们在单独的页面上。
【问题讨论】:
您可能应该实际处理错误,而不是仅仅忽略它们。这可能会告诉你出了什么问题。$_POST['numQuestion'][$i]
- 你在哪里设置$i
?
【参考方案1】:
首先,保存从您的记录添加中获得的插入 ID(在 $insert->execute 之后):
$lastID = $mysqli->insert_id;
然后再参考 $lastID。
从下面提取我的评论:
$lastID = $insert->insert_id;
我认为这与交换句柄名称有关 - $mysqli、$insert 等。
希望我正确阅读了这个问题...
【讨论】:
那么对于第二个查询中ImageID的bind_params,是simplay $lastID吗?例如:$insertimagequestion->bind_param("sss", $lastID, $sessid, $_POST['numQuestion'][$i]);
图片id不是第一个参数吗? $insertimagequestion->bind_param($lastID, $sessid, $_POST['numQuestion'][$i]);
可以,但是在绑定参数的时候需要使用sss
来表明我正在绑定三个参数。每个s代表一个参数
既然ID是数字,不应该是iii
而不是sss
吗?
我刚刚注意到,在您的示例中,SessionID 是一个类似于“dog.png”的字符串,而不是一个整数(将其称为 ID 会令人困惑)。所以绑定参数应该是isi
。【参考方案2】:
在 Firebug -> 网络选项卡/Chrome 开发者工具 -> 网络选项卡中检查 500 Error
响应。即使没有以文本形式返回,这也将帮助您调试语法/语义错误,而不是逻辑错误。
【讨论】:
【参考方案3】:首先,当您回显 $lastID 时会发生什么?你得到一个值输出到屏幕上吗?
如果不是,我们需要先解决这个问题,以便 $lastID 返回正确的值。
您的插入代码似乎是正确的。
【讨论】:
当我回显 $lastID 时,屏幕上什么也没有出现,但如果您阅读我的问题的最后一段,我不知道屏幕上是否会输出任何内容,因为上传发生在单独的页面上 @user1394925:您可以随时使用浏览器的开发者工具或Fiddler2等其他工具观察上传脚本的响应。【参考方案4】:您应该从第一个表中获取最后插入的 ID 并插入到您的第二个表 (Image_Question) 中。
我不懂PHP的编码,不过这个任务也很简单。因为这个操作会在DAO类里面执行。所以,不管是PHP还是JAVA。
【讨论】:
【参考方案5】:如果第二次插入失败,则
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);
【讨论】:
它似乎根本没有抛出错误,但我认为问题在于它绑定了一个空值,因为我认为它没有检索最后一个“ImageId”。我已经意识到我只剩下 2 个小时的赏金这么快你将如何更改 php 代码以便它检索最后一个“ImageId”?假设这是问题【参考方案6】:与 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] 没有被设置,并且您的代码中的其他地方有问题,什么都没有与数据库访问有关。
【讨论】:
假设第二个绑定不起作用,您将如何更改 php 代码以使其起作用?我似乎无法显示错误,因为上传文件页面位于单独的 php 文件中,该页面实际上使用插件和 AJAX 进行上传 @user1394925 上面新添加的代码将防止空值被绑定,并减轻使用多维数组的任何引用问题。您可能希望使默认 $postVar 不是空字符串 '' 或在尝试插入之前检查有效值。 没有任何东西插入到 Image_QUestion 表中,imageupload.php 页面上没有出现错误,但我认为它不能显示任何错误的原因是因为 AJAX 上传器和执行上传的 php 脚本在一个单独的页面上,它们都只使用 AJAX 链接,它们在后台链接 @user1394925 假设 $lastID、$sessid 和 $postVar 是合法的字符串,绑定/执行应该可以工作。您可能会在数据库中遇到关键冲突或类似情况。 var_dump 将两个插入对象的结果执行到您的 php 错误日志中并查看它们。这是检查您是否无法将它们传递回 AJAX 调用以进行显示的最简单方法。 @user1394925 我的意思是转储插入执行的结果。你可以用 $insert->get_result() 和 $insertimagequestion->get_result()【参考方案7】:试图找出失败的原因。
第二次查询没有问题,您成功获得了最后一个插入ID。我为第二个查询的变量使用了静态值,它工作得很好。甚至您可以硬编码值 n 检出。
请注意以下事项:
-
绑定参数是否获取所有值?
print_r() $lastID, $sessid, $_POST['numQuestion'][$i] This Will not create problem unless database has contraints of not accepting empty or null values.
-
利用检查条件找出问题所在。
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 的开发者工具来调试 ajax 请求。
按 F12 打开 Chrome 中的开发者工具
转到网络选项卡>>对要在表单上发送的 ajax 请求执行操作>>您可以找到发送的 ajax 请求>>单击它>>单击“响应”选项卡,您将找到如果你有错误 回应或回应。所以,回显错误和 print_r() 来帮助调试
【讨论】:
我会试试你的答案,$lastID 和 $sessid 放在不允许空值的列中,但这应该不是问题,因为我想在这些列中插入这些值,对吧?以上是关于数据未插入第二个表(MYSQLi)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 laravel 集合获取最后插入的 ID 并将其插入到第二个表中?
java 两个表同时插入数据,第二个表的一个字段是取第一个表的ID值 要怎么取 我拿到的都是空。。