#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.Я пошел дальше и внес исправления, пожалуйста, посмотрите Мою обновленную ошибку.