foreach循环不使用对象

时间:2014-10-26 04:17:24

标签: php object foreach

我有一个名为entry的对象。我想访问MySQL数据库并提取对象条目的相关信息。这些是我的网页:

objects.php

class main {
    function setValues( $rs = array() ){
        foreach( $rs as $key => $val ){
            $this->$key = $val ;
        }
    }

    var $created ;
    var $updated ;
}

class entry extends main {
    var $id ;
    var $channel ;

    var $title ;
    var $content ;
}
$table_names['entry'] = 'archive' ;

的functions.php

$dbconn = mysqli_connect( DB_HOST , DB_USER , DB_PASS , DB_NAME ) ;
$table_names = array() ;

function getTableValues( $object ){
    global $table_names ;
    $table_name = $table_names[ get_class( $object ) ] ;

    $r = 'SELECT * FROM '.$table_name ;
    return $r ;
}

function query( $q ){
    global $dbconn ;
    $stmt = mysqli_query( $dbconn , $q ) ;

    return $stmt ;
}

function fetchRow( $stmt ){
    return mysqli_fetch_array( $stmt , MYSQLI_ASSOC ) ;
}

function find( $object , $other = '' , $orderBy = '' ){
    global $dbconn ;
    $list = array() ;
    $q = getTableValues( $object ) ;

    $q .= $other.' '.$orderBy ;     
    $stmt = query( $q ) ;
    $objectClass = get_class( $object ) ;
    while( $rv = fetchRow( $stmt ) ){
        $obj = new $objectClass() ;
        $obj->setValues( $rv ) ;
        $list = $obj ;      
    }

    return $list ;
}

然后,在我的实际页面上

<?php
    require_once( '../lib/functions.php' ) ;    
    require_once( '../lib/objects.php' ) ;

    $entries = find( new entry() ) ;
?>

<?php
    foreach($entries as $entry){
?>      
    <tr>
        <td><?php echo $entry->id ?></td>
        <td><?php echo $entry->channel ?></td>
        <td><?php echo $entry->title ?></td>
        <td><a href='' class='button'>Edit</a>&nbsp;<a href='' class='button'>View</a></td>
    </tr>
<?php
    }    
?>

我最终收到错误:

Trying to get property of a non-object

作为foreach循环的结果,它迭代了八次,即使现在只有一个条目用于测试目的。使用仅foreach的{​​{1}}循环,它正确地提取信息,但是再次迭代八次。我很确定这是因为SQL表中有八列,但我不知道为什么会这样做。

我还使用了使用echo来确保SQL语句是正确的,使用count来确保数组中只有一个项是执行函数的结果(有)并使用$entries来打印出print_r()中存储的信息(这一切都是正确的)。所以,在我看来,这不起作用的原因是因为$entries循环。但我不知道为什么会这样或如何解决它。

感谢任何和所有帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

只需将find功能更改为:

即可
function find( $object , $other = '' , $orderBy = '' ){
    global $dbconn ;
    $list = array() ;
    $q = getTableValues( $object ) ;

    $q .= $other.' '.$orderBy ;     
    $stmt = query( $q ) ;
    $objectClass = get_class( $object ) ;
    while( $rv = fetchRow( $stmt ) ){
        $obj = new $objectClass() ;
        $obj->setValues( $rv ) ;
        $list[] = $obj ;  // earlier you were looping through columns, now it will loop through rows      
    }

    return $list ;
}