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を追記したらエラーが解消しました!!