MySQL fetch_array返回false

时间:2014-08-24 01:26:17

标签: php mysql fetch

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

isEmailTaken($ email)功能返回' [] '如果是假的,那就更正了!!!

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

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

为什么?

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

我的数据库连接类是由@Evan de la Cruz(静态版)提供的

1 个答案:

答案 0 :(得分:1)

正如其他人所说,访问静态成员作为实例成员可能会导致问题。此外,使用 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程序员也不知道差异。 (其他OO语言的程序员倾向于更好地理解它。)

但这个想法是这样的:

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

无法实例化静态类。从来没有一个实例。无论如何,它的功能都是一样的。它有就像有一个单独的实例(不同之处在于没有构造函数,并且静态访问成员[即使用“self”关键字而不是“this”])

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

考虑以下情况:

案例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”的类。添加和减去总是一样的。只有一种类型的数学。不需要有多个实例。也就是说,Math是 static

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