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

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

 

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

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

тема: Решение задачи №21 Ремикс.
 
 автор: Николай2357   (05.10.2010 в 20:29)   письмо автору
 
 

Условия задачи здесь

Два года назад я уже решал эту задачу. Страшно вспомнить))
Собственно она мне и дала путевку в жизнь. Хотелось бы узнать, далеко ли я за эти два года продвинулся.
Вот как я решил бы её сегодня:
<?php 

    header
("Content-Type: text/html; charset=utf-8"); 
    
error_reporting(E_ALL);     
/**
* Блок соединения с сервером БД
*/
    
include('config.php'); 
 
    
mysql_connectMYSQL_HOSTMYSQL_USERMYSQL_PASSWORD );
    
mysql_select_db(MYSQL_DATABASE);

    
mysql_query('SET NAMES utf8');
    
mysql_query('SET CHARACTER SET utf8'); 
    
mysql_query('SET COLLATION_CONNECTION="utf8_general_ci"');
    
/**
* Функция борьбы с магическими кавычками
* @param $data mixed
* @return mixed
*/    
    
if(get_magic_quotes_gpc())  
    { 
        function 
stripslashesDeep($data)     
        {     
            if(
is_array($data))      
                
$data array_map("stripslashesDeep"$data);      
            else    
                
$data stripslashes($data);
                 
            return 
$data
        }
          
        
$_GET stripslashesDeep($_GET);   
        
$_POST stripslashesDeep($_POST);
    }

/**
* Блок удаления
*/    
    
if(!empty($_GET['del']) && !empty($_GET['id']))
    {
            
mysql_query("DELETE FROM `guests`
                         WHERE `id` = "
. (int)$_GET['id']
                         );
            
header('location: http://'$_SERVER['HTTP_HOST'
                                      . 
$_SERVER['PHP_SELF']);                
            exit();
    }
    
/**
* Блок регистрации нового посетителя
* и подсчета визитов
*/    
    
if(!empty($_POST['ok']))
    {
        
$guestname = @$_POST['guestname'];
        
        if(
trim($guestname) !== '')
        {
            
mysql_query("INSERT INTO `guests` 
                         SET `guestname` = '"
mysql_real_escape_string($guestname) ."',
                             `visits`    = 1
                         ON DUPLICATE KEY UPDATE
                             `visits`    = `visits` + 1 "
                    
)or die(mysql_error());
            
            
$id mysql_insert_id();
            
header('location: http://'$_SERVER['HTTP_HOST'
                                      . 
$_SERVER['PHP_SELF'] .'?vis=1&id='$id);                
            exit();
        }
        else
            
$error 'Введите пожалуйста имя';    
    }
    
/**
* Блок вывода
*/    
    
$solutation '';
    
    if(!empty(
$_GET['search']) && isset($_GET['guestname']))
    {
        
$solutation "Результаты поиска";
        
$where      "WHERE `guestname` = '"mysql_real_escape_string($_GET['guestname']) ."'";
    }
    else
        
$where = !empty($_GET['id']) ? "WHERE `id` = ". (int)$_GET['id'] : '';
    
    
$res mysql_query("SELECT `id`, `guestname`, `visits` 
                         FROM `guests` "
$where
                        
);
                        
    if(
mysql_num_rows($res) > 0)
    {        
        
$out '';
        
$i   0;
         
        while(
$row mysql_fetch_assoc($res))
        {
            
$guestname htmlspecialchars($row['guestname']);
            
            if(
$row['id'] == @$_GET['id'] && !empty($_GET['vis']))
                
$solutation "Привет, <b>"$guestname ."</b>"
                            
" ! Вы знаете, что в Вашем имени "
                            
mb_strlen($row['guestname'], 'utf-8') ." символов?";

                
            
$out .= "  <tr>\n\t<td>". ++$i ."</td>\n"
                 
.  "\t<td><a href=\"?id="$row['id'] ."\">"$guestname ."</a></td>\n"
                 
.  "\t<td>"$row['visits'] ."</td>\n"
                 
.  "\t<td><a href=\"?del=1&id="$row['id'] ."\""
                 
.  "onclick=\"return confirm('"$guestname ."! "
                 
.  "Вы действительно хотите удалить себя из списка?')\""
                 
.  " >del</a></td>\n  <tr>\n";
        }
    }
    else
        
$out '<tr><td colspan="4" > Ничего не найдено </td>';

?>
<html>
<body>
<?php echo $solutation ?>
<table width="20%" border="1" cellspacing="0" cellpadding="0">
  <tr>
    <th>№№</th>
    <th>Посетитель</th>
    <th>Визит</th>
    <th>Х</th>
  </tr>
<?php echo $out ?>
</table>
<strong style="color:#FF0000">
<?php echo !empty($error) ? $error '&nbsp;'?>
</strong>
<form action="" method="post">
<input name="guestname" type="text" /> 
<input name="ok" type="submit" value="Войти" />
</form>
<form action="" method="get">
<input name="guestname" type="text" /> 
<input name="search" type="submit" value="Найти" />
</form>
<a href="?">Показать всех</a>

</body>
</html>


Правда пришлось немного модифицировать таблицу (добавить уникальности))
На вс случай дамп:

CREATE TABLE `guests` (
  `id` int(11) NOT NULL auto_increment,
  `guestname` varchar(250) default NULL,
  `visits` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `guestname` (`guestname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


Еще раз спасибо автору и организаторам конкурса. Я снова пережил незабываемые ошщущения.

  Ответить  
 
 автор: Лена   (05.10.2010 в 21:18)   письмо автору
 
   для: Николай2357   (05.10.2010 в 20:29)
 

Красиво :)

> mysql_query('SET NAMES utf8');
> mysql_query('SET CHARACTER SET utf8');
> mysql_query('SET

COLLATION_CONNECTION="utf8_general_ci"');

Почитайте еще раз про эти запросы. Там просто, сами поймете.

>header('location: http://'. $_SERVER['HTTP_HOST']

я http:// в header`ах не пишу. Может, так правильнее...

>$solutation = "Результаты поиска";

забыли . поставить.

>@$_GET['id']
Это не совсем понятно. Зачем вы заглушку ставите? Чтобы при строгом уровне неопред.индексы не выводило? Так можно ж выше определить...

Я не из предвзятости писала, я тоже сюда хожу учиться, некоторые моменты захотелось уточнить.
А вообще вы молодец :)

  Ответить  
 
 автор: Николай2357   (05.10.2010 в 21:34)   письмо автору
 
   для: Лена   (05.10.2010 в 21:18)
 

Почитайте еще раз про эти запросы. Там просто, сами поймете.
Перемудрил))) каюсь.

