我有一点(和愚蠢)问题:我正在使用mysqli和MySQL服务器构建一个PHP应用程序。加载应用程序时,使用
初始化名为$ database的变量$database = new mysqli($dbHost, $dbUser, $dbPassword, $dbName);
这当然是完美的。如果我创建一个语句来进行查询:
$stmt = $database->prepare('SELECT a, b, c FROM table WHERE a = ?');
这仍然有效。但是,如果我试图在不关闭前一个声明的情况下创建另一个声明,有时会起作用,有时甚至是现在。我在语句创建失败时得到的错误是:
Fatal error: Call to a member function bind_param() on a non-object
我的问题是:为什么?我应该怎么做,每次我想创建一个新语句时打开一个连接(新的mysql(...))(我还有另一个打开)?
示例
$stmt = $database->prepare('SELECT a, b, c FROM table WHERE a = ?');
$stmt->bind_param('i', $aValue);
$stmt->execute();
/* do some other operations, without closing $stmt */
$stmt2 = $database->prepare('INSERT INTO table2 (e, f) VALUES (? ,?)');
// Now, $stmt2 isn't initialized, so when the next line is run, the app fails
$stmt2->bind_param('ss', $someValue, $anotherValue);
如果,在
之前$stmt2 = $database->prepare('INSERT INTO table2 (e, f) VALUES (? ,?)');
我添加一个简单的
$stmt->close();
所有工作都没有任何问题。那么,问题是什么?
答案 0 :(得分:2)
在获取之前的所有结果之前,您无法再运行其他查询。否则你将不得不单独建立连接。
答案 1 :(得分:0)
你还记得bind_param&执行 ? :
$stmt->bind_param("s", $string);
$stmt->execute();
//etc..
OR
$stmt->bind_param("i", $int);
$stmt->execute();
//etc..
如果您想要多个查询:请查看multi_query