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

<?php

header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);
///////////////////////////////////////////////////////////////////
// соединение с БД //
///////////////////////////////////////////////////////////////////
$db_host = 'localhost';
$db_user = 'root';
$db_password = '';
$db_database = '';

$connect = mysql_connect ($db_host, $db_user, $db_password) or die (mysql_error());
mysql_select_db ($db_database, $connect) or die (mysql_error());

mysql_query ('SET NAMES utf8');
mysql_query ('SET CHARACTER SET utf8');
mysql_query ('SET COLLATION_CONNECTION="utf8_general_ci"');

/////////////////////////////////////////////////////////////////////
// функции //
/////////////////////////////////////////////////////////////////////

function my_stripslashes($value) //Функция stripslashes
{
$value = is_array($value) ?
array_map('my_stripslashes', $value) :
stripslashes($value);
return $value;
}
//если magic_quotes вкл. удаляем
if(get_magic_quotes_gpc())
{
$_GET = my_stripslashes($_GET);
$_POST = my_stripslashes($_POST);
}
//////////////////////////////////////////////////////////////////////

function my_esc($value) //функция mysql_real_escape_string
{
$value = is_array($value) ?
array_map('my_esc', $value) :
mysql_real_escape_string($value);
return $value;
}
//////////////////////////////////////////////////////////////////////

function my_html($value) //функция htmlspecialchars
{
$value = is_array($value) ?
array_map('my_html', $value) :
htmlspecialchars($value);
return $value;
}
/////////////////////////////////////////////////////////////////////
// переменные //
/////////////////////////////////////////////////////////////////////
$name = !empty($_POST['name']) ? trim($_POST['name']) : NULL;
$go_reg = isset($_POST['go_reg']) ? TRUE : FALSE;
$search_name = !empty($_GET['search_name']) ? $_GET['search_name'] : NULL;
$search = isset($_GET['search']) ? TRUE : FALSE;
$id = !empty($_GET['id']) ? $_GET['id'] : NULL;
unset($error);
$error = array();

/////////////////////////////////////////////////////////////////////
// регистрация //
/////////////////////////////////////////////////////////////////////

if($go_reg)
{
if($name)
{
mysql_query("INSERT INTO `names`
SET `name` = '"
.my_esc($name). "',
`date` = CURRENT_TIMESTAMP
"
) or die(mysql_error());
header('location: http://' .$_SERVER['HTTP_HOST'] .$_SERVER['PHP_SELF']);
exit();
}
else
$error[] = 'Поле "Регистрация" пустое';
}
//////////////////////////////////////////////////////////////////////////
// Вывод всех //
//////////////////////////////////////////////////////////////////////////


$lll_sql = mysql_query ("SELECT * FROM `names`
ORDER by `id` DESC
"
) or die (mysql_error());
$num = mysql_num_rows($lll_sql);

echo 'Регистраций: ' .(int)$num. '<br />';

while ($row = mysql_fetch_assoc ($lll_sql))
{
echo '<a href = ?id=' .(int)$row['id']. '>' .my_html($row['name']). '</a><br />';
}
/////////////////////////////////////////////////////////////////////////
// Вывод даты //
/////////////////////////////////////////////////////////////////////////
if ($id)
{
$lll_sql = mysql_query ("SELECT * FROM `names`
WHERE `id` = "
.(int)$id
) or die (mysql_error());
$num = mysql_num_rows($lll_sql);
if ($num > 0)
{
echo '<hr>';
$row = mysql_fetch_assoc($lll_sql);
echo 'Пользователь: <b>' .my_html($row['name']). '</b><br />
Зарегистрирован: <b>'
.my_html($row['date']). '</b><br />';
echo '<hr>';
}
else
$error[] = 'Нет такого :)';
}
//////////////////////////////////////////////////////////////////////
// Поиск //
//////////////////////////////////////////////////////////////////////

if($search)
{
if($search_name)
{
$search_name = my_esc($search_name);
$lll_sql = mysql_query("SELECT * FROM `names`
WHERE `name`
LIKE '%"
.addcslashes($search_name, '%\\\'_'). "%'
"
) or die (mysql_error());
$num = mysql_num_rows($lll_sql);

if ($num > 0)
{
echo '<hr><font color="red">Результат поиска</font><br />';
while ($row = mysql_fetch_assoc($lll_sql))
{
echo '<a href = ?id=' .(int)$row['id']. '>' .my_html($row['name']). '</a><br />';
}
echo '<hr>';
}
else
$error[] = 'Ничего не найдено';
}
else
$error[] = 'Поле "Поиск" пустое';
}

