“Uncaught Error: Call to a member function prepare() on null…”PDOを使った変数渡しのミス
下記のコードはtestテーブルにユーザー情報を入れようとしていますが、タイトルのようにエラーが表示されています。
原因はinsert_users()
にある$pdo
の変数がローカルスコープ変数であるためでした。関数の内部で使用する場合は関数内部でグローバル変数として宣言することで解決できました。
問題のソースコード
<?php
$db_host_db = 'localhost';
$db_name = 'test';
$db_user = 'root';
$db_pass = 'root';
try{
$pdo = new PDO('mysql:host=localhost;dbname=test', $db_user, $db_pass);
}catch(PDOException $e){
die("DB err: " . $e->getMessage());
}
$firstname = 'Kento';
$lastname = 'Tanaka';
$username = 'prfnv';
$password = 'poteto';
$hash = password_hash($password, PASSWORD_DEFAULT);
insert_users($firstname, $lastname, $username, $hash);
// INSERT SQL
function insert_users($firstname, $lastname, $username, $password){
$stmt = $pdo->prepare('insert into users (firstname, lastname, username, password) values (?, ?, ?, ?)');
$stmt->bindParam(1, $firstname, PDO::PARAM_STR, 32);
$stmt->bindParam(2, $lastname, PDO::PARAM_STR, 32);
$stmt->bindParam(3, $username, PDO::PARAM_STR, 32);
$stmt->bindParam(4, $password, PDO::PARAM_STR, 225);
$stmt->execute([$firstname, $lastname, $username, $password]);
}
エラーの解決方法
関数内で関数外の変数を使用する場合はglobal
宣言をする。
<?php
// INSERT SQL
function insert_users($firstname, $lastname, $username, $password){
global $pdo; //グローバル宣言
$stmt = $pdo->prepare('insert into users (firstname, lastname, username, password) values (?, ?, ?, ?)');
$stmt->bindParam(1, $firstname, PDO::PARAM_STR, 32);
$stmt->bindParam(2, $lastname, PDO::PARAM_STR, 32);
$stmt->bindParam(3, $username, PDO::PARAM_STR, 32);
$stmt->bindParam(4, $password, PDO::PARAM_STR, 225);
$stmt->execute([$firstname, $lastname, $username, $password]);
}
変数のスコープについて
ユーザー定義関数内の変数の有効範囲は、関数内部に制限される。例えば下記のコードを実行しても"PHP"
を出力をしません。
<?php
$php = "PHP";
function hoge(){
echo $php;
}
hoge();
ユーザー定義内で外部の変数を使用したい場合はglobal $php
と宣言してあげることで外部の変数を使用することができます。
$php = "PHP";
function hoge(){
global $php;
echo $php;
}
hoge();