3

我有一个小(而且很愚蠢)的问题:我正在使用 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();

所有作品都没有任何问题。那么,问题是什么?

4

2 回答 2

2

在从前一个获取所有结果之前,您不能运行另一个查询。否则,您将不得不进行单独的连接。

于 2012-08-08T18:40:19.430 回答
0

你还记得 bind_param & execute 吗?:

$stmt->bind_param("s", $string);
$stmt->execute();
//etc..

或者

$stmt->bind_param("i", $int);
$stmt->execute();
//etc..

如果您想要多个查询:查看multi_query

于 2012-08-08T17:22:49.903 回答