1. ホーム
  2. php

[解決済み] 致命的なエラー メンバ関数 prepare() の NULL での呼び出し

2022-02-18 13:38:39

質問

Registration で email が既に使用されているかどうかを確認しようとしています。学校で作業していたときはうまくいっていたのですが、今は突然エラーが表示されます。

致命的なエラーです。メンバ関数prepare()のnullでの呼び出し

を含めるために使用しています。

define("dbserver", "localhost");
define("dbuser", "user");
define("dbpass", "");
define("dbname", "user");    


$db = new PDO(
"mysql:host=" .dbserver. ";dbname=" .dbname,dbuser,
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8"
) );

この中に

session_start();
include "DBjoin.php";
if(isset($_POST["email"])) {
  $_SESSION['email'] = $_POST["email"];
  }   
if(isset($_POST["nick"])) {
  $_SESSION['nick'] = $_POST["nick"];         
}    
if(isset($_POST["pass"])) {
  $_SESSION['pass'] = $_POST["pass"];
  $_SESSION['pass'] = base64_encode($_SESSION['pass']);    
}
$sthandler = $db->prepare("SELECT Email FROM Registrace WHERE Email =     :email");
$sthandler->bindParam(':email', $_SESSION['email']);
$sthandler->execute();               
if(filter_var($_SESSION['email'], FILTER_VALIDATE_EMAIL)) {
if($sthandler->rowCount() > 0){
      echo "Email is used";}

解決方法は?

編集する。 (解った)。

あなたのコードが動作しない理由がようやくわかり、私の最初の回答が当てはまらなくなったので、抹消しました。

接続がうまくいかない理由は、接続の際に dbpass 定数を接続パラメータから削除してください。

$db = new PDO(
"mysql:host=" .dbserver. ";dbname=" .dbname,dbuser,dbpass,
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8"
) );


当初の回答、当てはまらなくなりました。(上記の編集を参照)。

<ストライク ちなみに、努力の甲斐あって、このエラーを再現することはできませんでした。

<ストライク

しかし、これをいじった結果、PDO ( 少なくとも、私のサーバーにあるものは を使用することはできません。 定数 は、DSN の最初の 2 つのパラメータとして使用されます。

補足 もし、あなたが言うことがあなたの学校でうまくいったのなら、私の知らない設定が使われているかもしれませんね。

ただし、定数に変数を代入して、その変数をDSNで使用することはできます。

$servername = "localhost";
$dbname = "user";

define("dbuser", "user");
define("dbpass", "");

$dsn = "mysql:host=$servername;dbname=$dbname";

$username = dbuser; // variable equals constant
$password = dbpass; // variable equals constant

$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8"
); 

$db = new PDO($dsn, $username, $password, $options);

PDO接続の詳細については、こちらをご覧ください。

<ストライク


追加 エラー報告 をファイルの先頭に追加することで、エラーを発見しやすくなります。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

参考までに エラーレポートはステージングでのみ行うべきで、プロダクションでは決して行わないでください。