【发布时间】:2016-02-21 13:14:09
【问题描述】:
我以前见过这个问题,但所有的解决方案都不适合我。主要的解决方案是存储我已经做的结果。大多数人说我正在运行 2 个我不理解的同时查询。我可能不止一次使用下面的这个函数,但我总是释放并关闭语句,所以不知道为什么会发生这种情况。
您很可能会忽略函数的上半部分,它只生成一个字符串来表示类型。这是我制作的完整 DB 类:
(我在最初发布它后对其进行了编辑,并将 self::$connection 替换为 self::$db)
class DB {
private static $dbhost = "localhost";
private static $dbuser = "some_user"; // placeholder
private static $dbpass = "some_assword"; // placeholder
private static $dbname = "database_name"; // placeholder
private static $db;
public static function connect() {
self::$db = new mysqli(self::$dbhost, self::$dbuser, self::$dbpass, self::$dbname);
if (self::$db->connect_errno) {
die("Database mysqli failed: " .
self::$db->connect_error . " (" .
self::$db->connect_errno . ")"
);
}
}
// IGNORE THIS! It just formats the parameters for the
// call_user_func_array function to work correctly.
private static function getBindings(&$params) {
$types = "";
$bindings = array();
foreach ($params as $value) {
switch (gettype($value)) {
case "integer":
$types .= "i";
break;
case "double":
$types .= "d";
break;
case "string":
$types .= "s";
break;
default:
$types .= "s";
break;
}
}
foreach($params as $key => $value)
$bindings[$key] = &$params[$key]; // assign to references (because bind_param requires references)
// to add a string of variable types to the start of the $bindings array (such as 'sss')
array_unshift($bindings, $types);
return $bindings;
}
public static function query($query, $params) {
if (!isset(self::$db)) { self::connect(); }
if (empty($params)) {
// prepared statement not needed
return self::$db->query($query);
}
$successful = false;
$bindings = self::getBindings($params);
// MySQL prepared statement execution:
$statement = self::$db->prepare($query);
call_user_func_array(array($statement, 'bind_param'), $bindings);
$statement->execute();
$statement->store_result();
if ($statement->num_rows > 0) {
// for select queries
$successful = $statement->get_result(); // does not work! (returns boolean)
echo self::$db->errno; // 2014
echo "<br />";
echo self::$db->error; // Commands out of sync; you can't run this command now
echo "<br />";
// this method works fine (but I need to return the result set!):
/*$name = false; $link = false;
$statement->bind_result($name, $link);
while ($statement->fetch()) {
echo 'name: '.$name.'<br>';
echo 'link: '.$link.'<br>';
}*/
} else if ($statement->affected_rows > 0) {
// for insert queries
$successful = true;
}
$statement->free_result();
$statement->close();
return $successful;
}
public static function close() {
if (isset(self::$db)) self::$db->close();
}
}
编辑:这是我的一个请求的样子(我已经使用我的 DB 类和 DB::query(...) 函数在同一页面上查询了 2 个请求):
$result = DB::query("SELECT * FROM table_name;");
if ($result) {
while ($row = $result->fetch_assoc()) {
// do stuff
}
$result->close();
}
【问题讨论】:
-
这是否与您同时使用
store_result和get_result的事实有关? -
@ethrbunny 不,我不这么认为。文档说您需要先存储它,然后 get_result 只检索存储的内容。
-
mysqli - get_result - "调用以从准备好的语句查询返回结果集"
-
是的,但除非您先存储它,否则它不会返回任何内容。 store_result 说:“您必须为每个成功生成结果集的查询调用 mysqli_stmt_store_result()”和“从准备好的语句中传输结果集”。 store_result 只返回一个布尔值来标记它是否成功,而不是一个结果集。