我试图使用多个准备好的语句与PHP和mysqli驱动程序并获得了臭名昭著的错误:如何关闭mysqli prepared语句中的结果集,但保留语句 - 不缓冲整个结果?
Commands out of sync; you can't run this command now
虽然我觉得这个数据库API是残暴脑损伤,我不明白为什么我得到错误,如this question所述。
几种解决方案都提供在这个和其他各种答案,我发现周围铺设,是我见过的唯一的,似乎工作涉及
$stmt->store_result()
其缓冲整个结果集。
但是,我不想缓冲整个结果集 - 我想放弃它,而不使用(大量的)内存来存储它!
所有我想做的事情,就是创建一份声明中,使用bind_param()
和bind_result()
和fetch()
得到一些结果,然后以某种方式关闭的结果,这样我可以再次使用statment并运行其他查询直到那时。
我已经试过了从声明中获取实际结果对象的所有方法,并明确地关闭了它,并且我试过调用next_result()
直到它返回null。这些解决方案都不能防止出现该错误。
那么,如何关闭结果集并在fetch()
之后执行其他准备好的语句,而不废弃执行的语句并且不得不重新解析查询?
$q = $dbc->prepare("SELECT id, typename, storageclass, tablename FROM _dbtype WHERE typename=?");
$q->bind_param("s", $typeName);
$q->bind_result($id,$typeName,$storageClass,$tableName);
$q->execute();
$q->fetch(); // ie. only once
... <something that does not destroy $q> ...
$q2 = $dbc->prepare("SELECT id, name FROM _storagetype");
如果你不得不为每个准备好的语句创建一个不同的连接,它会让我大吃一惊。没有其他数据库我使用过,强迫你做任何非高性能和愚蠢的事情...... =/ – BadZen