[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Задачана на корректную обработку данных
Winston
Условия задачи

index.php
Свернутый текст
<?[SPAN=darling]php[/SPAN]
header ("Content-Type: text/html; charset=utf-8");

include 'script.php';
echo '<title>Регистрация</title>';
echo "<link rel='stylesheet' href='style.css'>";

// $QS - query string, чтобы получить id из строки браузера.
if ($QS = $_SERVER["QUERY_STRING"])
{
// Отделяем id.
$expl = explode ("=", $QS);
if (ctype_digit ($expl[1]))
{
$sql3 = "SELECT * FROM `names` WHERE `id`='".(int)$expl[1]."'";
$query3 = mysql_query ($sql3);
// Получаем Имя и Дату регистрации пользователя по id.
$row = mysql_fetch_assoc ($query3);
echo "<b>Пользователь: </b><font color='blue'>".$row['name']."</font>";
echo "<br/><b>Дата регистрации: </b><font color='blue'>".$row['date']."</font><hr/>";
}
}

echo '<h3>Всего зарегистрировано: '.$count.' пользователей</h3><br/>';

// Выводим тех кто есть.
while ($row = mysql_fetch_assoc ($query2))
{
print "<ul type='square'><li>";
print "<table class='border'><tr><td>";
print "<a href='index.php?id=".(int)$row['id']."'>".$row['name']."</a><br/>";
print "</td></tr></table>";
print "</li></ul>";
}

// Выводим форму.
echo '<br/>';
include 'form.php';
?>


script.php
Свернутый текст
<?[SPAN=darling]php[/SPAN]
define ("HOST", "localhost");
define ("USER", "task");
define ("PASS", "RFhbVA2V");
define ("DB", "task");


$connect = mysql_connect(HOST, USER, PASS, '3306');
mysql_select_db (DB, $connect);

mysql_query ("SET NAMES utf8");
mysql_query ("set character_set_client='utf8'");
mysql_query ("set character_set_results='utf8'");
mysql_query ("set collation_connection='utf8_general_ci'");

$go = isset ($_POST['go']) ? $_POST['go'] : NULL;
$ok = isset ($_GET['ok']) ? $_GET['ok'] : NULL;
$user = !empty ($_POST['user']) ? htmlspecialchars ($_POST['user']) : NULL;
$search = !empty ($_GET['search']) ? htmlspecialchars ($_GET['search']) : NULL;
$form = isset ($search) ? $search : NULL;
$RegExp = preg_match("/^ *$/iu", $user);

if ($go && $user && !$RegExp)
{
if (strlen ($user) >= 250)
header ("Location: ".$_SERVER['SCRIPT_NAME']);

else
{
// Вставляем запись и делаем редирект.
mysql_query ("
INSERT INTO `names`
(`name`)
VALUES ('"
.mysql_real_escape_string ($user)."')
"
);

header ("Location:".$_SERVER['PHP_SELF']);
}
}

elseif ($go && empty ($user))
header ("Location:".$_SERVER['PHP_SELF']);

if ($ok && $search)
{
if (strlen ($search) >= 250)
header ("Location:".$_SERVER['SCRIPT_NAME']);

else
{
// Запрос на поиск данных.
$sql = "SELECT *
FROM `names`
WHERE `name`
LIKE '%%"
.mysql_real_escape_string (addcslashes ($search, "%_"))."%%'
ORDER BY `name`"
;

$query = mysql_query ($sql);
// Подсчитываем количество найденных совпадений.
$count = mysql_num_rows ($query);
$srch = "{ <font color='blue' size='5'><u>".$search."</u></font> }";

if ($count == 0 || $search == '')
echo "<font color='red' size='10'>Ничего не найденно !</font>";

else
{
echo "<font color='green' size='5'>По вашему запросу $srch найденно: ";
echo $count." совпадений </font><br/>";
// Выводим тех кого нашли.
while ($row = mysql_fetch_assoc ($query))
{
print '<ul><li>';
print $row['name'].'<br/>';
print '</li></ul>';
}

}
}

echo '<hr/>';
}

// Запрос на выборку зарегеных в обратном порядке, и подсчет их.
$sql2 = "SELECT * FROM `names` ORDER BY `date` DESC";
$query2 = mysql_query ($sql2);
$count = mysql_num_rows ($query2);

?>


.htaccess
Свернутый текст
AddDefaultCharset UTF-8
php_flag magic_quotes_gpc Off
php_flag magic_quotes_runtime Off
php_flag register_globals Off


form.php
Свернутый текст
   <form action="<?[SPAN=darling]php[/SPAN] $_SERVER['SCRIPT_NAME'] ?>" method="POST">
<input
type="TEXT" name="user" maxlength="250" style="border: solid 1px"> <br />
<input
type="submit" name="go" value="Зарегистрировать"> <br />
</form>

<form
action="<?[SPAN=darling]php[/SPAN] $_SERVER['SCRIPT_NAME'] ?>" method="GET">
<input
type="text" name="search" maxlength="250" style="border: solid 1px" value="<?[SPAN=darling]php[/SPAN] echo $form ?>"> <br />
<input
type="submit" name="ok" value="Поиск"> <br />
</form>


style.css
Свернутый текст
a:color {color: blue;}
a:visited {color: red;
text-decoration: none;}

.border {border: solid 1px;
width: 100%}

Выложил все файлы которые были написаны.
Здесь тестим, потом в этой теме высказываемся.
Здесь работа twin'а.



Спустя 14 минут, 47 секунд (5.04.2010 - 22:24) Winston написал(а):
Какой-то хостинг тупорылый, регишся, а он тормозит blink.gif

Чё все молчат ? Никто не может ничего сказать ?

Спустя 8 часов, 3 минуты, 15 секунд (6.04.2010 - 06:27) twin написал(а):
Упс, я пропустил что то)))
Сейчас посмотрим.