я http:// в header`ах не пишу. Может, так правильнее...
RFC требует

забыли . поставить.
Нет, не забыл. Операция перезаписи легче конкатенации, если не ошибаюсь.

Это не совсем понятно. Зачем вы заглушку ставите? Чтобы при строгом уровне неопред.индексы не выводило? Так можно ж выше определить...
Именно для того, чтобы выше не определять) Лень - двигатель прогресса.

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

  Ответить  
 
 автор: Лена   (06.10.2010 в 14:49)   письмо автору
 
   для: Николай2357   (05.10.2010 в 21:34)
 

>Операция перезаписи легче конкатенации, если не ошибаюсь.

В смысле меньше времени и меньше памяти идет?
Если так вот подумать... По памяти, наверное, легче... Конкатенация присоединяет к предыдущему значению новое, т.е. к памяти, которую занимало предыдущее, добавляется новое значение, которое тоже занимает какую-то память.
Перезапись старое значение получается убивает, память освобождается и тратится только на новое. Во втором случае памяти будет заниматься меньше. Ну это если уж совсем под микроскопом смотреть :)

>я http:// в header`ах не пишу. Может, так правильнее...
>RFC требует

Ну если даже не указывать http:// , редирект не пойдет же по ftp или https протоколу?
http тут как бы по умолчанию идет...

  Ответить  
 
 автор: Николай2357   (06.10.2010 в 18:04)   письмо автору
 
   для: Лена   (06.10.2010 в 14:49)
 

>Ну это если уж совсем под микроскопом смотреть :)
Привычка просто. Ничего естественно я там не экономил))

>RFC требует
>http тут как бы по умолчанию идет...
тоже привычка. Trianon по рукам бил больно)))

  Ответить  
 
 автор: psychomc   (08.10.2010 в 00:51)   письмо автору
 
   для: Лена   (05.10.2010 в 21:18)
 

а что именно красиво?
просто интересно...

  Ответить  
 
 автор: Лена   (08.10.2010 в 13:36)   письмо автору
 
   для: psychomc   (08.10.2010 в 00:51)
 

Мне тоже просто интересно, что именно стоит за вашим вопросом?

  Ответить  
 
 автор: psychomc   (08.10.2010 в 23:16)   письмо автору
 
   для: Лена   (08.10.2010 в 13:36)
 

за моим постом стоит исключительно интерес в том, что вам понравилось в коде Николая. не расценивайте это как провокацию или что-то еще. я, бегло просмотрев код, не увидел в нем ничего особенного (это совсем не значит что код плохой - задача такая, хотя функция внутри if смотрится не очень, хоть может быть в этом случае это правильно, но читается как-то странновато), вот и хочу узнать что понравилось вам чтобы сделать выводы для себя. и всего то

  Ответить  
 
 автор: Николай2357   (09.10.2010 в 15:58)   письмо автору
 
   для: psychomc   (08.10.2010 в 23:16)
 

По поводу функции поясню. Она используется единожды и только тогда, когда включена директива. А значит инициализировать её при выключенной нет смысла - лишний расход памяти. По этому определяется она в блоке if
А почему функция - там нужна рекурсия, так что это самый оптимальный вариант ИМХО

Другой вопрос, что в этом скрипте можно было бы и обойтись без рекурсии, но привычка делать масштабируемые программы дает знать)

  Ответить  
 
 автор: psychomc   (10.10.2010 в 14:20)   письмо автору
 
   для: Николай2357   (09.10.2010 в 15:58)
 

ясно, в принципе может быть это и правильно.
я то за собой заметил, что больше внимания уделяю читабельности кода, нежели экономии. например иногда у меня название переменной состоит из 10-15 символов и т.п. пока что на грабли из-за этого не напоролся, хотя и высоконагруженных систем не делал

  Ответить  
Rambler's Top100
вверх

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