1

mySQLデータベースから単純なデータグリッドを構築しようとしています。

接続に使用しているデータベースクラスは、結果セットをオブジェクトとして返します。このオブジェクトのクローンを作成して、getNext()メソッドを使用して、返された最初の行をドロップするためにポインターを前方に移動せずに、テーブルのヘッダーを取得できるようにします。結果セットのクローンを作成するだけで、これは単純であると思います。これにより、同一の2つのオブジェクトが作成されます。次に、一方のオブジェクトのヘッダーを返し、もう一方のオブジェクトはそのままにします。

しかし、これは私が思っていたよりも難しいことが証明されました。おそらく私はクローンを適切に使用していないので、助けていただければ、私が間違っていることを教えてください。

以下はコードです:

        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;

            }

この関数を実行すると、ヘッダーと選択ボックスを含むテーブルが返されますが、最初の行は常に欠落しています。:(

4

3 に答える 3

0

直接的な答えというよりは解決策ですが、オブジェクトのクローンを作成する必要はありません。代わりに、whileループを少し変更$resultして、クエリからを使用することができます。

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


  // at the end:
  $count--;
  $row = $result->getNext();
}
while ($count > 0)
于 2012-09-17T17:15:22.257 に答える
0

$ resultオブジェクトのクローンを作成しても、2つの異なるデータソースから読み取ることができるという意味ではありません。

それはまだ1つのカーソルで、基礎となる1つのデータソースです!

したがって、この行:

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

実際にデータソースから最初のレコードをフェッチし、

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

次に、行2以降からフェッチします。

于 2012-09-17T17:18:42.673 に答える
0

提案を読んだ後、私はこれを複雑にしすぎていることに気づきました:D

これが同じことをしようとしている人のための解決策です

        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);
于 2013-02-06T18:39:24.233 に答える