致命错误:在布尔值中调用成员函数prepare()

时间:2016-06-13 19:37:35

标签: php mysql pdo

我红了几个问题,但没有人帮忙 Fatal error: Call to a member function bind_param() on boolean in - >不。
Fatal error: Call to a member function prepare() on null - >都能跟得上。
Fatal error: Call to a member function count() on boolean - >都能跟得上。
Fatal error Call to a member function prepare() on null - >都能跟得上。
fatal error call to a member function prepare() on resource - >都能跟得上。
Error: Call to a member function prepare() on a non-object - >不。我完成了..

我在PDO中使用PHP5和mySql:

Connection和Select工作正常,但Insert不想工作。
那是我的职责:

function AddNewUser($nickname, $email)
{
    ini_set('display_errors', 1); //DELETE ME
    ini_set('expose_php', 1); //DELETE ME

    $pdo = EstablishDBCon();
    echo "Subscribe user..<br/>";

    $sql = "INSERT INTO db.table (nickname, email, insertdate, updatedate) VALUES (:nickname, :email, :insertdate, :updatedate)";

    try {
        $stmt = $pdo->prepare($sql); //Error at this line
        //id?
        $stmt->bindParam(':nickname', $nickname, PDO::PARAM_STR);
        $stmt->bindParam(':email', $email, PDO::PARAM_STR);
        $stmt->bindParam(':insertdate', date("Y-m-d H:i:s"), PDO::PARAM_STR);
        $stmt->bindParam(':updatedate', null, PDO::PARAM_NULL);
        $stmt->exeute();

        CloseDBCon($pdo);
        echo "Subscribed!<br/>";
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
}

DB模式是:
id(int not null auto_inc)|昵称(varchar not null)|电子邮件(varchar not null)| insertdate(datetime)| updatedate(datetime)

我是php新手,我不明白那种错误。 我在代码中标记了引发错误的行:

$stmt = $pdo->prepare($sql); //Error at this line

有人可以帮助我吗?

提前致谢!

//编辑: 连接又名db_connection.php:

<?php
echo 'Establishing MySQL Connection<br/>';

$pdo = null;
$dsn = 'mysql: host=xx; dbname=xx';
$dbUser = 'xx';
$pw = 'xx';

try {
    $pdo = new PDO($dsn, $dbUser, $pw);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Connection established.<br/>';
}
catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

return $pdo;
?>

这是EstablishDBCon功能:

function EstablishDBCon()
{
    $pdo = include_once 'db_connection.php';
    return $pdo;
}

3 个答案:

答案 0 :(得分:1)

重用函数的最佳方法是将其放在包含文件中,然后将其包含在您需要它的每个文件的顶部。因此,在db_connection.php内,创建您的函数:

function EstablishDBCon()
{
    $pdo = false;
    try{ 
         // Put your PDO creation here
    } catch (Exception $e) {
        // Logging here is a good idea
    }
    return $pdo;

}

现在您可以在任何需要的地方使用该功能。确保在使用之前始终确保$pdo !== false,以确保您的连接没有失败。

答案 1 :(得分:0)

在这种情况下,

Call to a member function on boolean表示$pdo不是对象,它是布尔值。因此EstablishDBCon()可能会在成功时返回true,否则返回false,而不是数据库资源。仔细检查该功能的文档。这是指向some relevant documentation on PDO that you'll need的链接。

答案 2 :(得分:0)

问题在于函数EstablishDBCon(),它期望include_once语句返回一个值,好像所包含文件的内容是一个函数一样。

function EstablishDBCon()
{
    $pdo = include_once 'db_connection.php';
    return $pdo;
}

但这不是how include_once works

  

如果已包含文件中的代码,则不会再次包含该代码,并且include_once会返回TRUE

这就是为什么你最终在TRUE变量中使用$pdo(布尔值)的原因。

无论如何,这种结构使您的代码很难遵循。 我建议只使用include和朋友将自包含的PHP函数组合在一起,或者将HTML页面的部分嵌入到彼此中。