Php MySQL fetch_数组返回false
我对PHP非常陌生,所以我的问题可能很愚蠢,但无论如何 我有这个代码来检查是否存在一些用户和电子邮件地址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
$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;
}
}
?>