调用成员函数 prepare()

Call to a member function prepare()

<?php
date_default_timezone_set('Europe/Istanbul');
try{
$db_host = 'localhost';
$db_name = 'db_name';
$db_kadi = 'root';
$db_sifre = '';

$pdo = new PDO("mysql:host=".$db_host."; dbname=".$db_name, $db_kadi, $db_sifre, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}catch(PDOException $hata){
    if($hata->getCode() == "1044"){
        die("<h4>Sistem Bağlantı Hatası</h4><p>Sistem bağlantısı yok !</p>");
    }else if($hata->getCode() == "1049"){
        die("<h4>Database Sistem Hatası</h4><p>Database bağlantısı yok !</p>");
    }
}

?>

<?php
        public function fetch_data($data){
        global $pdo;
        $query = $pdo->prepare($data);
        $query->closeCursor();
        $query->execute();
        return $query->fetch(PDO::FETCH_ASSOC);
        $query->null;
    }
?>

致命错误:调用成员函数 prepare() on null in

我不明白我是怎么得到这个错误的。我几乎尝试了所有遇到同样问题的方法。如果您有朋友可以帮助我,请写信。谢谢

PDO 模块激活,安装 mysqli 时出现严重错误。

发生这种情况的原因是 $data 为空。在此处准备语句时 ~>

$query = $pdo->prepare($data);

来自构造函数的数据是 null。因此,请仔细检查并确保在调用 fetch_data 的任何地方您传递的值不是 null.

编辑:

因为PDO为空。您的设置方式一定有问题,因为 global 参考应该让您可以访问 PDO.

以此为参考:http://www.w3schools.com/php/php_mysql_prepared_statements.asp

嗯,首先,错误是 $pdo(即使您使用的是全局范围)为空。在您的尝试中,您正在设置 $pdo 变量,但如果失败,则永远不会设置 $pdo。如果 $hata->getCode() 不是 return "1044" 或 "1049",线程永远不会死。

仔细检查您的连接字符串。你能从你的电脑上连接到它吗?我有点怀疑''密码。

致命错误:调用成员函数 prepare() on null

错误的解释如下:

$pdo->prepare($data);

只有当 $pdo 是具有该方法的 class 的对象时,您才能从 $pdo 调用方法。在这种情况下,$pdonull,它不是对象的类型。 null 没有方法,因此尝试调用 null 上的任何方法都是致命错误。

这个问题的原因是,当您获得 PDO 连接时,您只检查错误代码 1044 和 1049。如果任何其他错误代码是导致异常的原因,那么您的代码不会调用 die(),它继续到第二个代码块。

但是 $pdo 仍然没有设置为有效的数据库连接!

这就像您在 phone 上给某人打电话,但您的手机 phone 没有信号。但你还是开始和你的朋友说话?!?

如果catch()块中的代码正在执行,则表示出错了,new PDO()没有成功。您必须以一种或另一种方式在 catch() 块中调用 die()

要解决此问题,我会推荐以下内容。在您的 catch() 块中,确保在块末尾调用 die(),无论错误代码是什么(下面的示例)。

我还建议您将异常消息保存到错误日志中。这是为了帮助您排除故障。不要在 HTML 输出中向用户显示错误,因为他们无论如何都不知道该错误的含义。但是您可以在 PHP 错误日志(通常是 Apache 错误日志)中查找它。

<?php
date_default_timezone_set('Europe/Istanbul');
try{
    $db_host = 'localhost';
    $db_name = 'db_name';
    $db_kadi = 'root';
    $db_sifre = '';
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_kadi, $db_sifre, 
        array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
} catch (PDOException $hata) {
    error_log($hata->getMessage()); // log the error!
    if ($hata->getCode() == "1044") {
        die("<h4>Sistem Bağlantı Hatası</h4><p>Sistem bağlantısı yok !</p>");
    } else if ($hata->getCode() == "1049") {
        die("<h4>Database Sistem Hatası</h4><p>Database bağlantısı yok !</p>");
    }
    // make sure to call die() if any other error code occurs!
    die("<h4>Database Sistem Hatası</h4><p>Veritabanı yöneticisine başvurun !</p>"
}

?>

执行此操作后,您可以保证 $pdo 有效,否则代码已调用 die() 并且不会尝试使用无效的 $pdo.