我正在考虑的事情可能是不可能的,我不确定。这是我的情况:
我整理了一个课程项目,允许教师为学生创建测验。在php中,测试问题/答案输入到数据库中,我使用的是mysqli预处理语句。由于我使用问题/答案ID来链接它们,我将其设置为:
$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 :: prepare()[mysqli.prepare]:必须在第124行的 root / path / file-name .php中进行新语句准备之前获取所有数据< / p>
那么,我认为嵌套预处理语句必定是坏事吗?这是非常不幸的,因为我真的很喜欢我把它放在一起。
作为替代方案,我可以遍历收集ID的所有问题,然后在问题和答案上再次循环,同时收集ID,然后循环再次更新问题但是对于服务器来说似乎需要做很多额外的工作,我想尝试提高效率。
那就是说,我正在寻找两件事之一 1 - 通过一些奇迹,有一种方法可以在一步中运行我的查询 a - 我会喜欢一个解决方案,允许一次插入问题/正确答案对,然后循环以获取与问题相关的可变数量的错误答案 2 - 一种更改我的Web服务器的方法(我可以完全访问cpannel),以便它不再讨厌我的嵌套预准备语句
提前致谢
答案 0 :(得分:1)
核心问题是其中一个预准备语句为您设置了结果集,但在尝试下一个语句之前,您没有检索它。 某些版本的MySQL库存在此问题,而其他版本则没有。
看看mysqli_stmt::store_result
。您可以在调用execute
后立即调用它以将结果集传输出MySQL。即使您不立即使用结果集(或根本不使用?),此操作也可以让您继续执行其他准备好的语句。
(在PDO土地上,这可以由toggling buffered queries控制。)