【问题标题】:include MySQL config file inside PHP class [duplicate]在 PHP 类中包含 MySQL 配置文件 [重复]
【发布时间】:2018-04-12 05:24:51
【问题描述】:

我想在 PHP 类中包含 MySQL 配置文件。

<?php
class User {
    private $dbHost     = "localhost";
    private $dbUsername = "root";
    private $dbPassword = "";
    private $dbName     = "gic";
    private $userTbl    = 'users';

    function __construct(){
        if(!isset($this->db)){
            // Connect to the database
            $conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName);
            if($conn->connect_error){
                die("Failed to connect with MySQL: " . $conn->connect_error);
            }else{
                $this->db = $conn;
            }
        }
    }

    function checkUser($userData = array()){
        if(!empty($userData)){

            $host  = $_SERVER['HTTP_HOST'];
            $host_upper = strtoupper($host);
            $path   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
            $baseurl = "http://" . $host . $path ."/";


            $prevQuery = "SELECT * FROM ".$this->userTbl." WHERE oauth_provider = '".$userData['oauth_provider']."' AND oauth_uid = '".$userData['oauth_uid']."'";
            $prevResult = $this->db->query($prevQuery);

           <!-- rest of my code --> 
        }
    }
}

当我运行这个文件时,它工作正常,但我想将 MySQL 数据库连接分离到另一个文件 (config.php),所以我编辑了我的代码:

<?php
class User {

include 'config.php';

$connection = new createCon();
$conn = $connection->connect();

function checkUser($userData = array()){
    if(!empty($userData)){

        $host  = $_SERVER['HTTP_HOST'];
        $host_upper = strtoupper($host);
        $path   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
        $baseurl = "http://" . $host . $path ."/";


        $prevQuery = "SELECT * FROM ".$this->userTbl." WHERE oauth_provider = '".$userData['oauth_provider']."' AND oauth_uid = '".$userData['oauth_uid']."'";
        $prevResult = $conn->query($prevQuery);
        }
    }
}

和config.php

<?php

class createCon  {
    var $host = 'localhost';
    var $user = 'root';
    var $pass = '';
    var $db = 'gic';
    var $myconn;

    function connect() {
        $con = mysqli_connect($this->host, $this->user, $this->pass, $this->db);
        if (!$con) {
            die('Could not connect to database!');
        } else {
            $this->myconn = $con;
            echo 'Connection established!';}
        return $this->myconn;
    }

    function close() {
        mysqli_close($myconn);
        echo 'Connection closed!';
    }
}
?>

当我运行上面的代码时,它显示一个错误:

解析错误:语法错误、意外的“包含”(T_INCLUDE)、第 4 行 C:\xampp\htdocs\gic001\User.php 中的预期函数 (T_FUNCTION) 或 const (T_CONST)

有什么想法吗?

【问题讨论】:

    标签: php mysql mysqli mysql-error-1064


    【解决方案1】:

    坦率地说,你的整个方法都是错误的。

    A user is not a database! 用户类中不应该有 $dbHost 这样的属性。它也不应该费心连接到数据库。用户类应该只使用在别处定义的连接。

    您应该创建一个数据库实例,一次。然后将它作为参数传递给用户的构造方法

    class User {
        protected $conn;
        public function __construct($conn) {
            $this->conn = $conn;
        }
        function checkUser($userData = array()){
            $prevResult = $this->conn->query($prevQuery);
        }
    }
    

    所以只需包含一次您的凭据,就在创建连接的位置。

    【讨论】:

      【解决方案2】:

      尝试将包含移到课程之外。

      <?php
      
      require('config.php');
      
      class User {
      

      否则将其放在函数内部:

      class User {
      
       protected $conn;       
      
      
        public function __construct(){
          $this->loadConfig();
        }
      
      
        protected function loadConfig(){
           require('config.php');
           $connection = new createCon();
           $this->conn = $connection->connect();
        }
      

      还有你想要研究的东西:

      【讨论】:

      • "否则将其放在函数中。"我没明白……你能解释一下吗?
      • 我已经更新了我的答案。
      • 我的 config.php 文件是否正确?或需要任何更改
      • 我会将它包装在 try/catch 语句中。
      • 扩展连接类的不错选择。
      【解决方案3】:

      有了继承,应该问题不大。保持你的配置文件原样,试试这个。

      include_once 'config.php';
      
      class User extends createCon {
      
          private $conn;
      
          function __construct(){
              $this->conn = $this->connect();
          }
      }
      

      【讨论】:

      • NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!
      • @YourCommonSense 好的。告诉我这个答案的问题(而不是模仿 Darth Vader ;-)),这样我就可以解决它并改进我的答案。
      • 你无法改进它
      • @YourCommonSense 好的。我明白了。
      • 幸运的是,我可以关闭这个重复的问题,所以它不会造成太大的伤害,宣传糟糕的做法并增加 PHP 已经坏的声誉
      猜你喜欢
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 2010-10-15
      • 2013-01-06
      • 2012-09-22
      • 1970-01-01
      • 2011-03-28
      相关资源
      最近更新 更多