Я пытался установить соединение с базой данных 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-коде так:
$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>";
}
Способ приготовления неизвестен. Как решить эту проблему?
$db
в вашем случае, это экземпляр Db
класс, который вы создали, таким образом, имеет только те методы, которые вы определили на нем. Вы не определили prepare
метод, поэтому не может вызвать его. Я бы добавил один, похожий на query
метод, но вместо этого вызывает mysqli::prepare
.
public function prepare($query) {
$connection = $this -> connect();
$stmt = $connection -> prepare($query);
return $stmt;
}
Так как $ 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 Class и получил бы прямой доступ к драйверу 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>";
}
prepare()
функция, о которой вы говорите, является методом mysqli
, а не из вашей базы данных.
То, как вы реализовали свой connect
метод, который вы могли бы просто сделать это:
...
$db = new Db();
$mysqli = $db->connect();
$stmt = $mysqli->prepare( ... );
...