2015-06-03 41 views
1

我試圖檢查電子郵件是否已在註冊中使用。它運作良好時,我的工作就可以在學校,但現在卻突然顯示了一個錯誤:致命錯誤調用成員函數prepare()null

Fatal error: Call to a member function prepare() on 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";} 
+0

商店$ DB在一個全局變量,試試吧 –

+3

@KA_lin爲什麼不直接通過他們的功能呢?全球往往被壓低。另外,它不用於一個功能,所以沒有用。 –

+0

連接失敗。查找錯誤消息 –

回答

5

編輯:(我明白了)。

我終於明白了爲什麼你的代碼不能正常工作,我的原始答案不再適用,而我已經被擊潰了。

連接無法正常工作的原因是因爲您忽略了連接參數中的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" 
)); 

原來的答覆,這不再適用。 (見上面的編輯)。

TBH,我沒有能力重現錯誤,在一個很大的努力。

但是;經過修改後,發現PDO(至少是,我服務器上的一個)將不允許constants被用作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連接的更多信息,請訪問:


添加error reporting到您的文件(S)的頂部這將幫助找到錯誤。

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

// rest of your code 

旁註:錯誤報告只應在分期完成,並且從不生產。

+0

你應該使用try/catch語句來處理PDOException,它會立即指出你的密​​碼是錯誤的,看到這個答案:http://stackoverflow.com/a/36287723/ 591257 – aesede

相關問題