在使用预处理语句迭代结果集时插入数据


Inserting data while iterating over a result set using prepared statments

我开始使用MySQL准备,我有一个问题。
那么SELECTINSERT呢?

$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();
我测试了这个代码,错误是:

致命错误:在非对象中调用成员函数bind_param()

问题在哪里?

我看到两个可能的问题。

同时打开两个语句

我自己也遇到过几次这样的问题。如果你想使用嵌套的mysql语句,你必须"结束"。 在进行另一个数据库调用之前调用数据库。

在您的上下文中:PHP还没有完成$query->execute();的第一次调用。如果您现在运行$query->fetch(),从数据库中取出一行,语句阻塞连接,因为语句没有关闭。

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

$query2的多重合闸

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

注意:我还没有测试过这些。这是我所知道的唯一的问题,我想这可能也是你的问题。

我希望这对你有帮助。

可能改善

也许你可以使用INSERT ... SELECT -Syntax来提高性能。这也将删除嵌套语句。您可以首先选择并打印所有数据,然后您可以运行INSERT ... SELECT查询来复制其他表中的所有数据(或其他方式)。