class IabDB extends mysqli { private static $instance = null; // db connection config vars private $user = "xxx-lit"; private $pass = "xxx"; private $dbName = "xxx"; private $dbHost = "xxx"; private function __construct() { parent::__construct($this->dbHost,$this->user,$this->pass,$this->dbName); if (mysqli_connect_error()) { exit('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); } mysqli_set_charset($this,"utf8"); } public static function getInstance() { if (!self::$instance instanceof self) { self::$instance = new self; } return self::$instance; }
在我的模型中,我检索这样的数据很好地工作:
$db = IabDB::getInstance(); $query = $db->query("SELECT status,username,email,id FROM " . $table); $items = $query->fetch_all();
编辑
但是当我尝试为另一个查询获取另一个实例时,我收到错误消息:在null上调用成员函数fetch_all().
相信我:我来回试了一下.两个查询都有效,如果只使用其中一个查询,则返回结果.仅仅为了完整起见,这是第二个模型:
class Model { public static function getItems($table) { $db = IabDB::getInstance(); $query = $db->query("SELECT * FROM lit_veranstaltungen"); $items = $query->fetch_all(); $db->close(); var_dump($items);
}
}
所以似乎第二个连接不知何故被打扰了!?
奖金问题:从我的知识来看,显然现在大多数人都嘲笑单身模式似乎对这个目的有好处吗?
非常感谢任何帮助和选择!
解决方法
$db = IabDB::getInstance(); $query = $db->query("SELECT name FROM users limit 1"); $items = $query->fetch_all(); var_export($items); $db = IabDB::getInstance(); $query = $db->query("SELECT name FROM users limit 1,1"); $items = $query->fetch_all(); var_export($items);
回报
array ( 0 => array ( 0 => 'John',),) array ( 0 => array ( 0 => 'Mike',)
因此,我认为您运行的特定查询存在错误.因此,您需要为查询提供更好的错误报告.将构造函数更改为此
private function __construct() { mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); parent::__construct($this->dbHost,$this->dbName); $this->set_charset("utf8"); }
然后确保您的PHP配置如下
error_reporting(E_ALL); ini_set('display_errors',1);
然后再次运行您的代码.
它将报告错误或返回空数组.在后一种情况下,它意味着数据库中没有与您的第二个查询条件匹配的行.例如,对于像这样的代码
$db = IabDB::getInstance(); $query = $db->query("SELECT name FROM users WHERE 1=0"); $items = $query->fetch_all(); var_export($items); $db = IabDB::getInstance(); $query = $db->query("SELECT name FOrM users"); $items = $query->fetch_all(); var_export($items);
它将返回第一个片段的空数组和第二个片段的错误:
array ()
Fatal error: Uncaught exception ‘mysqli_sql_exception’ with message ‘You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘users’ at line 1′
另外,我建议你添加这样的功能
public function query_params($query,$params,$types = NULL) { $statement = $this->prepare($query); $types = $types ?: str_repeat('s',count($params)); $statement->bind_param($types,...$params); $statement->execute(); return $statement->get_result(); }
这将允许您像使用PDO一样轻松地使用预准备语句:
$user = $db->query_params("SELECT * FROM users WHERE name = ?",['Mike'])->fetch_assoc();
关于singleton,如果你使用的是旧式程序PHP,那么singleton就可以了.如果您正在使用OOP,那么最好实现基于依赖注入的方法.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。