我是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(静态版)提供的
答案 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;
}
}
?>