//вывод ошибок
//var_dump($go_reg);
//var_dump($search);

if(count($error))
{
echo '<hr><font color="red">Внимание!!!</font><br />';
foreach($error as $err)
{
echo my_html($err). '<br />';
}
echo '<hr>';
}
?>
<pre>
<form
action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
Регистрация:
<input name="name" type="text" />
<input
name="go_reg" type="submit" value="Зарегистрироваться" />
</form>
<form
action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="get">
Поиск:
<input name="search_name" type="text" value="<?php echo my_html($search_name); ?>" />
<input
name="search" type="submit" value="Найти" />
</form>
</pre>





Спустя 11 минут, 38 секунд (26.08.2012 - 14:12) Семён написал(а):

У тебя не фильтруется $search_name

Спустя 10 минут, 7 секунд (26.08.2012 - 14:22) ApxanreJl написал(а):
упустил) щас исправлю) спс!

Спустя 25 минут, 37 секунд (26.08.2012 - 14:48) twin написал(а):
Хорошая работа. Почти отличная. Респект.
Есть несколько придирок замечаний, что бы не зря)))

1. Вот так ты пишешь напрасно:
	$connect = mysql_connect ($db_host, $db_user, $db_password) or die (mysql_error());    
mysql_select_db ($db_database, $connect) or die (mysql_error());
Дело в том, что пока нет коннекта, нет и ошибок. А значит функция mysql_error() тут совершенно бесполезна. Обычно туда пишут сервисное сообщение плана "Нет соединения с сервером MySQL

2. Вот тут:
$go_reg      =  isset($_POST['go_reg'])     ? TRUE : FALSE; 
не нужна тернарная операция. Достаточно так:
$go_reg      =  isset($_POST['go_reg']); 
и лучше использовать !empty() иначе можно напороться на причуды ИЕ.

3. Вот это немного избыточно:
		$num = mysql_num_rows($lll_sql);						
if ($num > 0)
{
echo '<hr>';
$row = mysql_fetch_assoc($lll_sql);
echo 'Пользователь: <b>' .my_html($row['name']). '</b><br />
Зарегистрирован: <b>'
.my_html($row['date']). '</b><br />';
echo '<hr>';
}
else
$error[] = 'Нет такого :)';
проще вот так:
        $row = mysql_fetch_assoc($lll_sql);

if (!empty($row))
{
echo '<hr>';

echo 'Пользователь: <b>' .my_html($row['name']). '</b><br />
Зарегистрирован: <b>'
.my_html($row['date']). '</b><br />';
echo '<hr>';
}
else
$error[] = 'Нет такого :)';


4. Ни и с отступами нужно что-то решать. Не годится так. Не используй табулятор или заменяй его на 4 пробела. Есть настройки в редакторах, есть программы специальные. Но так не пойдет:

Спустя 3 минуты, 9 секунд (26.08.2012 - 14:51) twin написал(а):
А, вот еще финт непонятный:
unset($error);
$error = array();
Чего ты там уничтожаешь?

Спустя 8 минут, 55 секунд (26.08.2012 - 15:00) ApxanreJl написал(а):
Цитата (twin @ 26.08.2012 - 12:48)
4. Ни и с отступами нужно что-то решать. Не годится так. Не используй табулятор или заменяй его на 4 пробела. Есть настройки в редакторах, есть программы специальные. Но так не пойдет:

спасибо за оценку и за замечания!
я пользуюсь редактором Dreamweaver когда от туда копирую суда то текст разбегается сам)) я этот код уже у Вас пробовал ровнять вот что получилось. может это быть из за того что я пользуюсь и табуляцией и иногда отодвигаю пробелом? щас попробую исправить в редакторе все на 'tab'.

