【问题标题】:php clone not working how I expectedphp克隆没有按我的预期工作
【发布时间】:2012-09-09 22:31:30
【问题描述】:

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

            }

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

【问题讨论】:

    标签: php mysql clone


    【解决方案1】:

    在阅读了这些建议后,我意识到我过于复杂了: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);
    

    【讨论】:

      【解决方案2】:

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

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

      所以这一行:

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

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

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

      将从第 2 行及以后获取!

      【讨论】:

        【解决方案3】:

        解决方案比直接答案更多,但您不需要克隆对象。相反,您可以稍微更改您的 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)
        

        【讨论】:

        • 成功了,谢谢你的建议。我什至没有考虑过使用 do - while 而不是使用 clone 使它过度复杂化 :)
        猜你喜欢
        • 1970-01-01
        • 2014-03-10
        • 2014-05-03
        • 1970-01-01
        • 1970-01-01
        • 2014-03-12
        • 2012-01-16
        • 2011-01-22
        • 1970-01-01
        相关资源
        最近更新 更多