【问题标题】:Call to a member function prepare()调用成员函数 prepare()
【发布时间】:2016-12-18 21:54:49
【问题描述】:
<?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;
    }
?>

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

我不明白我是如何得到这个错误的。我已经尝试了几乎所有遇到相同问题的方法。如果你有朋友会帮助我,请写信。谢谢

PDO 模块激活,安装 mysqli 出现强错误。

【问题讨论】:

  • 你是如何使用这个fetch_data()函数的?这个和类的查询在哪里?
  • 你为什么标记为 mysqli ?
  • 查询在这里返回$data函数
  • exp。 : $data = "SELECT * FROM ....."
  • 您在下面给出了答案;问问他们。问题对我的味蕾来说太不清楚了。

标签: php mysql mysqli pdo prepare


【解决方案1】:

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

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

您的构造函数中的数据是null。因此,请检查并确保无论在何处调用 fetch_data,您传递的值不是 null

编辑:

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

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

【讨论】:

【解决方案2】:

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

仔细检查您的连接字符串。您可以从您的 PC 连接到它吗?我有点怀疑''密码。

【讨论】:

    【解决方案3】:

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

    以下是对该错误的解释:

    $pdo->prepare($data);
    

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

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

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

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

    如果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

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2015-05-22
      • 2016-06-27
      • 2014-11-21
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多