2013-06-25 90 views
0

我遇到问题。我需要从我的数据库类到注册类获取mysqli连接。但它不起作用。我总是得到像这样的错误: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('/[^[email protected]]/','',$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> 

回答

0

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

有几种方法来解决如添加query方法您Database类,使您的$mysqli可变公众问题(使用$this->link_mysqli->mysqli->query()),让您的Database类扩展mysqli

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

+0

你能给我一些例子(依赖注入)吗?对不起,我只是从OOP开始。谢谢 –