2009-08-20 6 views
3

Ich werde direkt auf die Jagd geschnitten. Alles, was ich an dieser Stelle mit dieser Klasse erreichen kann, ist eine Datenbankverbindung. Ich kann keine Abfrage durchführen. Kannst du mir genau zeigen, wie man das funktioniert und/oder mir zeigt, wie man es besser umsetzt?Wie kann ich diese mysqli-Datenbank-Klasse arbeiten?

<?php 
class database{ 

public $dbHost = ''; 
public $dbUser = ''; 
public $dbPass = ''; 
public $dbName = ''; 

public $db; 

public function __construct(){} 

public function dbConnect(){ 
    $mysqli = new mysqli($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName); 

    /* check connection */ 
    if (mysqli_connect_errno()){ 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    }else{ 
     echo 'connection made'; 
    } 
    /* close connection */ 
    $mysqli->close(); 
} 

public function query($sql){ 
    $query = $sql; 
    self::preparedStatement($query); 
} 

public function preparedStatement(){ 
    if ($stmt = $mysqli->prepare($query)){ 

     /* execute statement */ 
     $stmt->execute(); 

     /* bind result variables */ 
     $stmt->bind_result($name, $code); 

     /* fetch values */ 
     while ($stmt->fetch()) { 
      printf ("%s (%s)\n", $name, $code); 
     } 

     /* close statement */ 
     $stmt->close(); 
    } 
} 

public function __destruct(){} 

} 
?> 

Antwort

1

Das funktionierte für mich. Ich habe meine Änderungen kommentiert.

<?php 
class database{ 

public $dbHost = ''; 
public $dbUser = ''; 
public $dbPass = ''; 
public $dbName = ''; 

public $db; 

public function __construct(){} 

public function dbConnect(){ 
    ### not $mysqli 
    $this->db = new mysqli($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName); 

    /* check connection */ 
    if (mysqli_connect_errno()){ 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    }else{ 
     echo 'connection made'; 
    } 
    /* close connection */ 
    ### $this->db->close(); // DO NOT close the connection here! 
} 

public function query($sql){ 
    $query = $sql; 
    self::preparedStatement($query); 
} 

public function preparedStatement($query){ ### parameter $query added 

    if ($stmt = $this->db->prepare($query)){ ### not $mysqli->prepare() 

     /* execute statement */ 
     $stmt->execute(); 

     /* bind result variables */ 
     $stmt->bind_result($name, $code); 

     /* fetch values */ 
     while ($stmt->fetch()) { 
      printf ("%s (%s)\n", $name, $code); 
     } 

     /* close statement */ 
     $stmt->close(); 
    } 
} 

public function __destruct(){} 

} 


### Test code 
/* 
$db = new Database(); 
$db->dbHost = '127.0.0.1'; 
$db->dbUser = 'root'; 
$db->dbPass = 'root'; 
$db->dbName = 'test'; 
$db->dbConnect(); 
$db->query('SELECT * FROM test'); 
*/ 
?> 
+0

Dein Awesome! Ich danke dir sehr. Ich habe fast alle diese Änderungen während meines Debugging gemacht, schade, dass ich sie nicht alle zusammen auf einmal gemacht habe. Vielen Dank. –

0

Sie haben einen Parameter weggelassen:

public function preparedStatement($query) 

(und diese Methode tatsächlich sollte statisch sein)

Das nächste Mal versuchen, Ihren Code zu debuggen, bevor er fragte. Selbst einfache echo Aussagen hätten hier gemacht.

EDIT: und auch das würde nicht funktionieren. Ich denke, Sie haben das Konzept des variablen Umfangs missverstanden. sollte eine Instanzvariable dieser Klasse sein, da sie preparedStatement() nicht beibehalten würde, wenn Sie sie einfach in __construct() als lokale Variable festlegen.

+1

Ja, ich verstehe, dass es hier einige ernste Probleme gibt. Ich denke, 3 Stunden zählen als "versuchen, Ihren Code zu debuggen, bevor Sie fragen". –