PHP:如何在数据库对象上使用prepare?

时间:2015-04-19 15:33:30

标签: php class object prepare

我曾尝试使用最终有效的类来建立php数据库连接。 我的班级看起来像这样:

class Db {
protected static $connection;

public function connect() {

    if(!isset(self::$connection)) {
        self::$connection = new mysqli('localhost','root','','Personenverzeichnis');
    }

    if(self::$connection === false) {
        return false;
    }
    return self::$connection;
}

public function query($query) {
    $connection = $this -> connect();
    $result = $connection -> query($query);
    return $result;
}   

public function select($query) {
    $rows = array();
    $result = $this -> query($query);
    if($result === false) {
        return false;
    }
    while ($row = $result -> fetch_assoc()) {
        $rows[] = $row;
    }
    return $rows;
}

public function error() {
    $connection = $this -> connect();
    return $connection -> error;
}


public function quote($value) {
    $connection = $this -> connect();
    return "'" . $connection -> real_escape_string($value) . "'";
}

}

然后我在我的php-Code中使用这个类:

$db = new Db();
$abfrage = "SELECT `Date`,`Keyword` FROM `notes` WHERE `PERSON_ID` = 
2 ORDER BY `Date` DESC; ";
$resultat = $db -> query($abfrage);

  while($daten = $resultat->fetch_object() ){
      echo "<p>date ".$daten->Date.": ".$daten->Keyword."</p>";
  }

这种方式非常好。但是我如何使用prepare()方法?

我尝试了这个不起作用的代码。有人能帮助我吗?

$db = new Db();
$abfrage = "SELECT `Date`,`Keyword` FROM `notes` WHERE `PERSON_ID` = 2 
ORDER BY `Date` DESC; ";
$resultat = $db->prepare($abfrage);
$resultat->execute();
$resultat->bind_result($date, $keyword);

  while($daten = $resultat->fetch_object() ){
      echo $date .": " .$keywords ."<br>";
  }

方法准备未知。如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

由于$ db是您的Db类的实例,

$db = new Db();

您只能使用类

中定义的方法
class Db {
    public function connect() {}
    public function query($query) {}
    public function select($query) {}
    public function error() {}
    public function quote($value) {}
}

由于您没有定义“prepare”方法,因此您将无法使用您想要的预准备语句。将准备好的语句功能包装到您的Db类中将过于复杂,并且不会为您带来任何好处。

相反,我会绕过您的Db类并直接访问mysqli驱动程序:

$db = new mysqli('localhost','root','','Personenverzeichnis');
$abfrage = "SELECT `Date`,`Keyword` FROM `notes` WHERE `PERSON_ID` = 2 
ORDER BY `Date` DESC; ";
$resultat = $db->prepare($abfrage);
$resultat->execute();
$resultat->bind_result($date, $keyword);

  while($daten = $resultat->fetch_object() ){
      echo $date .": " .$keywords ."<br>";
  }

答案 1 :(得分:1)

在您的情况下,

$db是您创建的Db类的实例,因此只有您在其上定义的方法。您尚未定义prepare方法,因此无法调用它。我会添加一个,类似于query方法,而是调用mysqli::prepare

public function prepare($query) {
    $connection = $this -> connect();
    $stmt = $connection -> prepare($query);
    return $stmt;
}

答案 2 :(得分:0)

您所说的prepare()函数是mysqli的方法,而不是您的数据库。 您实施connect方法的方式可以这样做:

...
$db = new Db();
$mysqli = $db->connect();
$stmt = $mysqli->prepare( ... );
...