在PHP中只连接一次MySQL

时间:2014-06-12 18:41:03

标签: php mysql mysqli

我正在尝试按照其他人的指示连接到MySQL一次。

$db = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$get_projects = $db->prepare("SELECT * FROM tasks WHERE user = ? ORDER BY weight DESC");
$get_projects->bind_param('i', $sessionUser);
$result = $get_projects->execute();
    while ($row = mysqli_fetch_assoc($result)) {
        // stuff

这是

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in

我的旧代码就像这样,并且有效

$get_projects = Database::connect()->prepare("SELECT * FROM tasks WHERE user = ? ORDER BY weight DESC");
$get_projects->bind_param('i', $sessionUser);
    if ($result = $get_projects->execute())
        //stuff

为什么这不按预期工作?

更多信息:

$sessionUser = $_SESSION['user_id'];

这是在一个单独的函数中定义的。但硬编码不起作用,如此

$get_projects = $db->prepare("SELECT * FROM tasks WHERE user = 1 ORDER BY weight DESC");
// $get_projects->bind_param('i', 1);
$result = $get_projects->execute();
    while ($row = mysqli_fetch_assoc($get_projects))

注意我按照以下建议添加了mysqli_fetch_assoc($get_projects)

2 个答案:

答案 0 :(得分:2)

$result = $get_projects->execute();

while ($row = mysqli_fetch_assoc($result)) {
    // stuff

execute()方法返回mysqli_result资源。

execute()方法返回一个布尔值,无论是true还是false,表示语句执行是成功还是发生错误。因此将返回值传递给mysqli_fetch_result()是不正确的。你可以理解得到以下错误:

  

警告:mysqli_fetch_assoc()期望参数1为mysqli_result,布尔值在

中给出

相反,使用语句资源中的get_result()并从中开始提取。

示例:

$success = $get_projects->execute();
if (!$success) {
    // die() may not be how you want to report errors, this is just an example
    die($db->error);
}

$result = $get_projects->get_result();
while ($row = mysqli_fetch_assoc($result)) {
    // stuff

这似乎是一个多余的步骤,即为什么不执行()返回结果?因为并非所有可以执行的语句都有结果。您可以执行INSERT或CREATE TABLE或其他操作。只有SELECT和SHOW以及CALL等语句才有结果集。

注意: get_result()方法需要mysqlnd driver,这在PHP 5.3中是可选的,默认情况下在PHP 5.4中启用。如果您使用的是旧版本的PHP,则需要升级!

答案 1 :(得分:0)

好。虽然问题正文中的问题不是真实的(因为看起来你要么无法判断你的代码是否有效或者无法复制和粘贴它 - 从你的问题中不清楚),这里有一个标题的答案,因为它的重量。

class Database
{
    private static $db;

    function connect()
    {
        if (static::$db === NULL)
        {
            static::$db = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
        }
        return $db;
    }
}

以这种方式书写它只会连接一次,无论它被称为

多少次