MySQi连接对象


MySQli connection object

我有个问题。我需要从我的数据库类获得到注册类的mysqli连接。但它不起作用。我总是会遇到这样的错误:

Call to undefined method Database::query() in 
C:'xampp'htdocs'registration'class_register.php on line 47

我可能需要连接这个连接。。但我不知道该怎么做。我发现了一些关于这方面的话题。。但什么都没用。感谢帮助:)

class_register.php

 <?php
include "class_db.php";
class Register
{
    private $username;
    private $password;
    private $passmd5;
    private $email;
    private $errors;
    private $token;
    private $link_mysqli;
    public function __construct()
    {
        $this->errors   =   array();
        $this->username =   $this->filter($_POST['uname']);
        $this->password =   $this->filter($_POST['upass']);
        $this->email    =   $this->filter($_POST['umail']);
        $this->token    =   $_POST['token'];
        $this->passmd5  =   md5($this->password);

        $this->link_mysqli = new Database();//instance of Database Class
    }
    public function process()
    {
      if($this->valid_token() && $this->valid_data())
        $this->register();
        return count($this->errors) ? 0 : 1;
    }
    public function filter($var)
    {
      return preg_replace('/[^a-zA-Z0-9@.]/','',$var);
    }
    public function register()
    {
       $result = $this->link_mysqli->query("INSERT INTO users (username,password) VALUES ('$this->username', '$this->passmd5')");
        if($result->link_mysqli->affected_rows() < 1)
            $this->errors[] = 'Nemožno vytvoriť účet';
    }
    public function show_errors()
    {
        echo "<h3>Errors</h3>";
        foreach($this->errors as $key=>$value)
            echo $value.'<br>';
    }
    public function valid_data()
    {
        if(empty($this->username))
            $this->errors[] = 'Nesprávne uživateľské meno';
        if(empty($this->password))
            $this->errors[] = 'Nesprávne uživateľské heslo';
        if(empty($this->email) || !filter_var($this->email, FILTER_VALIDATE_EMAIL))
            $this->errors[] = 'Nesprávny e-mail';
        return count($this->errors) ? 0 : 1;
    }
    public function valid_token()
    {
        if(!isset($_SESSION['token']) || $this->token != $_SESSION['token'])
            $this->errors[] = 'Nesprávna Relácia';
        return count($this->errors) ? 0 : 1;
    }
    function status() {
        return print_r($this,true);
    }

}

?>

class_db.php

<?php
class Database
{
    private $mysqli;
    private $db_host = "127.0.0.1";
    private $db_user = "register";
    private $db_pass = "159753";
    private $db_database = "registration";
    public function __construct()
    {
       $this->mysqli = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_database);
       if(mysqli_connect_errno()){
         printf("Nastala chyba pripojenia s hláškou: %s", $mysqli->errno(), $mysqli->error());
         die();
       }
       return $this->mysqli;
    }
    public function __destruct()
    {
        $this->mysqli->close();
    }
}

?>

index.php

<?php
     session_start();
     if(isset($_POST['register'])){
       include "class_register.php";
       $register = new Register();
       if($register->process())
            echo "Úspešne zaregistrovaný";
       else
            $register->show_errors();
     }
     $token = $_SESSION['token'] = md5(uniqid(mt_rand(),true));
?>
<form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
   <table>
        <tr>
            <td><label for="uname">Meno:</label></td>
            <td><input type="text" id="uname" name="uname" /></td>
        </tr>
        <tr>
            <td><label for="upass">Heslo:</label></td>
            <td><input type="password" id="upass" name="upass" /></td>
        </tr>
        <tr>
            <td><label for="umail">E-Mail:</label></td>
            <td><input type="text" id="umail" name="umail" /></td>
        </tr>
        <input type="hidden" name="token" value="<?php echo $token; ?>" />
        <tr><td><input type="submit" name="register" value="Registrovať" /></td></tr>
   </table>


</form>

构造函数不返回值,它只是实例化一个对象。在Register类中,$link_mysqli属于Database类,并且该类没有query方法。

有几种方法可以解决这个问题,比如向Database类添加query方法,将$mysqli变量公开(并使用$this->link_mysqli->mysqli->query()),让Database类扩展mysqli,等等。

我通常实例化一个真实的数据库对象,并将其传递给需要它的类的构造函数(依赖注入)。