Как отобразить столбцы в таблице

#php #mysql

#php #mysql

Вопрос:

Я изучаю PHP и пытаюсь создать некоторый код за пределами учебника, который я просматривал, чтобы лучше понять его, и, похоже, я не могу понять, где я ошибаюсь в приведенном ниже коде. У меня есть много других функций, которые работают просто отлично, только не эта. Кто-нибудь может указать мне правильное направление? Спасибо.

Результат, который я получаю, является уловимой фатальной ошибкой: объект класса User не может быть преобразован в строку в строке 20, которая echo $user . "<br /><br />";

Вот мой index.php

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

Вот мой класс User в user.php

 <?php 
class User extends OtherStuff {

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

Вот некоторые из моих классов OtherStuff в other_stuff.php

 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;
}
}
?>
 

Комментарии:

1. Вы, вероятно, хотите echo $user вместо echo $users . $users это массив, по которому вы выполняете итерацию.

2. Я пошел дальше и внес исправления, пожалуйста, посмотрите Мою обновленную ошибку.

3. В PHP встроено несколько довольно хороших функций взаимодействия с БД (как в PDO, так и в mysqli). Пока вы не освоитесь с ними и языком в целом, я предлагаю вам не усложнять ситуацию излишне, написав для них свои собственные оболочки.

Ответ №1:

Ну …. Ваш вызов 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);
    }  

} 
 

Комментарии:

1. Тогда ошибка глубже …. вы успешно извлекли какие-либо строки БД с помощью имеющихся у вас настроек? например, что происходит в static::instantiate($row)

2. Да, я могу извлечь что угодно из базы данных. Я просто не могу заставить его предоставить мне столбцы таблицы. Добавил эту функцию выше в свой код.

3. Проверьте мое редактирование. SHOW COLUMNS создает временную таблицу, поэтому она может быть испорчена для вас за кулисами. Чтобы заставить его работать с имеющимися у вас настройками, попробуйте то, что я только что опубликовал

4. Спасибо, это полезно. То, что он показывает мне сейчас, — это числа 0-30 (которые являются домом для многих элементов, которые у меня есть в моей БД), потому что я снял ОГРАНИЧЕНИЕ. Если я добавлю ПОКАЗАТЬ СТОЛБЦЫ, я получу число 0-10 (количество столбцов, которые у меня есть) Единственная проблема в том, как я могу получить имена столбцов.

5. Хм … это потому, что вы делаете какие-то странные вещи в instantiate($row), и вы возвращаете массив объектов, а не исходный запрос СТРОКИ array….so вы фактически потеряли имена столбцов. Вам нужно сохранить их как ключ в $object_array[] или что-то в этом роде

Ответ №2:

Ну, массив, который вы перебираете, — это $users, а значения, которые вы получаете от $users, переходят в $user.

Но вы повторяете $users (массив). Если значения в вашем массиве $users представляют собой все строки (или какое-либо другое скалярное значение), вы должны быть в порядке, изменив свой код на:

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

(Я также добавил в вашу недостающую фигурную скобку в конце)

Комментарии:

1. Я пошел дальше и внес исправления, пожалуйста, посмотрите Мою обновленную ошибку.

Ответ №3:

Вы сделали глупый:

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 не будет неявно преобразовывать User объекты вашего класса в строки при использовании в вашем исходном контексте.

Редактировать 2:

Я бы также проверил другие ответы, особенно ответы Кайлека, в которых рассматриваются несколько ключевых моментов, которые я не затронул.

Комментарии:

1.Я пошел дальше и внес исправления, пожалуйста, посмотрите Мою обновленную ошибку.