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

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();

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

Fatal error: Call to a member function bind_param() on a non-object in ...

问题出在哪里?

我看到两个可能的问题。

同时打开两个语句

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

在您的上下文中:PHP 尚未完成与 $query->execute(); 的第一次通话。如果您现在 运行 $query->fetch(),从数据库中提取一行并且语句阻塞连接,因为语句没有关闭。

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

多次关闭$query2

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

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

希望对您有所帮助。

可能的改进

也许您可以使用 INSERT ... SELECT-Syntax 来提高性能。 这也将删除嵌套语句。您可以先 select 并打印所有数据,然后您可以 运行 一个 INSERT ... SELECT 查询以复制另一个 table 中的所有数据(或相反)。