如何在表中显示列

时间:2014-06-26 21:27:37

标签: php mysql

我正在学习PHP并尝试在教程之外创建一些代码我一直在观察,以便更好地理解它,我似乎无法弄清楚我要去哪里错误的代码如下。我有很多其他功能正常工作,只是没有这个。谁能指出我正确的方向?感谢。

我得到的结果是Catchable致命错误:类的对象User无法在第20行转换为字符串,即echo $user . "<br /><br />";

这是我的index.php

<? 
$users = User::db_fields(); 
foreach($users as $user) {
echo $user . "<br /><br />";
}
?>

这是我在user.php中的用户类

<?php 
class User extends OtherStuff {

public static function db_fields() {
global $db;  
return static::find_by_sql("SHOW COLUMNS FROM my_table");
}
}
<?

以下是other_stuff.php中的一些OtherStuff类

class OtherStuff {

public static function find_by_sql($sql="") {
global $db;
$result_set = $db->query($sql);
$object_array = array();
while($row = $db->fetch_array($result_set)) {
   $object_array[] = static::instantiate($row);
} 
return $object_array;
}

public static function instantiate($record) {
$class_name = get_called_class();
$object = new $class_name;
foreach($record as $attribute => $value){
if($object->has_attribute($attribute)) {
$object->$attribute = $value;
}
} 
return $object;
}
}
?>

3 个答案:

答案 0 :(得分:0)

你傻了:

echo $users . "<br /><br />";应该有$user作为echo param

<? 
$users = User::db_fields(); 
foreach($users as $user) {
echo $user . "<br /><br />";
?>

您每次都打印原始数组

修改

新错误反映了这样一个事实:您的User类没有明确定义将类的对象转换为字符串的方法。如果你想做一个快速的脏输出,你可以var_dump()你的对象,但最终你会想要覆盖__toString()方法。检查this

您也可以在User类中创建一个函数,返回您想要的字符串,然后使用$user->StringifyUser()调用它。这种方法的(主要)区别在于PHP在原始上下文中使用时不会隐式地将User类对象转换为字符串。

编辑2:

我还会查看其他答案,特别是KyleK的答案,他解决了我没有涉及的几个关键点。

答案 1 :(得分:0)

你正在迭代的数组是$ users,你从$ users获得的值是$ user。

但是你回应了$ users(数组)。如果$ users数组中的值都是字符串(或其他一些标量值),那么将代码更改为:

<? 
$users = User::db_fields(); 
foreach($users as $user) {
  echo $user . "<br /><br />";
}
?>

(我最后还添加了你缺失的大括号)

答案 2 :(得分:0)

嗯......你静静地调用db_fileds()。

User::db_fields();

所以它需要是一个静态函数..

public static function db_fields() {

修改

你可以做一个解决方法......

更改您的查询

return static::find_by_sql("SELECT * FROM mytable LIMIT 1");

然后这样做......

$fields = User::db_fields(); 
 foreach($fields as $key=>$value ) {
      echo $key; // This will give the field name
 }

编辑2

保留链接到字段的列名。

虽然这可能是错误的,因为现在它实例化了多次,并且在对象没有找到属性并且没有写入的情况下会发生什么,那么你会错过一个列。

但是这个想法就在那里......

while($row = $db->fetch_array($result_set)) {

    foreach($row as $k=>$v){
       $object_array[$k] = static::instantiate($row);
    }  

}