2017-01-17 5 views
0

Ich bin ein Neuling in PHP OOP. Können Sie mir bitte helfen, diesen Code unten zu beheben, weil er mir eine unendliche Ausgabe gibt. Ich möchte meine abgerufenen Daten in mein Hauptprogramm ausgeben oder ausgeben. Vielen Dank.OUTPUT meine abgerufenen Daten zu meinem Hauptprogramm in PHP OOP

===========================================

class DB { 

private $_hostdb = 'localhost'; 
private $_namedb = 'imsdb'; 
private $_userdb = 'root'; 
private $_passdb = ''; 
private $_conn; 
private static $_instance; 
private $_rowResult; 

private function __construct(){ 
try{ 
    $this->_conn=new PDO("mysql:host=$this->_hostdb;dbname=$this- >_namedb",$this->_userdb,$this->_passdb); 
    $this->_conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 

     if($this->_conn){ 
      echo "Connected Successfully!"; 
     } 

    } catch (Exception $ex) { 
     echo ("Connection Failed!")."".$ex->getMessage(); 
    } 
} 

public static function getInstance(){ 
    if(!isset(self::$_instance)) 
    { 
      return self::$_instance=new DB(); 
    } 
} 

public function processQuery($sql){ 
try{ 

    $q=$this->_conn->prepare($sql); 
    $q->execute(); 
    $q->setFetchMode(PDO::FETCH_ASSOC); 
    return $this->_rowResult=$q->fetch(); //Is this correct?? 

    } catch (Exception $ex) { 
      echo ("Failed!")." ".$ex->getMessage(); 
    } 
    } 
} 

//MAIN PROGRAM -> OUTPUT gives me an infinite data which is wrong 

$dbUser=DB::getInstance()->processQuery("SELECT * FROM users"); 

while($dbUser){ 
    echo $dbUser['username']; 
} 

Antwort

1

Ihre while-Schleife unendlich ist, weil es die Verarbeitung $ dbUser hält die wahre jedes Mal zurückkehrt, um es zu sagen while(true)

gleichwertig ist

Sie wirklich wollen, die über eine Getter-Methode gesetzt Ergebnis zuzugreifen, so in Ihrer Klasse könnte man hinzufügen etwas wie:

public function getResultSet() { 
    return $this->_rowResult; 
} 

Ich habe dies bearbeitet und modifi ed die Bits, die Sie aufgelistet haben:

class DB { 

    ... 
    public static function getInstance() 
    { 
     if (null === self::$_instance)) { 
      self::$_instance = new DB(); 
     } 
     return self::$_instance; // Always return your instance, the if statement just sets it in the property if it's not already 
    } 

    public function processQuery($sql) 
    { 
     try { 
      $q = $this->_conn->prepare($sql); 
      $q->execute(); 
      $q->setFetchMode(PDO::FETCH_ASSOC); 
      $this->rowResult = $q->fetchAll(); // Use fetchAll rather than fetch 
     } catch (Exception $ex) { 
      echo "Failed!", "<br />", $ex->getMessage(); 
     } 
    } 
    ... 
} 

Und Ihr Hauptprogramm: nach folgendem Ihrem Vorschlag

//MAIN PROGRAM 
$dbUser = DB::getInstance(); 
$user = $dbUser->processQuery("SELECT * FROM users"); 
foreach ($dbUser->getResultSet() as $user) { 
    print_r($user['id']); 
} 
+0

Es gibt mir jetzt diesen Fehler. Schwerwiegender Fehler: Aufruf einer Memberfunktion getResultSet() –

+0

Sie benötigen eine Objektinstanz, um das aufzurufen: '$ dbUser = DB :: getInstance(); $ dbUser-> processQuery ("SELECT * FROM users"); while ($ dbUser-> getResultSet()) {...} ' auch in Ihrer statischen getInstance Sie die $ _instance Eigenschaft zurückkehren wollen immer: ' public static function getInstance() { if (! isset (self :: $ _ instance)) { self :: $ _ instance = new DB(); } return self :: $ _ Instanz; } ' – PhilS

+0

Es versuchte den Code unten, aber es gibt mir eine Zeile Rekord, aber es wiederholt sich 7 mal .. etwas stimmt nicht mit meinem Hauptprogramm –

1
It tried code below but it gives me one record and it repeats 7 times. 
    OUTPUT: 1111111 
    =================================== 
    class DB { 

    private $_hostdb = 'localhost'; 
    private $_namedb = 'imsdb'; 
    private $_userdb = 'root'; 
    private $_passdb = ''; 
    private $_conn; 
    private static $_instance; //must be static 
    public $rowResult; 


    private function __construct(){ 
     try{ 
     $this->_conn=new PDO("mysql:host=$this->_hostdb;dbname=$this-  >_namedb",$this->_userdb,$this->_passdb); 
     $this->_conn- >setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
     if($this->_conn){ 
      echo "Connected Successfully!<br />"; 
     } 
     // 
     } catch (Exception $ex) { 
      echo ("Connection Failed!")."<br />".$ex->getMessage(); 
     }  
    } 

    public static function getInstance(){ 
    if(!isset(self::$_instance)) 
    { 
     return self::$_instance=new DB(); 
    } 
    } 

    public function processQuery($sql){ 
    try{ 

     $q=$this->_conn->prepare($sql); 
     $q->execute(); 
     $q->setFetchMode(PDO::FETCH_ASSOC); 
     return $this->rowResult=$q->fetch(); 

     } catch (Exception $ex) { 
     return ("Failed!")."<br />".$ex->getMessage(); 
     } 
     } 

     public function getResultSet(){ 
     return $this->rowResult; 
     } 
     } 
     //MAIN PROGRAM 
     $dbUser=DB::getInstance(); 
     $user=$dbUser->processQuery("SELECT * FROM users"); 
     for($i=0;$i<count($dbUser->rowResult);$i++){ 
      echo $user['id']; 
     }