Практическое задание №3(Первая CMS): проблемы с редактированием пользователя.
Primary tabs
Возникает проблема с редактированием существующих пользователей:
1) Поялвяются надписи: "Trying to get property of non-object", указывающие на строки 28,36,44,60
файла editUser.php.
2) После редактирования пользователя и сохранения изменений, изменения не применяются.
Ссылка на задание: Практическое задание №3
<?php
// показываем только админу
if ($_SESSION['userName'] !== 'admin') {
header("Location: admin.php");
}
include "templates/include/header.php";
include "templates/admin/include/header.php" ?>
<h1><?php echo $results['pageTitle']?></h1>
<form action="admin.php?action=<?php
echo $results['formAction']?>" method="post">
<input type="hidden" name="userLogin" value="<?php
echo $results['user']->login ?>">
<?php if (isset($results['errorMessage'])) { ?>
<div class="errorMessage"><?php
echo $results['errorMessage'] ?></div>
<?php } ?>
<ul>
<li>
<label for="title">User Login</label>
<input type="text" name="login" id="login"
placeholder="Login"
required autofocus maxlength="25" value="<?php
echo htmlspecialchars($results['user']->login)?>" />
</li>
<li>
<label for="title">User Password</label>
<input type="text" name="password" id="password"
placeholder="Password"
required autofocus maxlength="25" value="<?php
echo htmlspecialchars($results['user']->password)?>" />
</li>
<li>
<label for="checkActivity">Active</label>
<input type="checkbox" name="active" value="1"
id="checkboxActivity"
<?php
if($results['user']->active == 1) {
echo 'checked = "checked"';
}
?>
>
</li>
</ul>
<div class="buttons">
<input type="submit" name="saveChanges" value="Save Changes" />
<input type="submit" formnovalidate name="cancel" value="Cancel" />
</div>
</form>
<?php if ($results['user']->login) { ?>
<p><a href="admin.php?action=deleteUser&userLogin=<?php
echo $results['user']->login ?>"
onclick="return confirm('Delete This User?')">
Delete This User
</a></p>
<?php } ?>
<?php include "templates/include/footer.php" ?>
С первой проблемой разобрался при помощи добавления проверки isset:
if (isset($results['user']->login)) echo htmlspecialchars($results['user']->login)
Надписи "Trying to get property of non-object" перестали отображаться.
НО обновление логина и пароля пользователя не происходит про прежнему.
Ссылка на коммит: ПР3
- Log in to post comments
- 10103 reads

vedro-compota
Mon, 06/03/2019 - 00:15
Permalink
уточним
хочу сразу отметить, что эта проверка не совсем корректна в том смысле , чтобы проверяете существование поля объекта, в то время как у вас судя по ошибке нет самого объекта (хотя isset не упадет вообще на любом несуществующем обращении):
чему равна переменная в момент возникновения ошибки? Видимо null?
И далее - почему это происходит? Как именно вы отлаживаете код, выясняете причину? опишите процесс.
_____________
матфак вгу и остальная классика =)
vedro-compota
Mon, 06/03/2019 - 00:19
Permalink
Ещё просьба добавить ссылку
Ещё просьба добавить ссылку на само задание на сайте.
_____________
матфак вгу и остальная классика =)
Pavel1989
Tue, 06/11/2019 - 12:54
Permalink
Дополнение
Создание нового пользователя работает. По умолчанию в классе User задается значение null для login, password, active:
class User { /** * @var string логин пользователя */ public $login = null; /** * @var string пароль */ public $password = null; /** * @var int активность пользователя: 1 - доступ открыт, 0 - доступ закрыт */ public $active = null;Абсолютно не функционирует: редактирование уже созданного пользователя, не работает его удаление.
Отладчиком не пользуюсь, смотрю на код, анализирую, вношу измение в код, затем сохраняю код в редакторе NetBeans и обновляю страницу в браузере.
Внешне функции редактирования пользователя (файл admin.php) выглядят правильно, самостоятельно найти ошибку не получается:
function editUser() { $results = array(); $results['pageTitle'] = "Edit User"; $results['formAction'] = "editUser"; if (isset( $_POST['saveChanges'])) { $user = new User($_POST); // если пользователь меняет логин на занятый выводим форму вновь, если логин // не занят - сохраняем if ($user->update($_POST)) { // логин занят header("Location: admin.php?action=editUser&error=loginExists&" . "userLogin=" . $_POST['userLogin']); } else { header("Location: admin.php?action=listUsers&status=changesSaved"); } } if (isset($_POST['cancel'])) { header("Location: admin.php?action=listUsers"); } else { if (isset($_GET['error'])) { if ($_GET['error'] == 'loginExists') { $results['errorMessage'] = 'Логин занят'; } } $results['user'] = User::getByLogin($_GET['userLogin']); require(TEMPLATE_PATH . "/admin/editUser.php"); } } /** * Удалить пользователя */ function deleteUser() { // проверяем существует ли такой пользователь if (!$user = User::getByLogin($_GET['userLogin'])) { header("Location: admin.php?action=listUsers&error=userNotFound"); return; } $user->delete(); header("Location: admin.php?action=listUsers&status=userDeleted"); }vedro-compota
Tue, 06/11/2019 - 12:58
Permalink
ну так)
ну так попробуйте использовать отладчик или распечатывайте промежуточное значение - чтобы понять как именно "по какой ветки логики" движется код. Это важное умение, проект тут простой как раз чтобы потренировать подойдет
_____________
матфак вгу и остальная классика =)
Pavel1989
Sat, 06/15/2019 - 15:21
Permalink
Работа с отладчиком
Попробовал поставить Breakpoints на тех строках, на которые ссылка в тексте ошибки:
Правильно ли выполняю распечатку объекта? Брейкпоинты лучше ставить в тех строках на которые ссылается ошибка, если я правильно понимаю?
Pavel1989
Sun, 06/16/2019 - 16:11
Permalink
Отладка с указанием переменных
Сделал отладку файлов editUser.php и User.php с укзанием в watches переменных:
Интересен момент: type: null value? Тип переменной: нулевое значение?
vedro-compota
Sun, 06/16/2019 - 23:22
Permalink
null - это да, далее надо выяснить почему
да, т.е. значение null. Что такое null - вспоминаем отдельно. Это что-то типа "без значения".
Там null - т.е. не объект, а у необъекта обратиться к свойству нельзя, о чем и сообщает ошибка:
(вы писали о ней выше).
Далее:
почему там null? откуда должны браться данные для формирования объекта? (из базы или из обработки запроса GET или POST при отправки формы) - выяснили это?
_____________
матфак вгу и остальная классика =)
Pavel1989
Wed, 06/19/2019 - 21:57
Permalink
Если я правильно понимаю, то
Если я правильно понимаю, то login, password, active это свойства класса User и им задается первоначальное значение null, и далее конструктор присваевает им реальные
значения из массива $data. (также реализованно и для классов Category, Article).
class User { public $login = null; /** * @var string пароль */ public $password = null; /** * @var int активность пользователя: 1 - доступ открыт, 0 - доступ закрыт */ public $active = null; public function __construct($data = []) { if (isset($data['login'])) { $this->login = $data['login']; } if (isset($data['password'])) { $this->password = $data['password']; } if (isset($data['active'])) { $this->active = $data['active']; } else { $this->active = 0; } }Обработка POST запроса при отправке формы:
vedro-compota
Mon, 10/14/2019 - 17:10
Permalink
значение по умолчанию для checkbox (html)
Добавляю этот комментарий сильно позже на будущее: используйте такой приём для передачи значения по умолчанию.
_____________
матфак вгу и остальная классика =)