Спустя 1 час, 15 минут, 13 секунд (6.04.2010 - 07:43) twin написал(а):
Чувствуется влияние конкурсов, не зря участвовал. smile.gif
Код читается легко, комментарии есть в нужных местах. Есть пара мелочей с табуляторами, но в целом приятно.

Вот с функционалом не так гладко. Вот это для чего ритуальная пляска?
  if ($QS = $_SERVER["QUERY_STRING"])
{
// Отделяем id.
$expl = explode ("=", $QS);
if (ctype_digit ($expl[1]))
Почему сразу из GET не взять значение? И с обработкой перестарался. ctype_digit() потом (int) еще. Наверное не до конца понял механизм.

Дальше. Никак не могу уловить смысла вот этой перезаписи:
         $sql3 = "SELECT * FROM `names` WHERE `id`='".(int)$expl[1]."'";
$query3 = mysql_query ($sql3);

Почему сразу в функцию текст запроса не отправить? Ведь мало того, что лишняя память, так и читабельносчти ой как не добавляет.

Дальше еще хуже. Ошибки уже фатальные.
1. Скрипт зависим от директивы magic_quotes_gpc, а это было в условиях
2. Вот это место совсем нехорошо
   $user    = !empty ($_POST['user'])      ? htmlspecialchars ($_POST['user'])   : NULL;
$search = !empty ($_GET['search']) ? htmlspecialchars ($_GET['search']) : NULL;


Попробуй зарегистрировать вот такие имена O"Relly O\"Relly O\'Relly и посмотри, как будет вести себя поисковик. А еще загляни в базу и посмотри что там. Там совсем не то, что предполагалось. Это и есть искажение данных, на борьбу с которым и расчитана эта задача.

Вот это место поясни пожалуйста:
   $RegExp  = preg_match("/^ *$/iu", $user);


Потом, в location нужно ставить полный адрес, начиная с протокола. У тебя путь относительный, причем используется то $_SERVER['SCRIPT_NAME'], то $_SERVER['PHP_SELF']. И после хидера нужно ставить остановку exit или die.
Зачем скрипту продолжать работу, если браузер его уже покинул?
Но вообщем и целом весьма недурное начало. smile.gif


Спустя 1 час, 11 минут, 12 секунд (6.04.2010 - 08:54) Winston написал(а):
Цитата (twin @ 6.04.2010 - 06:43)
Почему сразу из GET не взять значение?

Да насчет этого протупил, даже не подумал об этом sad.gif
Цитата (twin @ 6.04.2010 - 06:43)
Дальше. Никак не могу уловить смысла вот этой перезаписи:

При нажатии на ссылку, получаем id, и вытаскиваем запись.
Цитата (twin @ 6.04.2010 - 06:43)
1. Скрипт зависим от директивы magic_quotes_gpc, а это было в условиях

У маня есть .htaccess в котором эти директивы отключены. У меня после поиска ничё не экранируется.
Цитата (twin @ 6.04.2010 - 06:43)
Вот это место совсем нехорошо

Что там плохо ?
Цитата (twin @ 6.04.2010 - 06:43)
Вот это место поясни пожалуйста:

Если поле состоит только из одного пробела или любого его количества, значит не регистрируем.
Цитата (twin @ 6.04.2010 - 06:43)
причем используется то $_SERVER['SCRIPT_NAME'], то $_SERVER['PHP_SELF']

Недосмотрел, забыл поменять.
Спасибо за критику smile.gif

Спустя 16 минут, 39 секунд (6.04.2010 - 09:11) twin написал(а):
Цитата
При нажатии на ссылку, получаем id, и вытаскиваем запись.
Я не это имел ввиду. Почему текст запроса пишется сначала в переменную, потом она подставляется в функцию? Вот так же проще, нагляднее и экономичнее
         $query3 = mysql_query ("SELECT * FROM `names` WHERE `id`='".(int)$expl[1]."'");

Вот сразу еще ошибочка. Целочисленные значения не нужно в апострофы:
         $query3 = mysql_query ("SELECT * FROM `names` WHERE `id`=".(int)$expl[1]);

Цитата
У маня есть .htaccess в котором эти директивы отключены.

Вот именно. То есть ты её отключил. А в условиях было - независимо от того, включена или нет.
Цитата
Что там плохо ?
Я написал что. Данные искажаются и поисковик не работает корректно. В базу вместо кавычки записывается &quot;, что совсем не одно и тоже.

Цитата
Если поле состоит только из одного пробела или любого его количества, значит не регистрируем.
Ясно. Это ты попытался сэмулировать функцию trim() по всей видимости.

Спустя 6 минут, 34 секунды (6.04.2010 - 09:17) Winston написал(а):
Цитата (twin @ 6.04.2010 - 08:11)
Целочисленные значения не нужно в апострофы:

Спс учту.
Цитата (twin @ 6.04.2010 - 08:11)
А в условиях было - независимо от того, включена или нет.

И как так сделать ?

Спустя 23 минуты, 37 секунд (6.04.2010 - 09:41) phz написал(а):

# Борьба с магическими кавычками

if (get_magic_quotes_gpc())
{
function stripslashes_deep($value)
{
if( is_array($value) )
{
$value = array_map('stripslashes_deep', $value);
}
elseif ( !empty($value) && is_string($value) )
{
$value = stripslashes($value);
}
return $value;
}

$_GET = stripslashes_deep($_GET);
$_POST = stripslashes_deep($_POST);
$_COOKIE = stripslashes_deep($_COOKIE);
$_REQUEST = stripslashes_deep($_REQUEST);
}

Спустя 6 часов, 29 минут, 20 секунд (6.04.2010 - 16:10) Winston написал(а):
Цитата (twin @ 6.04.2010 - 08:11)
Данные искажаются и поисковик не работает корректно. В базу вместо кавычки записывается &quot;, что совсем не одно и тоже.

Как тогда посоветуешь поступить ? На выходе обрабатывать ф-й htmlspecialchars ?

phz
Спасибо за код smile.gif

Спустя 30 минут, 42 секунды (6.04.2010 - 16:41) phz написал(а):
На входе mysql_real_escape_string на выходе htmlspecialchars и будет самый смак
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.