“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();