2017-02-05 4 views
0

Ich lerne jetzt PDO Ich folgte nur das Tutorial auf Youtube. Also hier habe ich hier eine Methode von Db Klasse und ich habe eine neue Zeile PDO :: FETCH_ASSOC hinzugefügt, weil ich eine While-Schleife neben Foreach versuchen möchte.PHP: PDO fetch() zeigt kein Ergebnis

public function query($sql, $params = array()){ 
$this->_error = false; 
$this->_count = 0; 
if($this->_query = $this->_pdo->prepare($sql)){ 

    #check if theres a parameter and bindvalue to sql statement 
    if(count($params)){ 
    $x = 1; 
    foreach($params as $param){ 
     $this->_query->bindValue($x, $param); 
     $x++; 
    } 
    } 

    #execute with or without parameter 
    if($this->_query->execute()){ 
    $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); 
    $this->_whileFetch = $this->_query->fetch(PDO::FETCH_ASSOC); 
    $this->_count = $this->_query->rowCount(); 
    }else{ 
    $this->_error = true; 
    } 
    return $this; 
} 
} #end of GET function 


public function whileFetch(){ 
    return $this->_whileFetch; 
} 

Die foreach funktioniert gut, aber ich möchte eine while-Schleife, um zu versuchen, aber es scheint nicht funktioniert, keine Daten.

$query = $db->query("SELECT * from master_data.store"); 
while($row = $query->whileFetch()){ 
    echo $row['name']; 
} 

Ich versuche es auch, aber ich habe Fehler.

while($row = $query->fetch(PDO::FETCH_ASSOC)){ 
    echo $row['name']; 
} 

Antwort

1

Das Problem ist wegen dieser Methode Anruf ->fetchAll(PDO::FETCH_OBJ). Da Sie alle Zeilen aus der Ergebnismenge als Array abrufen und sie der Instanzvariablen $results zuweisen, funktioniert diese Anweisung $this->_whileFetch = $this->_query->fetch(PDO::FETCH_ASSOC); danach nicht. Und deshalb haben Sie $this->_whileFetch als false.

So ist die Lösung,

  • Entfernen Sie die Instanz-Variable $_whileFetch aus Ihrer Klasse, werden Sie nicht mehr brauchen.
  • entfernt die folgenden zwei Zeilen von diesem if($this->_query->execute()){ ... } Block

    $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); 
    $this->_whileFetch = $this->_query->fetch(PDO::FETCH_ASSOC); 
    
  • Im whileFetch() Verfahren statt $this->_whileFetch, direkt die nächste Zeile aus der Ergebnismenge holen und zurück,

    return $this->_query->fetch(PDO::FETCH_ASSOC); 
    

Also Ihre query() und whileFetch() Methode wäre wie folgt:

public function query($sql, $params = array()){ 
    $this->_error = false; 
    $this->_count = 0; 
    if($this->_query = $this->_pdo->prepare($sql)){ 
     #check if theres a parameter and bindvalue to sql statement 
     if(count($params)){ 
      $x = 1; 
      foreach($params as $param){ 
       $this->_query->bindValue($x, $param); 
       $x++; 
      } 
     } 

     #execute with or without parameter 
     if($this->_query->execute()){ 
      $this->_count = $this->_query->rowCount(); 
     }else{ 
      $this->_error = true; 
     } 
     return $this; 
    } 
} 

public function whileFetch(){ 
    return $this->_query->fetch(PDO::FETCH_ASSOC); 
} 

Später können Sie Ihre Anfrage und while() Schleife wie dieses:

$query = $db->query("SELECT * from master_data.store"); 
while($row = $query->whileFetch()){ 
    echo $row['name']; 
} 
+0

Danke, ich habe aber ich kann nur einmal in jeder der while-Schleife aufrufen oder foreach und die nächste Schleife funktioniert nicht mehr –

+1

@RaffyTLawrence Ja, das ist, weil, sobald Sie die Ergebnismenge mit der while-Schleife durchlaufen haben, die Ergebnismenge erschöpft ist. Sie können den Ergebniszeiger nicht so anpassen, dass er erneut auf den Anfang der Ergebnismenge zeigt. Verwenden Sie also entweder "while" oder "foreach", um die Ergebnismenge zu durchlaufen. –

+0

@RaffyTLawrence Nachdem Sie dies gesagt haben, müssen Sie den PDO-Cursor auf 'CURSOR_SCROLL' setzen, falls Sie die Ergebnismenge * erneut * durchlaufen wollen. Standardmäßig ist es auf 'CURSOR_FWDONLY' eingestellt. Sehen Sie sich diesen SO-Thread und die Antwort * accepted * an: [http://stackoverflow.com/q/15637291/5517143](http://stackoverflow.com/q/15637291/5517143) –

1

Dies ist ein schreckliches Tutorial und Ihre Klasse hat einige kritische Nachteile als Folge. Ihre Funktion ist zu suchen, wie dies

public function query($sql, $params = array()){ 
    $stmt = $this->_pdo->prepare($sql); 
    $stmt->execute($params); 
    return $stmt; 
} 

So werden Sie in der Lage sein, welche Methode von PDO unterstützt zu verwenden:

$query = $db->query("SELECT * from master_data.store"); 
foreach($query as $row){ 
    echo $row['name']; 
} 

$query = $db->query("SELECT * from master_data.store"); 
while($row = $query->fetch()){ 
    echo $row['name']; 
} 

$list = $db->query("SELECT name from store")->fetchAll(PDO::FETCH_COLUMN); 
foreach($list as $name){ 
    echo $name; 
} 

und daran erinnern, dass im Gegensatz zu Ihnen, diese Funktion mit jeder Abfrage zurückzugibt, verwendet werden könnte, JEDE Art von Ergebnis mit besseren Fehlermeldungen und viele andere Vorteile.

Ich schrieb einen Artikel, der alle Nachteile Ihrer Db-Klasse, Your first database wrapper's childhood diseases erklärt, die es sich lohnt zu lesen. Sie können gerne Fragen stellen.