|
|
|
| Ответ 004 на задачу N 21.
С условиями задачи можно ознакомится по ссылке.
<?php
/**
* Редирект на гравную страницу
*/
function task21_redirect() {
header("Location: http://".$_SERVER['HTTP_HOST']."/".$_SERVER['PHP_SELF']."");
exit;
}
/**
* Проверка правильного ввода имени
*
* @param string $name Проверяемое имя
* @return string Текст сообщения
*/
function task2_check_name($name) {
$error = '';
if ($name > 255)
$error = "Длина имени не должна превышать 255 символов";
if (!task21_check_exists_user($name))
$error = "Такое имя уже существует, введите другое";
return $error;
}
/**
* Проверяет существование пользователя
*
* @param string $name Проверяемое имя
* @return boolean true если пользователь не существует
*/
function task21_check_exists_user($name) {
$name = mysql_real_escape_string($name);
$sql = "SELECT id FROM guests WHERE guestname = '$name'";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
return empty($row);
}
/**
* Возвращает всех пользователей в таблице
*
* @return array
*/
function task21_get_users() {
$guest = array();
$sql = "SELECT * FROM guests";
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
$row['questname'] = htmlspecialchars($row['guestname']);
$guest[] = $row;
}
return $guest;
}
/**
* Добавляет пользователя в базу
*
* @param string $name Имя добавляемого пользователя
*/
function task21_add_user($name) {
$visits = intval(@$_SESSION['counter']);
$dbname = mysql_real_escape_string($name);
$sql = "INSERT INTO guests (id, guestname, visits) VALUES (NULL, '$dbname', $visits)";
mysql_query($sql);
$_SESSION['user_id'] = mysql_insert_id();
$_SESSION['user_name'] = $name;
task21_redirect();
}
/**
* Удаляет пользователя из базы
*
* @param integer $id Индификатор пользователя
*/
function task21_del_user($id) {
$id = (int)$_REQUEST['id'];
$sql = "DELETE FROM guests WHERE id = $id";
@mysql_query($sql);
session_destroy();
unset($_SESSION['user_id']);
unset($_SESSION['user_name']);
task21_redirect();
}
/**
* Поиск пользователя
*
* @param string $name Имя пользователя в параметрах поиска
*/
function task21_search_user($name) {
$name = mysql_real_escape_string($name);
$guest = array();
$sql = "SELECT * FROM guests WHERE guestname = '$name'";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
if (empty($row)) {
echo "Не найдено ни одного пользователя ";
echo "<a href='javascript:history.back()'>Вернутся</a>";
exit;
}
$row['questname'] = htmlspecialchars($row['guestname']);
$guest[] = $row;
task21_display($guest, false);
exit;
}
/**
* Обработка действий скрипта
*
*/
function task21_actions() {
if ($_REQUEST['act'] == "add_user") {
// Проверяем имя
$error = task2_check_name($_REQUEST['name']);
if (!empty($error)) {
task21_display(task21_get_users(), $error);
exit;
}
// Добавляем пользователя
task21_add_user($_REQUEST['name']);
}
else if ($_REQUEST['act'] == "del_user")
task21_del_user($_REQUEST['id']);
else if ($_REQUEST['act'] == "search_user")
task21_search_user($_REQUEST['name']);
echo "Команда не известна";
exit;
}
/**
* Вывод таблицы на экран
*
* @param array $guest Двумерный массив с информацией о пользователях
* @param string $error Возможная ошибка
*/
function task21_display($guest, $error) {
$rowcounter = 1; // счетчик строк
?>
<html>
<head>
<title>Задача №21</title>
</head>
<body>
<?php if (!isset($_SESSION['user_id'])) :?>
<form method="post" action="task21.php">
<label for="user_name"><input id="user_name" name="name" /></label>
<input type="hidden" name="act" value="add_user" />
<input type="submit" value="Добавить себя" />
</form>
<?php else:?>
Привет, <?php echo $_SESSION['user_name'] ?>! Вы знаете, что в Вашем имени <?php echo strlen($_SESSION['user_name']) ?> символов?
<?php endif; ?>
<?php echo ($error) ?>
<table border="1">
<tr>
<th>№</th>
<th>Гость</th>
<th>визит</th>
<th>x</th>
</tr>
<?php foreach($guest as $questinfo): ?>
<tr>
<td><?php echo $rowcounter++ ?></td>
<td><?php echo $questinfo['guestname']?></td>
<td><?php echo $questinfo['visits']?></td>
<td><a href="?act=del_user&id=<?php echo $questinfo['id']?>">del</a></td>
</tr>
<?php endforeach; ?>
<?php if (empty($guest)) : ?>
<tr><td colspan="4">В таблице нет данных</td></tr>
<?php endif;?>
</table>
<?php if (!(isset($_REQUEST['act']) && $_REQUEST['act'] == "search_user")) : ?>
<form method="get" action="task21.php">
<label for="user_name_search"><input id="user_name_search" name="name" /></label>
<input type="hidden" name="act" value="search_user" />
<input type="submit" value="Найти" />
</form>
<?php else: ?>
Пользователь найден! <a href='javascript:history.back()'>Вернутся</a>
<?php endif; ?>
</body>
</html>
<?php
}
error_reporting(E_ALL);
ini_set("display_errors", 1);
mysql_connect("localhost", "root", "");
mysql_select_db("task21");
session_start();
if (isset($_REQUEST['act'])) {
task21_actions();
}
if (!isset($_SESSION['user_id'])) {
if (!isset($_SESSION['counter']))
$_SESSION['counter'] = 0;
} else {
$id = $_SESSION['user_id'];
$sql = "UPDATE guests SET visits = visits+1 WHERE id = $id";
$name = $_SESSION['user_name'];
$result = mysql_query($sql);
}
$_SESSION['counter']++;
task21_display(task21_get_users(), false);
?>
|
http://www.softtime.ru/info/task.php?id_article=110 | |
|
|
|
|
|
|
|
для: SoftTime
(30.05.2007 в 23:30)
| | 1) 206 строк, читебельность хорошая, комментарии скупые (на самом деле в промышленном, а не учебном коде так и надо).
2) не правильно обрабатывается ввод пользователя при помощи функции mysql_real_escape_string(). Если включён режим магических кавычек, то войти под пользователем "I don't know" уже не получится - будет создано новый пользователь "I don\'t know". Конструкцию
<?php
$name = mysql_real_escape_string($name);
?>
|
следует заменить на
<?php
if (!get_magic_quotes_gpc())
{
$name = mysql_real_escape_string($name);
}
?>
|
А собственно одна из главных особенностей этого задания - корректная вставка текста в СУБД.
Кстати, mysql_real_escape_string() работате только при установленном соединение с СУБД, без него работать не будет.
3) Привязка к названию файла (task21.php) - плохо.
4) Перед удалением пользователя не спрашивает подтверждение - плохо.
5) Нет обработки ошибок SQL-запросов, запросы являются динамическими и ошибки могут возникать. | |
|
|
|
|
|
|
|
для: cheops
(01.06.2007 в 12:13)
| | ----
Удалено.
----
А остальное - поторопился, за что и поплатился :) | |
|
|
|
|
|
|
|
для: Artem S.
(01.06.2007 в 13:57)
| | Хм... сунули бы туда $_SERVER['PHP_SELF'] :))) - а так пришлось файл переименовывать - я-то не переломлюсь, а у неискушённых пользователей скриптов это часто вызывает вопросы. Но это не сильный недочёт - так придирка - на собеседовании это бы не влияло бы ни на что. | |
|
|
|
|
|
|
|
для: cheops
(01.06.2007 в 14:02)
| | Да я подумал и удалил свой ответ, еще не увидив ваш
:) | |
|
|
|
|
|
|
|
для: SoftTime
(30.05.2007 в 23:30)
| | Скрипт не находит пользователя с амперсадом и пользователя с процентом.
Точнее, с амперсандом находит не того.
Ну и соответственно, некорректно его отображает.
Мне очень понравился стиль оформления кода. Респект.
Немного скриншотов процесса проверки см. в аттаче
Upd. Не берут у меня архивы.
Глядите здесь. | |
|
|
|