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

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

 

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

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

тема: Очередной ответ на задачу 21.
 
 автор: Рома   (05.10.2009 в 02:46)   письмо автору
 
 

Всегда ленился решить, но все таки поборол себя.
Ошибся с таблицей, дамп выкладываю.

<?php
 
// структура таблицы
 /*
 CREATE TABLE `guests`
 (
 `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
 `name` TINYTEXT NOT NULL,
 `visits` INT(11) NOT NULL,
 PRIMARY KEY (id)
 ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
 */

 // уровень ошибок
 
Error_Reporting(E_ALL & ~E_NOTICE);

 
// функция восстановления испорченных входных параметров
 
function rec_stripslashes($mixed)
 {
   if(
is_array($mixed))
   {
     
$mixed=array_map("rec_stripslashes",$mixed);
     foreach(
$mixed as $key=>$value)
     {
       
$arr=array();
       
$keynew=stripslashes($key);
       if(
$keynew!==$key)
       {
         
$mixed[$keynew]=$mixed[$key];
         unset(
$mixed[$key]);
       }
       
$arr=$mixed;
     }
    return 
$mixed;
   }
   else
   {
      return 
stripslashes($mixed);
   }
 }

  
// если вдруг магические кавычки включены
 
if(get_magic_quotes_gpc())
 {
   
$_GET=rec_stripslashes($_GET);
   
$_POST=rec_stripslashes($_POST);
   
$_COOKIE=rec_stripslashes($_COOKIE);
 }

 
// настройки MySQL
 
$mshost="localhost";  // Хост mysql
 
$msuser="root";  // Имя пользователя mysql
 
$mspassword="";  // Пароль mysql
 
$msname="";  // Имя базы данных mysql

 // подключение к базе
 
$msconnect=@mysql_connect($mshost,$msuser,$mspassword);
 if(!
$msconnect)exit("Идет перезагрузка сервера базы данных, работа сайта возобновиться через 5 - 10 минут.");
 
$select=@mysql_select_db($msname,$msconnect);
 if(!
$select)exit("Идет перезагрузка сервера базы данных, работа сайта возобновиться через 5 - 10 минут.");
 
mysql_query ("SET NAMES `cp1251`");

 function 
menu($name)
 {
      
?>
   <table width="100%" align="center">
   <tr>
   <td width="50%" align="center">
   <form action="" method="post">
   <input type="text" name="reg">
   <input type="submit" value="Зарегистрироваться">
   </form>
   </td>
   <td width="50%" align="center">
   <form action="" method="get">
   <input type="text" name="search" value="<?php echo $name;?>">
   <input type="submit" value="Найти">
   </form>
   </td>
   </tr>
   </table>
   <?php
 
}

 
// функция вывода всех зарегистрированных
 
function guests()
 {
      
$sql_g="SELECT * FROM guests";
      
$res_g=mysql_query($sql_g) or die("Error 0: ".mysql_error());
      if(
mysql_num_rows($res_g)>0)
      {
        
?>
        <table width="50%" align="center">
        <tr><td colspan="4" align="center">Нас уже посетили:<br><br></td></tr>
     <tr>
     <td width="20" align="center">№</td>
     <td width="50" align="center">Имя</td>
     <td width="20" align="center">Визит</td>
     <td width="50" align="center">?</td>
     <tr>
        <?php
        
while($str=mysql_fetch_array($res_g))
        {
             echo 
"<tr><td width=\"20\" align=\"center\">".$str['id']."</td>";
             echo 
"<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?search=".htmlspecialchars($str['name'])."\">".htmlspecialchars($str['name'])."</a></td>";
             echo 
"<td width=\"20\" align=\"center\">".$str['visits']."</td>";
             echo 
"<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?delete=".htmlspecialchars($str['name'])."\" onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\">Удалить</a></td>";
       echo 
"</tr>";
        }
        echo 
"</table>";
      }
 }

 
// регистрация
 
