2013-08-19 46 views
-2

當我使用PDO選擇通過AJAX調用發送的數據時,我的PHP中出現Call to a member function prepare() on a non-object錯誤。PHP選擇PDO調用成員函數prepare()對非對象錯誤

在StackOverflow上搜索我發現了很多這個錯誤的答案,但都沒有解決我的問題。

奇怪的是,其他PHP文件使用相同的PDO調用,併成功地工作,但這只是給我的非對象錯誤。

請注意,PDO連接與其他工作網頁相同,所以我知道這不會導致問題。

此外,我測試了發送的AJAX數據正在接收,這也正在工作。

PHP代碼

$mysql_user = "NotTelling"; 
$mysql_password = "DefinatelyNotThis"; 
try 
{ 
    $dbh = new PDO("mysql:host=somehost;dbname=somename", $mysql_user, $mysql_password); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $username = $_POST['username']; 
    $inPword = $_POST['password']; 
    $lat = $_POST['lat']; 
    $lon = $_POST['lon']; 

    $loggedin = ""; 
    $password_hash = ""; 
    $loggedinstatus = ""; 
    $pts = ""; 

    function getLoginInfo() 
    { 
     $sth = $dbh -> prepare('SELECT pword, loggedin, points FROM login WHERE uname = :uname'); 
     $sth->bindParam(':uname', $username, PDO::PARAM_STR); 
     while($row = $sth->fetch(PDO::FETCH_ASSOC)) 
     { 
      echo $row['pword']; 
      echo $row['loggedin']; 
      echo $row['points']; 
     } 
     $password_hash = $fetch['pword']; 
     $loggedinstatus = $fetch['loggedin']; 
     $pts = $fetch["points"]; 

     if($password_hash === null || $loggedinstatus === null || $pts === null) 
     { 
      die(json_encode(array("message" => "none"))); 
     } 
     else 
     {   
      return "more"; 
     } 
    } 

    function checkLoginCreds() 
    { 
     if(crypt($inPword, $password_hash) === $password_hash) 
     { 
      switch($loggedinstatus) 
      { 
       case "no":   
        $sel = $dbh->prepare("UPDATE login SET loggedin='yes' WHERE uname = ?"); 
        $sel->execute(array($username)); 
        return "AllGood"; 
        break; 

       defaut: 
        return "alreadyin"; 
        break; 
      } 
     } 
     else 
     { 
      return "BadLogin"; 
     } 
    } 

    if(getLoginInfo() === "more") 
    { 
     echo json_encode(array("message" => checkLoginCreds())); 
    } 

    getLoginInfo(); 
} 
catch(PDOException $e) 
{ 
    echo $e->getMessage(); 
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); 
} 

最後,這裏的輸出,當我var_dump() PDO的連接。

object(PDO)#1 (0) {}

+1

'$ dbh'沒有在你的函數中定義。 – andrewsi

+0

固定格式@andrewsi – copilot0910

+0

你應該定義整個事情在一個類或連接到數據庫中的每個功能,需要DB連接.. –

回答

1

對於這個工作,你需要使用全局變量的作用域,這裏解釋:http://php.net/manual/en/language.variables.scope.php

$mysql_user = "NotTelling"; 
$mysql_password = "DefinatelyNotThis"; 
try 
{ 
    $dbh = new PDO("mysql:host=somehost;dbname=somename", $mysql_user, $mysql_password); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $username = $_POST['username']; 
    $inPword = $_POST['password']; 
    $lat = $_POST['lat']; 
    $lon = $_POST['lon']; 

    $loggedin = ""; 
    $password_hash = ""; 
    $loggedinstatus = ""; 
    $pts = ""; 

    function getLoginInfo() 
    { 
     global $dbh, $username, $password_hash, $loggedinstatus, $pts; 

     $sth = $dbh -> prepare('SELECT pword, loggedin, points FROM login WHERE uname = :uname'); 
     $sth->bindParam(':uname', $username, PDO::PARAM_STR); 
     while($row = $sth->fetch(PDO::FETCH_ASSOC)) 
     { 
      echo $row['pword']; 
      echo $row['loggedin']; 
      echo $row['points']; 
     } 
     $password_hash = $fetch['pword']; 
     $loggedinstatus = $fetch['loggedin']; 
     $pts = $fetch["points"]; 

     if($password_hash === null || $loggedinstatus === null || $pts === null) 
     { 
      die(json_encode(array("message" => "none"))); 
     } 
     else 
     {   
      return "more"; 
     } 
    } 

    function checkLoginCreds() 
    { 
     global $dbh, $inPword, $password_hash, $loggedinstatus, $username; 

     if(crypt($inPword, $password_hash) === $password_hash) 
     { 
      switch($loggedinstatus) 
      { 
       case "no":   
        $sel = $dbh->prepare("UPDATE login SET loggedin='yes' WHERE uname = ?"); 
        $sel->execute(array($username)); 
        return "AllGood"; 
        break; 

       defaut: 
        return "alreadyin"; 
        break; 
      } 
     } 
     else 
     { 
      return "BadLogin"; 
     } 
    } 

    if(getLoginInfo() === "more") 
    { 
     echo json_encode(array("message" => checkLoginCreds())); 
    } 

    getLoginInfo(); 
} 
catch(PDOException $e) 
{ 
    echo $e->getMessage(); 
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); 
} 

但是,這可能會導致混亂的非常快。

我建議你把變量數組或使用OOP一個更強大的解決方案:http://php.net/manual/en/language.oop5.php

0

這是如何在一個類中定義它..

class someClass { 

    private $db; 

    public function __construct(){ 


      $this->dbconnect(); 

    } 

    private function dbconnect() { 

     try { //try connection 

     $dbh = new PDO('mysql:host=localhost;dbname=somenane', 'usernane', 'pass'); 

     $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $this->dbh = $dbh; 

     } catch (Exception $e) { //connection failed 

     die("Oh no! It seems we took too long to respond"); 

     } 

    } 

    public function getLoginInfo() { 

     $sth = $this->dbh->prepare('SELECT pword, loggedin, points FROM login WHERE uname = :uname'); 
     $sth->bindParam(':uname', $username, PDO::PARAM_STR); 

     //cont the code 

    } 

} 

不知道,如果是足夠好..但它會工作..

+1

每個班級的連接和每個功能一樣糟糕。 –

+0

@YourCommonSense如果你有「正確」的解決方案,你爲什麼不分享它?等等,你**不要**,因爲有很多方法可以解決這個問題。 – copilot0910

+1

他所有的功能都需要連接,有什麼危害? –

相關問題