LoginSignup
1
0

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

Posted at

phpでtodoアプリを作っていたら
PHP Fatal error: Uncaught Error: Call to a member function prepare() on null
というエラーに出くわしたので原因と解決策を記録に残します。
結論から言うと自分の場合は$pdo = db_connect();の部分で$pdoオブジェクトが null だったためにこのエラーが発生していました。

全体コード

db_connect.phpでDBに接続するコードを書いています。
login.phpでDB接続用の関数を呼び出しています。

db_connect.php
<?php
    //DB名
    define('DB_DATABASE', 'todo-search');
    //Mysqlのユーザー名
    define('DB_USERNAME', 'root');
    //Mysqlのログインパスワード
    define('DB_PASSWORD', 'root');
    //DNS
    define('DSN', 'mysql:host=localhost;charset=utf8;dbname='.DB_DATABASE);

    function db_connect(){
        try{
            //PDOインスタンスの作成
            $pdo = new PDO(DSN, DB_USERNAME, DB_PASSWORD);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }catch(PDOException $e){
            echo $e->getMessage();
            die();
        }
    }

?>

↑この関数内ですでに間違えていますね🤫

login.php
<?php
    require('db_connect.php');

    $name = $_POST['name'];
    $password = $_POST['password'];
    $submit = $_POST['submit'];

    if(!empty($submit)){
        try{
            $pdo = db_connect();
            $sql = "SELECT * FROM users WHERE name = :name AND password = :password";
            $stmt = $pdo->prepare($sql);
            $stmt->bindParam(':name', $name);
            $stmt->bindParam(':password', $password);
            $stmt->execute();

        }catch(PDOException $e){
            echo $e->getMessage();
            die();
        }
        if($stmt->fetch(PDO::FETCH_ASSOC)){
            header("Location:main.php");
            exit;
        }else{
            echo '<font color="red">パスワードか名前に間違いがあります。</font>';
        }
    }

?>

エラーの原因

冒頭でも述べましたが、login.phpファイルの$pdoがnullになっていたことが原因でした。

db_connect.php
function db_connect(){
        try{
            //PDOインスタンスの作成
            $pdo = new PDO(DSN, DB_USERNAME, DB_PASSWORD);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            //returnが抜けてた!
            return $pdo
        }catch(PDOException $e){
            echo $e->getMessage();
            die();
        }
    }

db_connect()関数でreturnするの忘れてました、、
returnを追記したらエラーが解消しました!!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0