我有一个名为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> <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
循环。但我不知道为什么会这样或如何解决它。
感谢任何和所有帮助。谢谢!
答案 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 ;
}