Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Select with PDO调用非对象错误上的成员函数prepare()_Php_Mysql_Database_Pdo_Prepared Statement - Fatal编程技术网

PHP Select with PDO调用非对象错误上的成员函数prepare()

PHP Select with PDO调用非对象错误上的成员函数prepare(),php,mysql,database,pdo,prepared-statement,Php,Mysql,Database,Pdo,Prepared Statement,当使用PDO选择通过AJAX调用发送的数据时,我在PHP中遇到一个非对象上的成员函数prepare()调用 在StackOverflow上搜索,我找到了许多关于这个错误的答案,但没有一个能解决我的问题 奇怪的是,其他PHP文件使用相同的PDO调用并成功工作,但这一个只给了我非对象错误 需要注意的是,PDO连接与它工作的其他页面相同,因此我知道这不会导致问题 此外,我还测试了发送的AJAX数据是否正在被接收,这也正常工作 PHP代码 $mysql_user = "NotTelling"; $mys

当使用PDO选择通过AJAX调用发送的数据时,我在PHP中遇到一个非对象上的成员函数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);
}
最后,这里是当I
var_dump()
PDO连接时的输出


object(PDO)#1(0){}

要使其工作,您需要使用全局变量作用域,如下所述:

但这很快就会变得一团糟


我建议您将变量放入数组中,或者使用OOP来获得更健壮的解决方案:

这是您在类中定义变量的方式

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

    }

}

不确定它是否足够好。但它会起作用。

$dbh
未在函数中定义。修复了格式问题@andrewsiYou应该在类中定义整个内容,或者在每个需要db连接的函数中连接到db。@copilot0910-这仍然不能解决问题
$dbh
超出范围-要么将其作为参数传递到函数中,要么将其声明为全局。@blo我见过类的方法,但不知道如何实现。还有,为什么它在这个文件中不起作用,而在所有其他文件中却起作用呢?每个类中的连接都和每个函数中的连接一样糟糕。@你的常识如果你有“正确”的解决方案,为什么不共享它呢?等等,你不知道,因为有很多方法可以实现。他的所有函数都需要连接,有什么害处?还有所有类。它们必须共享一个连接,而不是创建自己的连接。这将导致与它们拥有的对象一样多的连接。只需将其设置为
函数uu构造($db){$this->db=$db;}
,然后实例化这个类,并像这样传递已经创建的$db
$obj=new someClass($db)这将使所有对象使用单一连接,而不是创建新的连接(这将很快杀死您的db服务器)。
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

    }

}