使用准备好的语句在结果集上迭代时插入数据

时间:2015-05-24 18:41:36

标签: php mysqli prepared-statement

我开始使用MySQL准备,我遇到了问题 那么bashSELECT怎么办?

INSERT

我测试了这段代码,错误是:

  

致命错误:在...中的非对象上调用成员函数$mysqli = new mysqli("localhost","root","pass","db"); $query = $mysqli->prepare("SELECT url FROM servers"); $query->execute(); $query->bind_result($data); $query2 = $mysqli->prepare("INSERT INTO links(url) VALUES (?)"); $query2->bind_param("s", $data); while ($query->fetch()) { echo $data; $query2->execute(); $query2->close(); } $query->close();

问题在哪里?

1 个答案:

答案 0 :(得分:0)

我看到两个可能的问题。

同时有两个公开声明

我自己几次遇到这个问题。如果要使用嵌套的mysqli语句,则必须在进行另一次数据库调用之前“完成”数据库调用。

在您的上下文中:PHP尚未使用$query->execute();完成第一次调用。如果现在运行$query->fetch(),则会从数据库中提取一行,并且该语句会阻止连接,因为该语句未关闭。

如果要使用其他语句,则必须使用$query->close()(这在您的情况下不起作用)或使用$query->store_result()(这是您想要的)来关闭它。 mysqli::store_result将整个结果集从数据库传输到内存中,并为下一个查询释放连接。

多次关闭$query2

while循环中,在每次迭代中关闭查询$query2,因此在第一次迭代后无法执行$query2->execute()。该行应该移出循环。

注意:我还没有测试过这个。这只是我所知道的问题,我认为可能也是你的问题。

我希望这会有所帮助。

可能的改进

也许您可以使用INSERT ... SELECT-Syntax来提高效果。 这也会删除嵌套语句。您可以先选择并打印所有数据,然后运行INSERT ... SELECT查询以复制另一个表中的所有数据(或反过来)。