2011-04-06 37 views
1

我在想什么可能是不可能的,我不确定。这是我的情况:使用自动递增键插入多个表格

我整理了一个课程项目,让老师为学生创建测验。在PHP中,测试问题/答案被输入到数据库中,我使用mysqli准备好的语句。由于我使用的问题/答案IDS将其链接我把它就像这样:

$q_stmt = $db -> prepare('query with no correct_answer_id') 
$a_stmt = $db -> prepare('query with ? = $q_stmt -> insert_id') 
$a_stmt -> bind_params($q_id) 
$q_update = $db -> prepare('query with ? = $a_stmt -> insert_id for correct answer') 
$q_update -> bind_params($correct_answer_id) 

,然后脚本循环,如:

foreach ($question) 
    $q_stmt -> execute() 
    $q_id = $db -> insert_id 
    foreach ($answers) 
    $a_stmt -> execute() 
    id (correct_answer) $correct_answer_id = $db -> insert_id 
$q_update -> execute() 

现在,这工作我的笔记本电脑( Mac OS X.6与最新(截至1月)PHP和MySQL),但是当我上传我的项目的另一部分,也使用嵌套预准备语句到我的网络服务器时,我收到一条错误消息,说它不喜欢我的嵌套。它说:

警告:mysqli的准备::()[mysqli.prepare]:所有的数据必须在新的语句之前准备中获取发生在根/路径/文件名上线124 .PHP

因此,我认为嵌套准备语句必须是一件坏事?这是非常不幸的,因为我真的很喜欢我把它们放在一起。

作为替代,我遍历所有收集ID,然后再做循环上的问题和答案也收集ID,然后循环又一个更多的时间来更新的问题,但似乎想了很多问题为服务器额外的工作,我喜欢尝试高效。

这就是说,我正在寻找两件事之一。
1 - 通过奇迹有一种方法来运行我的查询在一步
a - 我会喜欢一个解决方案,允许问题/正确答案对插入一次,然后循环以后的可变数量不正确的答案也是相关的问题
2 - 一种方法来改变我的Web服务器(我已经完全进入cpannel),使得它不再恨我的嵌套预处理语句提前

回答

1

核心

谢谢问题在于其中一个准备好的语句为您设置了一个结果集,但您在尝试下一个语句之前没有检索它。 一些版本的MySQL库有这方面的问题,而其他的则没有。

看看mysqli_stmt::store_result。调用execute后,您可以立即调用它以将结果集传送出MySQL。即使你不会立即使用结果集(或者根本不使用结果集),这个动作应该让你继续执行你的其他准备好的语句。

(PDO中的土地,这可以通过toggling buffered queries控制。)

+0

你可能是正确的。当我正在处理另一个数据库函数时,我注意到我忘记调用$ stmt - > close()来执行一个已经在页面上执行过的语句,这个语句可能是罪魁祸首。 – baiano 2011-04-06 08:02:05

+0

我会考虑[mysqli_stmt :: free_result](http://www.php.net/manual/en/mysqli-stmt.free-result。php)作为一种替代方案,如果你已经完成了数据,因为它将会在资源上更轻。 – Joshua 2012-03-30 22:24:33