2012-09-17 5 views
1

Essayer de construire une base de données simple à partir d'une base de données mySQL.php clone ne fonctionnait pas comme prévu

La classe de base de données que j'utilise pour se connecter renvoie l'ensemble de résultats en tant qu'objet. Je veux cloner cet objet afin que je puisse utiliser la méthode getNext() pour obtenir les en-têtes de la table sans déplacer le pointeur vers l'avant pour supprimer la première ligne renvoyée. Je m'attends à ce que ce soit simple comme clonage du jeu de résultats de sorte que j'ai maintenant 2 objets qui sont identiques. puis renvoyer les en-têtes dans un objet tout en laissant l'autre objet intact.

Cependant, cela s'est avéré plus difficile que je pensais. Peut-être que je n'utilise pas correctement le clone, donc si vous pouvez m'aider, dites-moi ce que je fais de mal.

est Ci-dessous le code:

 function gethtmlTable($database, $table) 
      { 
       $db = new DB_Connection(); 
       $sql = "SELECT * FROM $table;"; 
       $result = $db->query($sql,$database); 
       $tabelheader = clone $result; 
       $tablerows = clone $result; 
       if (!$result) die($db->getError()); 
       if ($result->getNumRows() == 0) die('No Results'); 

       $count = $tabelheader->getNumRows(); 
       $html = "<table><th>Select</th>"; 

       // echo "<pre>".var_dump($result)."</pre>";  
       foreach($tabelheader->getNext() as $k => $v){ 
         $html .="<th>".$k."</th>"; 
       } 
       while($count > 0){ 
        $row = $tablerows->getNext();  
        $html .= "<tr>"; 
        $html .= "<td><input type='checkbox' id='checkbox".$count."' name=checkbox".$count." class ='styled' value='checked'></td>"; 

        foreach($row as $k => $v){ 
          $html .="<td>".$v."</td>"; 
        } 

        //foreach($result->getNext() as $k => $v){ 
        // $html .="<td>".$v."</td>"; 
        //} 
        $html .="</tr>"; 
        $count--; 
       } 
       $html .="</table>"; 
       echo $html; 

      } 

Quand je lance cette fonction je reviens d'une table avec les en-têtes et une boîte de sélection, mais la première ligne est toujours manquant. :(

Répondre

0

Plus d'une solution qu'une réponse directe, mais vous n'avez pas besoin de cloner votre objet Au lieu de cela, vous pouvez changer votre boucle while un peu et il suffit d'utiliser la $result de votre recherche:.

do 
{ 
    // do the stuff you are doing now except for fetching a new row 


    // at the end: 
    $count--; 
    $row = $result->getNext(); 
} 
while ($count > 0) 
+1

Cela a fonctionné, je vous remercie de la suggestion . Je n'ai même pas pensé à utiliser un do - while au lieu de le compliquer avec le clone :) – TheSnooker

0

le clonage de l'objet $ result ne signifie pas que vous pouvez lire à partir de 2 différentes sources de données.

Il est encore une source de données sous-jacente, avec un curseur!

Alors cette ligne:

foreach($tabelheader->getNext() as $k => $v) { 
     $html .="<th>".$k."</th>"; 
    } 

va réellement chercher le premier enregistrement de la source de données et

while($count > 0) { 
    $row = $tablerows->getNext(); 
    ... 

va chercher alors de la ligne 2 et futher!

0

Après avoir lu les suggestions que j'ai réalisé que j'étais plus compliquer ceci: D

Voici la solution pour tout le monde là-bas qui essaie de faire la même chose

 function gethtmlTable($database, $table) 
     { 
      $db = new DB_Connection(); 
      $sql = "SELECT * FROM $table;"; 
      $result = $db->query($sql,$database); 
      //$tabelheader = clone $result; 
      //$tablerows = clone $result; 
      if (!$result) die($db->getError()); 
      if ($result->getNumRows() == 0) die('No Results'); 

      $count = $result->getNumRows(); 
      $html = "<table><th>Select</th>"; 
      $row = $result->getNext(); 

      foreach($row as $k => $v){ 
        $html .="<th>".$k."</th>"; 
      } 

      do { 
       $html .= "<tr>"; 
       $html .= "<td><input type='checkbox' id='checkbox".$count."' name=checkbox".$count." class ='styled' value='checked'></td>"; 

       foreach($row as $k => $v){ 
        $html .="<td>".$v."</td>"; 
       } 

       $count--;  
       $row = $result->getNext(); 
      } 
      while ($count > 0); 
Questions connexes