|
|
|
| Ответ 002 на задачу N 21.
С условиями задачи можно ознакомится по ссылке.
Вот моё решение ))) Надеюсь, что задание понял правильно и ничего не забыл...
<?php
mysql_connect("localhost", "root", ""); // Подключаемся к БД
mysql_select_db("guests"); // Выбираем нужную нам БД
//Проверяем, пусты ли два ГЕТ-параметра и если да, то...
if(empty($_GET['name']) AND empty($_GET['razdel']))
{
//Проверяем, нажата или нет кнопка с названием enter и если нет, то...
if(!isset($_POST['enter']))
{
//Начинается форма для апгрейда\создания записи в таблице
?>
<form method="post">
<input name="guestname" type="text" value="" <? echo $text_disabled; ?>> - Ваше имя<BR>
<input name="enter" type="submit" value="Зайти">
</form>
<?
//Смотрим, если ГЕт-переменная не пуста, то выводим имя в приветствие, если же пуста, то имя будет ГОСТЬ
if(!empty($_GET['yourname']))
{
$yourname = $_GET['yourname'];
}
else
{
$yourname = "ГОСТЬ";
}
// Выводим ПРИВЕТСТВИЕ
echo "Привет, ".$yourname."! Вы знаете, что в Вашем имени ".strlen($yourname)." символов? <BR>
Нас уже посетили: <BR>";
//Переменная, содержащая в себе выполняемый запрос к таблице guests
$visits_query = mysql_query("SELECT * FROM guests");
$i=0;
echo "<table border=1>";
echo "<tr>
<td>№</td>
<td>Гость</td>
<td>визит</td>
<td>x</td>
</tr>";
//Создаём массив
while($va = mysql_fetch_array($visits_query))
{
// Увеличиваем значение переменной на единицу
$i++;
echo "<tr>
<td>".$i."</td>
<td><a href='?name=".$va['guestname']."'>".$va['guestname']."</a></td>
<td>".$va['visits']."</td>
<td><a href='?razdel=del&guestname=".$va['guestname']."'>del</a></td>
</tr>";
}
echo "</table>";
echo "<BR><BR>
";
//Форма поиска юзера
?>
<form method="GET">
<input name="name" type="text" value=""> - найти гостя по <b>ТОЧНОМУ</b> имени<BR>
<input type="submit" value="Искать">
</form>
<?
}
else
{
//Переменная с запросов для поиска юзера
$prov_enter_users_query = mysql_query("SELECT * FROM guests WHERE guestname='".$_POST['guestname']."'");
//Есть ли юзер с таким именем уже в таблице, если да, то...
if(mysql_num_rows($prov_enter_users_query) > 0)
{
//Обновить число его визитов на один
mysql_query("UPDATE guests SET visits=visits+1 WHERE guestname='".$_POST['guestname']."'");
//Обновить страницу
echo "<meta http-equiv='refresh' content='0; url=index.php?yourname=".$_POST['guestname']."'>";
}
else
{
// а если нет, то посмотреть длину имени, если больше 255, то...
if(strlen($_POST['guestname']) > 255)
{
// вывести ошибку
echo "Error! Имя слишком длинное...";
//Обновить страницу
echo "<meta http-equiv='refresh' content='1; url=index.php'>";
}
else
{
// а если нет, то создать еще одну запись с именем юзера и числом заходов равным 1
mysql_query("INSERT INTO guests
(`guestname`, `visits`)
VALUES
('".$_POST['guestname']."', 1)");
//Обновить страницу
echo "<meta http-equiv='refresh' content='0; url=index.php?yourname=".$_POST['guestname']."'>";
}
}
}
}
elseif(!empty($_GET['name']))
{
//Переменная с запросов для поиска юзера
$name_prov = mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['name']."'");
if(mysql_num_rows($name_prov) > 0)
{
//Если такой юзер найден, то вывести его имя и число визитов
$na = mysql_fetch_array($name_prov);
echo $na['guestname']." - имя <BR>
".$na['visits']." - число визитов ";
}
else
{
// Если же нет, то вывести сообщение с сожалением :)
echo "К сожалению такой пользователь ен анйден :( Мне очень жаль... новы главное не растраивайтесь, всё образумится... возможно чуть попозже такой пользователь объявится, вы с ним пообщаетесь и всё будет хорошо... Но не надо себя обнадёживать, этого может и не случиться :(";
}
}
elseif(!empty($_GET['razdel']))
{
//Если ГЕТ-параметр razdel не пуст, то посмотреть, пуст ли ГЕТ-параметр guestname
if(empty($_GET['guestname']))
{
// если да, то вывести ошибку
echo "Вы не указали логин гостя которого надо удалить из БД";
}
else
{
// если нет, то в переменную засунуть запрос с поиском юзера по имени
$login_prov_query = mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['guestname']."'");
// если такой есть, то...
if(mysql_num_rows($login_prov_query) > 0)
{
//Удалить его из таблицы и обновить страницу
mysql_query("DELETE FROM guests WHERE guestname='".$_GET['guestname']."'");
echo "<meta http-equiv='refresh' content='0; url=index.php'>";
}
else
{
// Если же нет, то вывести сообщение
echo "Гость с таким именем не найден!";
}
}
}
?>
|
http://www.softtime.ru/info/task.php?id_article=110 | |
|
|
|
|
|
|
|
для: SoftTime
(25.05.2007 в 13:58)
| | 1) 139 строк, читабельность не плохая, комментарии присуствуют.
2) При создании динамических запросов не обрабатываются кавычки - это приводит к тому, что возможна SQL-инъекция http://www.softtime.ru/article/index.php?id_article=81. Кроме того, пользователи вида "i don't know" войти уже не смогут. Все тектовые строки перед помещением в SQL-запрос следует обрабатывать при помощи конструкции
<?php
if (!get_magic_quotes_gpc())
{
$_POST['guestname'] = mysql_escape_string($_POST['guestname']);
}
?>
|
А собственно одна из главных особенностей этого задания - корректная вставка текста в СУБД.
3) Нет обработки ошибок SQL-запросов, запросы являются динамическими и ошибки могут возникать. Да и просто может быть выбрана неправильная база данных.
4) Привязка к названию файла (index.php) - плохо.
5) Перед удалением пользователя не спрашивает подтверждение - плохо. | |
|
|
|
|
|
|
|
для: SoftTime
(25.05.2007 в 13:58)
| | Скрипт работает нестабильно.
Причиной этого, насколько я мог понять, является построение с применением meta refresh, такой механизм очень чувствителен к настройкам кеширования.
Во всяком случае у меня скрипт внезапно без определенной причины вообще переставал реагировать на ввод имен, ранее в нем вводившихся.
Более точно определить причину я не успел.
Кстати отсутствие отступов в верхней части скрипта не способствует тому, чтобы оперативно въехать в его логику.
Немного скриншотов процесса проверки см. в аттаче | |
|
|
|
|
|
|
|
для: Trianon
(01.06.2007 в 18:31)
| | >Немного скриншотов процесса проверки см. в аттаче
аттачи то будут? | |
|
|
|
|
|
|
|
для: sms-send
(01.06.2007 в 19:53)
| | Не берут у меня архивы.
Глядите здесь. | |
|
|
|
|
|
|
|
для: SoftTime
(25.05.2007 в 13:58)
| | Спасибо за критику! ПРиму к сведению, в принципе уже некоторые скрипты изменил (например некоторые функции в новой CMS). В следующий раз приу всё это к сведению, как говорится попытка - не пытка ))) | |
|
|
|
|
|
|
|
для: DEM
(02.06.2007 в 00:30)
| | Вам никто не мешает сделать еще одну попытку и в этот раз. :) | |
|
|
|
|
|
|
|
для: Trianon
(02.06.2007 в 00:32)
| | А разве уже не прекращёно принимание сркиптов? Тем более зная ошибки, их можно исправить и всё будет подходить под то, что нужно (просто прочитать ХЕОПСА и ВАШИ комментарии) | |
|
|
|
|
|
|
|
для: SoftTime
(25.05.2007 в 13:58)
| |
<?php
ob_start(); //Вклчаем возможность пользоваться header() где угодно.
//Функция безопасности :) $str - строчка которую будем хирургировать )))
function bez($str)
{
$str = htmlspecialchars($str, ENT_QUOTES);
$str = trim($str);
$str = stripslashes($str);
$str = strip_tags($str)
$str = str_replace("'", """, $str);
$str = str_replace('"', """, $str);
$str = str_replace('&', "&", $str);
$str = nl2br($str);
if (!get_magic_quotes_gpc())
{
$str = mysql_escape_string($str);
}
return $str;
}
mysql_connect("localhost", "root", "") OR dir("Невозможно найти сервер MySQL"); // Подключаемся к БД
mysql_select_db("guests") OR dir("Невозможность подключиться к БД"); // Выбираем нужную нам БД
//Исправляем переменные, что бы были, как надо :)
$_GET['name'] = bez($_GET['name']);
$_GET['razdel'] = bez($_GET['razdel']);
$_GET['yourname'] = bez($_GET['yourname']);
//Проверяем, пусты ли два ГЕТ-параметра и если да, то...
if(empty($_GET['name']) AND empty($_GET['razdel']))
{
//Проверяем, нажата или нет кнопка с названием enter и если нет, то...
if(!isset($_POST['enter']))
{
//Начинается форма для апгрейда\создания записи в таблице
?>
<form method="post">
<input name="guestname" type="text" value="" <? echo $text_disabled; ?>> - Ваше имя<BR>
<input name="enter" type="submit" value="Зайти">
</form>
<?
//Смотрим, если ГЕт-переменная не пуста, то выводим имя в приветствие, если же пуста, то имя будет ГОСТЬ
if(!empty($_GET['yourname']))
{
$yourname = $_GET['yourname'];
}
else
{
$yourname = "ГОСТЬ";
}
// Выводим ПРИВЕТСТВИЕ
echo "Привет, ".$yourname."! Вы знаете, что в Вашем имени ".strlen($yourname)." символов? <BR>
Нас уже посетили: <BR>";
//Переменная, содержащая в себе выполняемый запрос к таблице guests
$visits_query = mysql_query("SELECT * FROM guests");
$i=0;
echo "<table border=1>";
echo "<tr>
<td>№</td>
<td>Гость</td>
<td>визит</td>
<td>x</td>
</tr>";
//Создаём массив
while($va = mysql_fetch_array($visits_query))
{
// Увеличиваем значение переменной на единицу
$i++;
echo "<tr>
<td>".$i."</td>
<td><a href='?name=".$va['guestname']."'>".$va['guestname']."</a></td>
<td>".$va['visits']."</td>
<td><a href='?razdel=del&guestname=".$va['guestname']."'>del</a></td>
</tr>";
}
echo "</table>";
echo "<BR><BR>
";
//Форма поиска юзера
?>
<form method="GET">
<input name="name" type="text" value=""> - найти гостя по <b>ТОЧНОМУ</b> имени<BR>
<input type="submit" value="Искать">
</form>
<?
}
else
{
$g_name = bez($_POST['guestname']); // Изменяем имя пользователя (введёное) под нужное
//Переменная с запросов для поиска юзера
$prov_enter_users_query = mysql_query("SELECT * FROM guests WHERE guestname='".$g_name."'");
//Есть ли юзер с таким именем уже в таблице, если да, то...
if(mysql_num_rows($prov_enter_users_query) > 0)
{
//Обновить число его визитов на один
mysql_query("UPDATE guests SET visits=visits+1 WHERE guestname='".$g_name."'");
//Обновить страницу
header("?yourname=".$g_name);
}
else
{
// а если нет, то посмотреть длину имени, если больше 255, то...
if(strlen($g_name) > 255)
{
// вывести ошибку
echo "Error! Имя слишком длинное...";
//Обновить страницу
header($_SERVER['PHP_SELF']);
}
else
{
// а если нет, то создать еще одну запись с именем юзера и числом заходов равным 1
mysql_query("INSERT INTO guests
(`guestname`, `visits`)
VALUES
('".$g_name."', 1)");
//Обновить страницу
header("?yourname=".$g_name);
}
}
}
}
elseif(!empty($_GET['name']))
{
//Переменная с запросов для поиска юзера
$name_prov = mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['name']."'");
if(mysql_num_rows($name_prov) > 0)
{
//Если такой юзер найден, то вывести его имя и число визитов
$na = mysql_fetch_array($name_prov);
echo $na['guestname']." - имя <BR>
".$na['visits']." - число визитов ";
}
else
{
// Если же нет, то вывести сообщение с сожалением :)
echo "К сожалению такой пользователь ен анйден :( Мне очень жаль... новы главное не растраивайтесь, всё образумится... возможно чуть попозже такой пользователь объявится, вы с ним пообщаетесь и всё будет хорошо... Но не надо себя обнадёживать, этого может и не случиться :(";
}
}
elseif(!empty($_GET['razdel']))
{
//Если ГЕТ-параметр razdel не пуст, то посмотреть, пуст ли ГЕТ-параметр guestname
if(empty($_GET['guestname']))
{
// если да, то вывести ошибку
echo "Вы не указали логин гостя которого надо удалить из БД";
}
else
{
// если нет, то в переменную засунуть запрос с поиском юзера по имени
$login_prov_query = mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['guestname']."'");
// если такой есть, то...
if(mysql_num_rows($login_prov_query) > 0)
{
//Удалить его из таблицы и обновить страницу
mysql_query("DELETE FROM guests WHERE guestname='".$_GET['guestname']."'");
header($_SERVER['PHP_SELF']);
}
else
{
// Если же нет, то вывести сообщение
echo "Гость с таким именем не найден!";
}
}
}
?>
|
| |
|
|
|
|
|
|
|
для: DEM
(04.06.2007 в 22:50)
| | Вы явно переборщили с защитой:
<?php
function bez($str)
{
$str = htmlspecialchars($str, ENT_QUOTES); // это явно не для базы
$str = trim($str); // имя с пробелом на конце или в начале уже не прокатит, да и фик с ним
$str = stripslashes($str); // вот это уже интересно, а если имя будет "my\'name"?
$str = strip_tags($str); // хочу имя <sms-send>
$str = str_replace("'", """, $str);
$str = str_replace('"', """, $str);
$str = str_replace('&', "&", $str); // после htmlspecialchars это уже не актуально
$str = nl2br($str);
if (!get_magic_quotes_gpc())
{
$str = mysql_escape_string($str); // обработка для базы и для вывода должна идти отдельно
}
return $str;
}
?>
|
что это за заголовок, догадываюсь, Location, наверно должен быть:
<?php
header("?yourname=".$g_name);
?>
|
| |
|
|
|
|
|
|
|
для: sms-send
(04.06.2007 в 23:05)
| | Э???? Странно, что мне не выдало ошибку... мдя ((( ВОт исправленнй вариант (ксати, спасибо):
<?php
ob_start(); //Вклчаем возможность пользоваться header() где угодно.
//Функция безопасности :) $str - строчка которую будем хирургировать )))
function bez($str)
{
$str = htmlspecialchars($str, ENT_QUOTES);
$str = trim($str);
$str = str_replace(">", ">;", $str);
$str = str_replace("<", "<;", $str);
$str = str_replace("'", """, $str);
$str = str_replace('"', """, $str);
$str = str_replace('&', "&", $str);
if (!get_magic_quotes_gpc())
{
$str = mysql_escape_string($str);
}
return $str;
}
mysql_connect("localhost", "root", "") OR die("Невозможно найти сервер MySQL"); // Подключаемся к БД
mysql_select_db("guests") OR die("Невозможность подключиться к БД"); // Выбираем нужную нам БД
//Исправляем переменные, что бы были, как надо :)
$_GET['name'] = bez($_GET['name']);
$_GET['razdel'] = bez($_GET['razdel']);
$_GET['yourname'] = bez($_GET['yourname']);
//Проверяем, пусты ли два ГЕТ-параметра и если да, то...
if(empty($_GET['name']) AND empty($_GET['razdel']))
{
//Проверяем, нажата или нет кнопка с названием enter и если нет, то...
if(!isset($_POST['enter']))
{
//Начинается форма для апгрейда\создания записи в таблице
?>
<form method="post">
<input name="guestname" type="text" value="" <? echo $text_disabled; ?>> - Ваше имя<BR>
<input name="enter" type="submit" value="Зайти">
</form>
<?
//Смотрим, если ГЕт-переменная не пуста, то выводим имя в приветствие, если же пуста, то имя будет ГОСТЬ
if(!empty($_GET['yourname']))
{
$yourname = $_GET['yourname'];
}
else
{
$yourname = "ГОСТЬ";
}
// Выводим ПРИВЕТСТВИЕ
echo "Привет, ".$yourname."! Вы знаете, что в Вашем имени ".strlen($yourname)." символов? <BR>
Нас уже посетили: <BR>";
//Переменная, содержащая в себе выполняемый запрос к таблице guests
$visits_query = mysql_query("SELECT * FROM guests");
$i=0;
echo "<table border=1>";
echo "<tr>
<td>№</td>
<td>Гость</td>
<td>визит</td>
<td>x</td>
</tr>";
//Создаём массив
while($va = mysql_fetch_array($visits_query))
{
// Увеличиваем значение переменной на единицу
$i++;
echo "<tr>
<td>".$i."</td>
<td><a href='?name=".$va['guestname']."'>".$va['guestname']."</a></td>
<td>".$va['visits']."</td>
<td><a href='?razdel=del&guestname=".$va['guestname']."'>del</a></td>
</tr>";
}
echo "</table>";
echo "<BR><BR>
";
//Форма поиска юзера
?>
<form method="GET">
<input name="name" type="text" value=""> - найти гостя по <b>ТОЧНОМУ</b> имени<BR>
<input type="submit" value="Искать">
</form>
<?
}
else
{
$g_name = bez($_POST['guestname']); // Изменяем имя пользователя (введёное) под нужное
//Переменная с запросов для поиска юзера
$prov_enter_users_query = mysql_query("SELECT * FROM guests WHERE guestname='".$g_name."'");
//Есть ли юзер с таким именем уже в таблице, если да, то...
if(mysql_num_rows($prov_enter_users_query) > 0)
{
//Обновить число его визитов на один
mysql_query("UPDATE guests SET visits=visits+1 WHERE guestname='".$g_name."'");
//Обновить страницу
header("Location: ?yourname=".$g_name);
}
else
{
// а если нет, то посмотреть длину имени, если больше 255, то...
if(strlen($g_name) > 255)
{
// вывести ошибку
echo "Error! Имя слишком длинное...";
//Обновить страницу
header("Location: ".$_SERVER['PHP_SELF']);
}
else
{
// а если нет, то создать еще одну запись с именем юзера и числом заходов равным 1
mysql_query("INSERT INTO guests
(`guestname`, `visits`)
VALUES
('".$g_name."', 1)");
//Обновить страницу
header("Location: ?yourname=".$g_name);
}
}
}
}
elseif(!empty($_GET['name']))
{
//Переменная с запросов для поиска юзера
$name_prov = mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['name']."'");
if(mysql_num_rows($name_prov) > 0)
{
//Если такой юзер найден, то вывести его имя и число визитов
$na = mysql_fetch_array($name_prov);
echo $na['guestname']." - имя <BR>
".$na['visits']." - число визитов ";
}
else
{
// Если же нет, то вывести сообщение с сожалением :)
echo "К сожалению такой пользователь ен анйден :( Мне очень жаль... новы главное не растраивайтесь, всё образумится... возможно чуть попозже такой пользователь объявится, вы с ним пообщаетесь и всё будет хорошо... Но не надо себя обнадёживать, этого может и не случиться :(";
}
}
elseif(!empty($_GET['razdel']))
{
//Если ГЕТ-параметр razdel не пуст, то посмотреть, пуст ли ГЕТ-параметр guestname
if(empty($_GET['guestname']))
{
// если да, то вывести ошибку
echo "Вы не указали логин гостя которого надо удалить из БД";
}
else
{
// если нет, то в переменную засунуть запрос с поиском юзера по имени
$login_prov_query = mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['guestname']."'");
// если такой есть, то...
if(mysql_num_rows($login_prov_query) > 0)
{
//Удалить его из таблицы и обновить страницу
mysql_query("DELETE FROM guests WHERE guestname='".$_GET['guestname']."'");
header("Location: ".$_SERVER['PHP_SELF']);
}
else
{
// Если же нет, то вывести сообщение
echo "Гость с таким именем не найден!";
}
}
}
?>
|
| |
|
|
|
|
|
|
|
для: DEM
(04.06.2007 в 23:47)
| | мне показалось, что в скрипте ничего не изменилось...
Всё о же дикое количество нотайсов,
(хотя намек в скриншотах на то, что это скажется
на результате, трудно было не заметить).
Казалось бы ну что сложного добавить одну строку - ан нет.
Скрипт всё также некорректно отображает символы в таблице.
например имена & и & он выводит одинаково - одним амперсендом.
И точно также глотает символы в имени total %25 of sales (в js-алерте).
Так что по главному требованию увы - незачет.
Скрипт устойчив к побочным эффектам (F5, go back, go forward).
Скрипт все также не обрабатывает ошибки БД.
Потом я перестал гонять скрипт на тестах, а решил посмотреть его код.
Самое начало - вот эта крамола "функция безопасности" поставила всё на места.
Автор всё еще считает, что безопасность - это такая штука,
которую можно упихать в одну функцию.
Грустно. :( | |
|
|
|
|
|
|
|
для: Trianon
(05.06.2007 в 14:17)
| | Это старая привычка :( Всё никак не могу отвыкнуть от неё... Просто вообще, всегда путаюсь, где какую надо исопльзовать... Раньше использовал htmlspecialchar(); и striptegs();, но вот потом стал делать так и никак не могу отвыкнуть :(
ЗЫ. Но я рад, если честно, что мой сркипт получился корявеньким :) Теперь есть смысл дальше учить РНР... | |
|
|
|
|