我开始使用MySQL准备,我有一个问题。
那么SELECT
和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();
我测试了这个代码,错误是:
致命错误:在非对象中调用成员函数
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
查询来复制其他表中的所有数据(或其他方式)。