MySQL fetch_array returns false


MySQL fetch_array returns false

我是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;
    } 

当我尝试使用一个不存在的数据时,让我们说:

username = jfgsjhfsjfjhsfsfemail = hjfgsjhfjsgsdff@something.com

isEmailTaken($email)函数返回'[]'并且if为假,这是正确的!!

但是isUsernameTaken函数返回'false'所以if总是为真,这是不正确的:(

如果我现在改变代码的顺序,isUsernameTaken函数返回'[]',而另一个函数返回'false'

为什么?

PD。当我在MySQL控制台尝试它时,它工作得很好,所以错误是在PHP

我的db连接类是由@Evan de la Cruz(静态版本)提供的

正如其他人所说,作为实例成员访问静态成员可能会导致这个问题。同样,使用new关键字构造对象(例如:$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;
    }
}
?>

同样,您可以考虑将整个类设置为静态。除非你有多个不同设置的实例。但是,如果您总是只有这一个实例,那么将整个类设置为静态可能会更简洁。像这样:

<?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) {
            return false;
        }
        while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
            array_push($rows, $row);
        }
        return $rows;
    }
    public static function tryToLogin($username, $pass) {
        $q = "CALL getUserData('".$username."','".$pass."');";
        $result = self::select($q);
        return $result;
    }
}
?>

然后像这样调用这些方法:

$isEmailTaken = DBConnection::isEmailTaken("an email address");
$isUserTaken = DBConnection::isUsernameTaken("a user name");

并且永远不会实例化DBConnection。(换句话说,永远不要调用new DBConnection())解释静态类和实例类之间的区别是相当困难的,通常即使是经验丰富的PHP程序员也不知道其中的区别。(使用其他面向对象语言的程序员更容易理解它。)

但是思想是这样的:

实例类可以被"实例化"无限次。每次都会创建一个新的类实例。这叫做对象。类的每个实例可以有不同的属性,因此每个实例可以有不同的行为。

静态类不能实例化。从来没有这样的例子。不管怎样,它的功能都是一样的。有点像拥有一个单独的实例(不同之处在于没有构造函数,成员是静态访问的[即使用"self"关键字而不是"this"])

有一种模式叫做"singleton",它实际上是一个单独的实例。因此,重要的是不要将静态对象视为单个实例,尽管它们非常相似。

考虑以下情况:

案例1:你有一个名为"Person"的类,它的属性是"Name"answers"Gender"。为此,您将使用实例类,因为可以有许多人,每个人可以有不同的属性:

$john = new Person("John Doe","Male");
$joe = new Person("Joe Smith","Male");
$tina = new Person("Tina Thomson","Feale");

案例2:您有一个名为"Math"的类,其中包含Add()和Subtract()方法。加减法总是一样的。只有一种数学。不需要有多个实例。也就是说,Math是静态的。

$sum = Math::Add(1,5);
$difference = Math::Subtract(10,5);

注意,我们从未使用new Math()构造静态Math类。

编辑:我认为问题在这里:

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;
    }
}
?>