Спустя 7 минут, 2 секунды (26.08.2012 - 15:07) KOPOJI написал(а):
еще хотел добавить.
1. вообще расширение mysql не советуют использовать - можете даже на офф сайте php.net посмотреть - рекомендуют mysqli хотя бы или, что имхо еще лучше - PDO.
2. зачем столько функций на одностроковую встроенную функцию? почитайте про KISS.. (я про ваши функции проверки и очистки) - да и вообще, с чего вы проверяете массив там или строка? :blink:
3.
Цитата
header('location: http://' .$_SERVER['HTTP_HOST'] .$_SERVER['PHP_SELF']);
А просто $_SERVER['PHP_SELF'] вас чем не устраивает?
4. вот это вот все
Цитата
mysql_query ('SET NAMES utf8');          
  mysql_query ('SET CHARACTER SET utf8'); 
  mysql_query ('SET COLLATION_CONNECTION="utf8_general_ci"');
уже давно (насколько помню с MySQL 5.0) можно заменить одной строчкой:
mysql_set_charset('utf8');

5.
Цитата
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>"
лучше заменить на $_SERVER['PHP_SELF'] имхо
6. перед регистрацией необходимо проверять, существует такой юзер уже или нет.. это как бы обязательная процедура, а то у вас тут клонов будет не обсчитаетесь)
7. ну и еще то, на что вам уже указали

P.S. табуляция просто ужасная, читать практически невозможно)

Спустя 2 минуты, 56 секунд (26.08.2012 - 15:10) ApxanreJl написал(а):
Цитата (twin @ 26.08.2012 - 12:51)
А, вот еще финт непонятный:
unset($error);
$error      =  array();
Чего ты там уничтожаешь?

ну тут у меня была проблемка, если кликнуть по пустому поиску и потом по постой реги то в массиве были обе ошибки. чего мне было не нужно. вот так пытался уничтожить старые ошибки. оказалось все проще
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>"  method="post">

и все заработало как нужно))

Спустя 2 часа, 29 минут, 12 секунд (26.08.2012 - 17:39) twin написал(а):
KOPOJI
Поробую немного заступиться)))

Цитата
зачем столько функций на одностроковую встроенную функцию?
Вообще это обертки для обработки массивов. В контексте данного задания они конечно излишни, но часто приносят довольно приличный профит. Допустим так:
..."SELECT....   `id` IN ('". implode("','", my_esc($arr_names)) ."')"...

Цитата
А просто $_SERVER['PHP_SELF'] вас чем не устраивает?
По идее можно и так, но по RFC нужен полный путь в заголовке. Вместе с протоколом.

Цитата
перед регистрацией необходимо проверять, существует такой юзер уже или нет.. это как бы обязательная процедура, а то у вас тут клонов будет не обсчитаетесь)
Это не требовалось условиями. Тут упор на обработку, это лишнее.

Спустя 1 час, 6 минут, 41 секунда (26.08.2012 - 18:45) KOPOJI написал(а):
ок, заступки приняты))) по поводу первого - я это знаю, но заметьте, что вы тоже признаете:
Цитата
В контексте данного задания они конечно излишни
Цитата
Это не требовалось условиями
а по поводу этого я считаю что это должно быть в любой нормальной регистрации. Это мое имхо, я просто указал на этот недостаток, извиняюсь если кого обидел)

Спустя 1 час, 1 минута, 26 секунд (26.08.2012 - 19:47) ApxanreJl написал(а):
Цитата (twin @ 26.08.2012 - 15:39)
Цитата
зачем столько функций на одностроковую встроенную функцию?
Вообще это обертки для обработки массивов. В контексте данного задания они конечно излишни, но часто приносят довольно приличный профит. Допустим так:
..."SELECT....   `id` IN ('". implode("','", my_esc($arr_names)) ."')"...


ну я привыкаю просто к ним вот и сюда тоже их))) насколько проще написать my_html чем htmlspecialchars smile.gif

Спустя 18 часов, 32 минуты, 57 секунд (27.08.2012 - 14:20) twin написал(а):
Разделил решения. Вот тут второе.

Спустя 2 часа, 27 минут (27.08.2012 - 16:47) Семён написал(а):
Цитата
не нужна тернарная операция. Достаточно так:

$go_reg      =  isset($_POST['go_reg']);

и лучше использовать !empty() иначе можно напороться на причуды ИЕ.


и нотис biggrin.gif без isset

Спустя 2 часа, 51 минута, 14 секунд (27.08.2012 - 19:38) twin написал(а):
Цитата (Семён @ 27.08.2012 - 14:47)
и нотис biggrin.gif без isset

Хто сказал?)))

Чтим кодекс мануал:
Цитата
No warning is generated if the variable does not exist. That means empty() is essentially the concise equivalent to !isset($var) || $var == false.
Быстрый ответ:

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