加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

使用php singleton的几个mysqli查询

发布时间:2020-12-13 16:59:49 所属栏目:PHP教程 来源:网络整理
导读:我有一个非常常见的 mysqli类,为应用程序的其余部分提供数据库连接: class IabDB extends mysqli {private static $instance = null;// db connection config varsprivate $user = "xxx-lit";private $pass = "xxx";private $dbName = "xxx";private $dbHos
我有一个非常常见的 mysqli类,为应用程序的其余部分提供数据库连接:

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,那么最好实现基于依赖注入的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读