Php MySQL fetch_数组返回false

Php MySQL fetch_数组返回false,php,mysql,fetch,Php,Mysql,Fetch,我对PHP非常陌生,所以我的问题可能很愚蠢,但无论如何 我有这个代码来检查是否存在一些用户和电子邮件地址 $username = $_POST['user']; $email = $_POST['email']; $isUsernameTaken = false; $isEmailTaken = false; // check for email availability $result = DBConnection::isEmailTaken

我对PHP非常陌生,所以我的问题可能很愚蠢,但无论如何

我有这个代码来检查是否存在一些用户和电子邮件地址

    $username = $_POST['user'];
    $email = $_POST['email'];

    $isUsernameTaken = false;
    $isEmailTaken = false;

    // check for email availability
    $result = DBConnection::isEmailTaken($email);
    if(count($result) > 0) {
        $isEmailTaken = true;
        $response["error"] = 3;
    } 


    $anotherResult = DBConnection::isUsernameTaken($username);
    if(count($anotherResult) > 0) {
        $isUsernameTaken = true;
        $response["error"] = 2;
    } 
当我尝试使用不存在的数据时,让我们说:

用户名=jfgsjhfsjfjhsfsf 电子邮件=hjfgsjhfjsgsdff@something.com

ISemailtake($email)函数重新运行“[]”,如果为false,则正确

但是isUsernameTake函数返回“false”,因此if总是true,这是不正确的:(

如果我现在更改代码的顺序,isUsernameTake函数返回“[]”,而另一个函数返回“false

为什么呢

当我在MySQL控制台中尝试它时,它工作正常,所以错误在PHP中


my db connection类是由@Evan de la Cruz(静态版本)提供的。

正如其他人所说,作为实例成员访问静态成员可能会导致此问题。此外,使用新关键字构造对象(例如:$foo=new Bar();)不会导致false。它要么成功并返回构造的对象,要么失败并出现错误或异常

我不能确定这些是唯一的问题,但请尝试使用以下(更正的)代码,如果还有任何问题,请告诉我

<?php
class DBConnection {
    private static $db;
    private static $host;
    private static $user;
    private static $password;

    private static $connection;

    function __construct() {
        if (!isset(self::$connection))
        {
            self::$db = 'myDB';
            self::$host = 'localhost';
            self::$user = 'root';
            self::$password = '1234';
            self::connect();
        }
   }

   /**
    * Note: You don't really need the connect method at all, unless you are trying to get the connection
    * from outside classes.
    * You could instead just put this code in the constructor
    */
    private static function connect() {
        if(!isset(self::$connection)) {
            self::$connection = new mysqli(self::$host, self::$user, self::$password, self::$db);
        }
    }

    function isEmailTaken($email) {
        $q = "CALL isEmailTaken('".$email."');";
        $result = $this -> select($q);

        return $result;
    }

    function isUsernameTaken($username) {
        $q = "CALL isUsernameTaken('".$username."');";
        $result = $this -> select($q);

        return $result;
    }

    public function query($q) {
        $result = self::$connection -> query($q);

        return $result;
    }

    public function select($query) {
        $rows = array();

        $result = $this -> query($query);
        if($result === false) {
            return false;
        }

        while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
            array_push($rows, $row);
        }

        return $rows;
    }

    function tryToLogin($username, $pass) {
        $q = "CALL getUserData('".$username."','".$pass."');";
        $result = $this -> select($q);

        return $result;
    }
}
?>
而且您永远不会实例化DBConnection。(换句话说,永远不会调用
newDBConnection()
) 解释静态类和实例类之间的差异是相当困难的,而且通常即使是有经验的PHP程序员也不知道这两者之间的区别(使用其他OO语言的程序员往往更了解这一点)

但想法是这样的:

一个实例类可以无限次“实例化”。每一次,都会创建一个新的类实例。这就是调用一个对象。类的每个实例都可以有不同的属性,因此每个实例的行为都不同

静态类无法实例化。从来没有实例。无论发生什么,它都以相同的方式运行。这有点像只有一个实例(区别在于没有构造函数,成员是静态访问的[即使用“self”关键字而不是“this”])

有一种称为“singleton”的模式,它实际上是一个单一实例。因此,重要的是不要将静态视为一个单一实例,尽管它们非常相似

考虑以下情况:

案例1: 您有一个名为“Person”的类,其属性为“Name”和“Gender”。 为此,您将使用实例类,因为可以有许多人,每个人可以有不同的属性:

$john = new Person("John Doe","Male");
$joe = new Person("Joe Smith","Male");
$tina = new Person("Tina Thomson","Feale");
案例2: 使用Add()和Subtract()方法有一个类调用“Math”。加法和减法总是一样的。只有一种类型的数学。不需要有多个实例。也就是说,数学是静态的

注意,我们从不使用
newmath()
构造静态数学类

编辑: 我认为问题在于:

if($result === false) {
    return false;
}
我必须查看您的存储过程来解释原因。但我相当肯定这是您的问题

以下是固定版本:

<?php
class DBConnection {
    private static $db;
    private static $host;
    private static $user;
    private static $password;
    private static $connection;


    private static function connect($db,$host,$user,$password) {
        if(!isset(self::$connection)) {
            self::$db = $db;
            self::$host = $host;
            self::$user = $user;
            self::$password = $password;
            self::$connection = new mysqli(self::$host, self::$user, self::$password, self::$db);
        }
    }

    public static function isEmailTaken($email) {
        $q = "CALL isEmailTaken('".$email."');";
        $result = self::select($q);

        return $result;
    }

    public static function isUsernameTaken($username) {
        $q = "CALL isUsernameTaken('".$username."');";
        $result = self::select($q);

        return $result;
    }

    public static function query($q) {
        self::connect("myDV", "localhost", "root", "1234");
        $result = self::$connection -> query($q);
        return $result;
    }

    public static function select($query) {
        $rows = array();

        $result = self::query($query);
        if ($result !== false)
        {
            while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
                array_push($rows, $row);
            }
        } else {
            //uncomment this line to see what the underlying problem actually is.
            //die("The error from mysql is: ". self::$connection->errno . ": " . self::$connection->error);
        }

        return $rows;
    }

    public static function tryToLogin($username, $pass) {
        $q = "CALL getUserData('".$username."','".$pass."');";
        $result = self::select($q);

        return $result;
    }
}
?>

文档中的
。您的变量是
静态的
;您应该这样做。您还应该[打开错误](stackoverflow.com/questions/5438060/显示所有错误和警告#answer-5438125),以便您可以看到发生了什么问题。无法使用箭头运算符->通过对象访问From->静态属性。因此,在您第二次调用公共函数connect()时,$this->connection==false将返回false。@SverriM.Olsen谢谢!!!:)您可以发布这两个函数吗?哇!!,谢谢你的时间和解释:)我喜欢它,但问题是一样的,我用你的代码编辑了这个问题如果你想检查它,我已经添加了一个版本的代码,我相信它会给你预期的结果。但是,我仍然怀疑存储过程存在潜在问题。我添加了一个die()来向您展示这个问题,但我暂时将其注释掉了。命令不同步!非常感谢各位,我用一个multi_查询解决了这个问题,看起来很有效,非常感谢你们的帮助
$sum = Math::Add(1,5);
$difference = Math::Subtract(10,5);
if($result === false) {
    return false;
}
<?php
class DBConnection {
    private static $db;
    private static $host;
    private static $user;
    private static $password;
    private static $connection;


    private static function connect($db,$host,$user,$password) {
        if(!isset(self::$connection)) {
            self::$db = $db;
            self::$host = $host;
            self::$user = $user;
            self::$password = $password;
            self::$connection = new mysqli(self::$host, self::$user, self::$password, self::$db);
        }
    }

    public static function isEmailTaken($email) {
        $q = "CALL isEmailTaken('".$email."');";
        $result = self::select($q);

        return $result;
    }

    public static function isUsernameTaken($username) {
        $q = "CALL isUsernameTaken('".$username."');";
        $result = self::select($q);

        return $result;
    }

    public static function query($q) {
        self::connect("myDV", "localhost", "root", "1234");
        $result = self::$connection -> query($q);
        return $result;
    }

    public static function select($query) {
        $rows = array();

        $result = self::query($query);
        if ($result !== false)
        {
            while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
                array_push($rows, $row);
            }
        } else {
            //uncomment this line to see what the underlying problem actually is.
            //die("The error from mysql is: ". self::$connection->errno . ": " . self::$connection->error);
        }

        return $rows;
    }

    public static function tryToLogin($username, $pass) {
        $q = "CALL getUserData('".$username."','".$pass."');";
        $result = self::select($q);

        return $result;
    }
}
?>