php克隆不工作我的预期

时间:2012-09-17 16:51:14

标签: php mysql clone

尝试从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;

            }

当我运行此函数时,我返回一个带有标题和选择框的表,但第一行总是丢失。 :(

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

克隆$ result对象并不意味着您可以从2个不同的数据源中读取。

它仍然是一个数据源底层,只有一个游标!

所以这一行:

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

实际上会从数据源中获取第一条记录,并且

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

将从第2行获取并进一步获取!

答案 2 :(得分: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);