2014-10-26 3 views
0

У меня есть объект под названием entry. Я хочу получить доступ к базе данных MySQL и вытащить соответствующую информацию для записи объекта. Это мои страницы:foreach Loop не работает с объектом

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 только $entries, она правильно вытащила информацию, но, опять же, повторила восемь раз. Я уверен, что это связано с тем, что в таблице SQL имеется восемь столбцов, но я не знаю, почему это будет сделано.

Я также использовал использованное эхо, чтобы убедиться, что операторы SQL верны, использовали count, чтобы убедиться, что в массивах есть только один элемент, который был результатом выполненных функций (был), и использовал print_r() для распечатки информация, хранящаяся в $entries (все было правильно). Итак, мне кажется, что причина, по которой это не работает, связана с циклом foreach. Но я не знаю, почему это и как это исправить.

Любая помощь приветствуется. Спасибо!

+0

'$ table_names' является глобальной переменной? –

ответ

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 ; 
} 
+0

В цикле 'foreach' вы повторяете столбцы/поля. Я исправил код функции 'find', чтобы исправить его. –

Смежные вопросы