[英]How to Show Columns in a table
我正在学习PHP,并试图在教程之外创建一些代码,为了更好地理解它,我似乎一直无法弄清楚下面的代码在哪里出问题。 我还有很多其他功能都可以正常工作,而不仅仅是这一功能。 谁能指出我正确的方向? 谢谢。
我得到的结果是可捕获的致命错误:类User的对象无法在第20行上转换为字符串,即echo $user . "<br /><br />";
echo $user . "<br /><br />";
这是我的index.php
<?
$users = User::db_fields();
foreach($users as $user) {
echo $user . "<br /><br />";
}
?>
这是我在user.php中的类User
<?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;
}
}
?>
你傻了:
echo $users . "<br /><br />";
应该有$user
作为echo参数
<?
$users = User::db_fields();
foreach($users as $user) {
echo $user . "<br /><br />";
?>
您每次都在打印原始阵列
编辑:
新的错误反映了您的User
类没有显式定义将类的对象转换为字符串的方式这一事实。 如果要快速生成n脏输出,可以对对象进行var_dump()
,但是最终您将需要覆盖__toString()
方法。 检查这个出来。
您也可以在User
类中简单地创建一个函数,该函数返回所需的字符串,并只需使用$user->StringifyUser()
调用即可。 这种方法之间的(主要)区别在于,在原始上下文中使用PHP时,PHP不会将其User
类对象隐式转换为字符串。
编辑2:
我还将检查其他答案,尤其是KyleK的答案,他解决了我没有提到的几个关键点。
好吧,您要遍历的数组是$ users,从$ users获得的值将进入$ user。
但是,您正在回显$ users(数组)。 如果$ users数组中的值都是字符串(或其他标量值),则可以通过将代码更改为:
<?
$users = User::db_fields();
foreach($users as $user) {
echo $user . "<br /><br />";
}
?>
(我还在末尾添加了缺失的括号)
好吧...。您静态地调用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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.