Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 004 на задачу N 21
 
 автор: SoftTime   (30.05.2007 в 23:30)   письмо автору
 
 

Ответ 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 
"Не найдено ни одного пользователя&nbsp;";
        echo 
"<a href='javascript:history.back()'>Вернутся</a>";
        exit;
    }
    
$row['questname'] = htmlspecialchars($row['guestname']);  
    
$guest[] = $row;
    
    
task21_display($guestfalse);
    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: ?>    
    Пользователь найден!&nbsp;<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

   
 
 автор: cheops   (01.06.2007 в 12:13)   письмо автору
 
   для: 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-запросов, запросы являются динамическими и ошибки могут возникать.

   
 
 автор: Artem S.   (01.06.2007 в 13:57)   письмо автору
 
   для: cheops   (01.06.2007 в 12:13)
 

----
Удалено.
----

А остальное - поторопился, за что и поплатился :)

   
 
 автор: cheops   (01.06.2007 в 14:02)   письмо автору
 
   для: Artem S.   (01.06.2007 в 13:57)
 

Хм... сунули бы туда $_SERVER['PHP_SELF'] :))) - а так пришлось файл переименовывать - я-то не переломлюсь, а у неискушённых пользователей скриптов это часто вызывает вопросы. Но это не сильный недочёт - так придирка - на собеседовании это бы не влияло бы ни на что.

   
 
 автор: Artem S.   (01.06.2007 в 14:06)   письмо автору
 
   для: cheops   (01.06.2007 в 14:02)
 

Да я подумал и удалил свой ответ, еще не увидив ваш
:)

   
 
 автор: Trianon   (01.06.2007 в 19:04)   письмо автору
 
   для: SoftTime   (30.05.2007 в 23:30)
 

Скрипт не находит пользователя с амперсадом и пользователя с процентом.
Точнее, с амперсандом находит не того.
Ну и соответственно, некорректно его отображает.

Мне очень понравился стиль оформления кода. Респект.

Немного скриншотов процесса проверки см. в аттаче
Upd. Не берут у меня архивы.
Глядите здесь.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования