-2

PDO を使用してCall to a member function prepare() on a non-objectAJAX 呼び出しで送信されたデータを選択すると、PHP でエラーが発生します。

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) {}

4

2 に答える 2

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

于 2013-08-19T19:35:57.047 に答える
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

    }

}

それが十分かどうかはわかりません..しかし、それはうまくいくでしょう..

于 2013-08-19T19:36:59.723 に答える