我曾尝试使用最终有效的类来建立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>";
}
方法准备未知。如何解决这个问题?
答案 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( ... );
...