if($_POST)
 {
   
// проверка на пустое поле
   
$name=trim($_POST['reg']);
   if(!empty(
$name))
   {
     
// если слишком длинное имя
     
$name=substr($name0255);
        
$sql="SELECT * FROM guests WHERE name='".mysql_real_escape_string($name)."'";
        
$res=mysql_query($sql) or die("Error 1: ".mysql_error());
        if(
mysql_num_rows($res)==0)
        {
             
$sql="INSERT INTO guests VALUES (0, '".mysql_real_escape_string($name)."', 1)";
       
$res=mysql_query($sql) or die("Error 2: ".mysql_error());
        }
        else
        {
             
$sql="UPDATE guests SET visits = visits + 1 WHERE name='".mysql_real_escape_string($name)."'";
             
$res=mysql_query($sql) or die("Error 3: ".mysql_error());
        }
     
header("location: ".$_SERVER['PHP_SELF']);exit;
   }
   else
   {
     
header("location: ".$_SERVER['PHP_SELF']);exit;
   }
 }
 elseif(
$_GET)
 {
   
// поиск
   
if(isset($_GET['search']))
   {
     
// проверка на пустое поле
        
$search=trim($_GET['search']);
        if(!empty(
$search))
        {
          
$search=substr($search0255);
             
$sql="SELECT * FROM guests WHERE name LIKE '%".mysql_real_escape_string($search)."%'";
             
$res=mysql_query($sql) or die("Error 4: ".mysql_error());
             echo 
menu($search);
             if(
mysql_num_rows($res)>0)
             {
                  echo 
"<hr><center>Результат поиска:<br>";
                  while(
$str=mysql_fetch_array($res))
                  {
           echo 
htmlspecialchars($str['name'])."<br>";
                  }
                  echo 
"</center><hr>";
                  echo 
guests();
             }
             else
             {
                  echo 
"<hr><center><b>".htmlspecialchars($search)."</b> к нам не заходил</center><hr>";
                  echo 
guests();
             }
        }
        else
        {
       
header("location: ".$_SERVER['PHP_SELF']);exit;
        }
   }
   elseif(isset(
$_GET['delete']))
   {
     
// проверка на пустое поле
     
$delete=trim($_GET['delete']);
     if(!empty(
$delete))
     {
       
$delete=substr($delete0255);
          
$sql="DELETE FROM guests WHERE name='".mysql_real_escape_string($delete)."'";
       
$res=mysql_query($sql) or die("Error 5: ".mysql_error());
       
header("location: ".$_SERVER['PHP_SELF']);exit;
     }
   }
 }
 else
 {
      
$name="";
   echo 
menu($name).guests();
 }

?>

  Ответить  
 
 автор: Рома   (07.10.2009 в 23:01)   письмо автору
 
   для: Рома   (05.10.2009 в 02:46)
 

И что, никто не нашел ошибку?

  Ответить  
 
 автор: Trianon   (07.10.2009 в 23:47)   письмо автору
 
   для: Рома   (07.10.2009 в 23:01)
 

В предыдущих решениях описаны контрпримеры, на которых тестировалось (неудачно, к сожаленеию) большинство ответов.

Приветствие не реализовано.
Поисковая форма в строке
<input type="text" name="search" value="<?php echo $name;?>">
также будет разрушена.
Аргументы в ссылках
echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?search=".htmlspecialchars($str['name'])."\">".htmlspecialchars($str['name'])."</a></td>";
echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?delete=".htmlspecialchars($str['name'])."\" onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\">Удалить</a></td>";
тоже не кодируются.
Предупреждающий alert не реализован...

Как-то об ошибках речь даже и не идет...

  Ответить  
 
 автор: Рома   (08.10.2009 в 00:01)   письмо автору
 
   для: Trianon   (07.10.2009 в 23:47)
 

<input type="text" name="search" value="<?php echo $name;?>">
также будет разрушена.

На этом и провалился. <a href="http://mail.ru">mail</a> сломало работу скрипта.

>Приветствие не реализовано.

Мне не пришло в голову как реализовать приветствие, с учетом защиты от F5. разве что сессии.

>Аргументы в ссылках
> echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?search=".htmlspecialchars($str['name'])."\">".htmlspecialchars($str['name'])."</a></td>";
> echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?delete=".htmlspecialchars($str['name'])."\" onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\">Удалить</a></td>";
>тоже не кодируются.

А разве это нарушает работу скрипта? или просто невыполненный пункт решения задачи.

>Предупреждающий alert не реализован...

onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\" =- это и есть оно.

Спасибо за комментарии, починю.

  Ответить  
 
 автор: Trianon   (08.10.2009 в 00:31)   письмо автору
 
   для: Рома   (08.10.2009 в 00:01)
 

>>Аргументы в ссылках
>> echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?search=".htmlspecialchars($str['name'])."\">".htmlspecialchars($str['name'])."</a></td>";
>> echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?delete=".htmlspecialchars($str['name'])."\" onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\">Удалить</a></td>";
>>тоже не кодируются.
>
>А разве это нарушает работу скрипта?

А попробуйте имя с # внутри.

Нарушает, согласованную работу браузера и сервера. Возможны XSS и т.п. вещи.
>
>>Предупреждающий alert не реализован...
>
>onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\" =- это и есть оно.
>

Да, пардон, попытка реализовать была.
(Это к вопросу о читабельности. Скроллить текст вправо мне в голову не пришло. )
Но, увы, неудачная. Тоже из-за отсутствия кодирования (при чем на двух уровнях, браузера и JS)

  Ответить  
 
 автор: Рома   (08.10.2009 в 01:01)   письмо автору
 
   для: Trianon   (08.10.2009 в 00:31)
 

>А попробуйте имя с # внутри.

Вот именно поэтому я и считаю нецелесообразным ставить ссылку не на id. Но как частный случай, разобраться придется, куда ж деваться.

  Ответить  
 
 автор: Trianon   (08.10.2009 в 01:08)   письмо автору
 
   для: Рома   (08.10.2009 в 01:01)
 

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

Число проще.
Но тогда целессообразно за задачу не браться. Опять же - потому что так проще.

никто не обещал, что будет легко :)

UPD. с другой стороны, научившись писать код честно (не полагаясь, что браузер и так проглотит) потом как-то легче и спокойнее становится. :)

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

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