【问题标题】:Fatal error: Call to a member function prepare() on null致命错误:在 null 上调用成员函数 prepare()
【发布时间】:2020-03-11 22:38:41
【问题描述】:

我正在尝试访问类别列表及其内容。我有一个名为类别的课程。我不断收到此错误。奇怪的是,到目前为止,我已经在另外两个地方使用了相同的代码,没有任何问题。我在这里所做的只是重用代码并更改所有变量。

Fatal error: Call to a member function prepare() on null

这是我班级的代码:

    <?php

class Category {
    public function fetch_all() {
        global $pdo;

        $query = $pdo->prepare("SELECT * FROM dd_cat");
        $query->execute();

        return $query->fetchAll();
    }

    public function fetch_data($cat_id) {
        global $pdo;

        $query = $pdo->prepare("SELECT * FROM dd_cat WHERE cat_id = ?");
        $query->bindValue(1, $cat_id);
        $query->execute();

        return $query->fetch();
    }
}

?>

这是我要调用的代码:

<?php
session_start();
//Add session_start to top of each page//
require_once('includes/config.php');
require_once('includes/header.php');
include_once('includes/category.php');

?>
<link rel="stylesheet" href="css/dd.css">
    <div id="menu">
        <a class="item" href="drop_index.php">Home</a> -
        <a class="item" href="create_topic.php">Create a topic</a> -
        <a class="item" href="create_cat.php">Create a category</a>
        <div id="userbar">
<?php
    if( $user->is_logged_in() )
    {
        echo 'Hello ' . $_SESSION['user_name'] . '. Not you? <a href="logout.php">Sign out</a>';
    }
    else
    {
        echo '<a href="login.php">Sign in</a> or <a href="index.php">create an account</a>.';
    } 
?>
        </div>
    </div>

<?php

$category = new Category;
$categories = $category->fetch_all();

?>
    <div id ="wrapper">
        <h1>Categories</h1>
        <section>
            <ul>
                <?php foreach ($categories as $category) { ?>
                    <li><a href="category.php?id=<?php echo $category['cat_id']; ?>">
                        <?php echo $category['cat_title']; ?></a> 
                    </li>
                <?php } ?>
            </ul>
        </section>
    </div>
<?php
require_once('includes/footer.php');
?>

【问题讨论】:

  • var_dump($pdo), $pdo 在调用prepare 时不是对象(尚未初始化)。
  • @JandenHale:在那之前你有没有初始化一个名为$pdo的(全局)变量?
  • 在课堂上是全局的,至少我是这么认为的。

标签: php


【解决方案1】:

我也遇到了同样的问题。 对我来说,try catch 之前的 if 条件不正确。 应该是

 public static function getdb()
    {
        if(!isset(self::db)) <!-- For me it was if(isset(self::db)) i got the logic right and it worked--> 
        {
            try
            {
                
            }
            catch (PDOException $e){
                $msg = $e->getMessage();
                echo $msg;
                exit();
            }
        }
        return self::db;
    }

【讨论】:

    【解决方案2】:

    在----型号中: 添加use Jenssegers\Mongodb\Eloquent\Model as Eloquent;

    将class ----- extends Model 更改为class ----- extends Eloquent

    【讨论】:

      【解决方案3】:

      @delato468 评论必须列为对我有用的解决方案。

      除了定义参数外,用户在调用函数时也必须传递它

      fetch_data(PDO $pdo, $cat_id)
      

      【讨论】:

      【解决方案4】:

      您的 $pdo 变量似乎未初始化。 我在你上传的代码中看不到你正在初始化它的位置。

      确保在调用类方法之前在global scope 中创建一个新的 PDO 对象。 (您应该在全局范围内声明它,因为您在 Category 类中实现了方法)。

      $pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
      

      【讨论】:

      • 就是这样,我在我的配置文件中将它作为 $db 而不是 $pdo。谢谢!
      • 不要使用全局!添加你的函数: fetch_data(PDO $pdo, $cat_id)
      • 在这种情况下,它更像是一个常数。
      【解决方案5】:

      您可以尝试/捕获PDOExceptions(您的配置可能不同,但重要的部分是尝试/捕获):

      try {
              $dbh = new PDO(
                  DB_TYPE . ':host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET,
                  DB_USER,
                  DB_PASS,
                  [
                      PDO::ATTR_PERSISTENT            => true,
                      PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
                      PDO::MYSQL_ATTR_INIT_COMMAND    => 'SET NAMES ' . DB_CHARSET . ' COLLATE ' . DB_COLLATE
      
                  ]
              );
          } catch ( PDOException $e ) {
              echo 'ERROR!';
              print_r( $e );
          }
      

      print_r( $e ); 行将向您显示您需要的所有内容,例如,我最近遇到一个错误消息类似于 unknown database 'my_db' 的案例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多