2015-04-19 1 views
2

Я попытался сделать соединение с базой данных php, используя класс, который, наконец, работает. Мой класс выглядит следующим образом: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>"; 
    } 

Подготовка к методу неизвестна. Как решить эту проблему?

ответ

1

С $ дб является экземпляром вашего Db класса,

$db = new Db(); 

вы можете использовать только методы, определенные в классе

class Db { 
    public function connect() {} 
    public function query($query) {} 
    public function select($query) {} 
    public function error() {} 
    public function quote($value) {} 
} 

Поскольку у вас нет метода «подготовки» определен , вы не сможете использовать подготовленные заявления, как вы этого хотите. Объединение функций подготовленных операторов в ваш класс 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

$db, в вашем случае, является экземпляром Db класса, который вы создали, таким образом, есть только те методы, которые вы на нем определен. Вы не определили метод prepare, поэтому его не можете назвать. Я бы добавил один, похожий на метод query, но вместо этого называет mysqli::prepare.

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

prepare() функция, которую вы имеете в виду это метод mysqli, а не базы данных. Способ, которым вы внедрили свой метод connect, вы могли бы просто сделать это:

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