【问题标题】:How can I use mysqli_query inside PHP class?如何在 PHP 类中使用 mysqli_query?
【发布时间】:2015-03-25 21:46:44
【问题描述】:

如何在User 类中使用$connect 变量而不发送$connect 作为参数或在用户类中定义global $connect

而我只想创建一个连接是

$connect = mysqli_connect('localhost', 'root', '1234', 'mydatabase');

错误

警告: mysqli_query() 期望参数 1 为 mysqli,在 第 9 行的 D:\xampp\htdocs\mateocode\index.php 中给出 null

示例代码

<?php
    class User {    
        public $id;
        public $username;
        function __construct($user_id)
        {   
        $sql = "select id, username from user where id = '$user_id' limit 1";

        $result = mysqli_query($connect, $sql);    
        if(!$result) return false;

        if(mysqli_num_rows($result)>0){
            $data = mysqli_fetch_assoc($result);
            $this->id = $data['id'];
            $this->username = $data['username'];
        }else{ 
            return false; 
        }   
    }
}

$connect = mysqli_connect('localhost', 'root', '1234', 'mydatabase');

if($objUser = new User(1))
    echo $objUser->username;
else 
    echo 'There was an error or user not found!'; 

【问题讨论】:

  • 正如 sgt 所说,“正确的方法”是在构造函数中将 $connect 作为参数传递。这通常被认为是“最佳实践”,将帮助您跟踪代码中变量的来源。
  • 使用$connect作为参数实际上被认为是好的做法(谷歌为“依赖注入”)。例如,它使您的代码更易于测试。
  • 除了发送$connect 给班级还有其他方法吗?我知道这项工作,但我不想这样做,因为我担心当我有很多课程时它会增加内存使用量。
  • 如果有上千个类,在User 类中使用global $connect 会增加搜索$connect 变量的时间。

标签: php mysql database mysqli


【解决方案1】:

试试 -

<?php
    class User {    
        public $id;
        public $username;
        function __construct($user_id, $connect)
        {   
        $sql = "select id, username from user where id = '$user_id' limit 1";

        $result = mysqli_query($connect, $sql);    
        if(!$result) return false;

        if(mysqli_num_rows($result)>0){
            $data = mysqli_fetch_assoc($result);
            $this->id = $data['id'];
            $this->username = $data['username'];
        }else{ 
            return false; 
        }   
    }
}

$connect = mysqli_connect('localhost', 'root', '1234', 'mydatabase');

if($objUser = new User(1, $connect))
    echo $objUser->username;
else 
    echo 'There was an error or user not found!';

【讨论】:

  • 有没有其他方法不发送$connect 到班级?我知道这项工作,但我不想这样做。
  • @Marcus 为什么不想使用依赖注入?这被认为是一种很好的做法。
  • 然后你可以定义一个基类来定义连接并扩展该类。
  • 我担心当我有很多类时它会增加内存使用量。
  • 然后你就可以让它全球化了。
猜你喜欢
  • 2015-12-22
  • 2015-12-01
  • 2015-06-19
  • 2013-03-16
  • 1970-01-01
  • 2019-06-21
  • 2023-01-29
  • 2018-05-04
  • 2014-11-10
相关资源
最近更新 更多