[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Решение "Задачи на корректную обработку данных"
DedMorozzz
Условия тут.
<?php
//Мы увидим всё...
error_reporting (E_ALL);

//Установка подключения к матрице
mysql_connect ('localhost', 'root', '') or die(mysql_error());
mysql_select_db ('test') or die(mysql_error());

//Установка языка, на котором будем общаться, т.е. Юникод
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'");

define("page","security.php");

$user_name_search = (!empty($_GET ['search']) ? mysql_real_escape_string(addcslashes($_GET['search'], '%\\')) : '');
$user_register = (!empty($_POST['register']) ? trim($_POST['register']) : NULL);
$user_pick = (!empty($_GET ['id']) ? (int)$_GET['id'] : NULL);

//Убираем последствия магических кавычек, если оные имеют место быть
function restore_magic_quotes($value)
{
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Если переменная - число, то экранировать её не нужно
// если нет - то окружем её кавычками, и экранируем

if (!is_numeric($value)) {
$value = "'".mysql_real_escape_string($value)."'";
}
return $value;
}

//Регистрация нового юзверя, после чего делаем редирект, тем самым очищая ПОСТ
if($user_register){
$insert_query = "INSERT INTO `names` (`date`, `name`) VALUES (NOW(), ".restore_magic_quotes($user_register).")";
$result = mysql_query($insert_query) or die(mysql_error());
header("Location:".page);
}

//Ищем юзера, на основании введённых данных. Если найдено - выводим строем
if($user_name_search){
$query = "SELECT * FROM `names`WHERE `name` LIKE '%".$user_name_search."%'";
$result = mysql_query($query) or die(mysql_error());
$user_count = mysql_num_rows($result);

if($user_count>0){
echo '<b>Find '.$user_count.' users:</b><br />';
echo '<ul>';
while($user_search = mysql_fetch_assoc($result)){
echo '<li>'.htmlspecialchars($user_search['name']).'</li>';
}
echo '</ul>';
}
else echo "<b>Brugere not found!</b><br /><br />";
}

//Сдаём всё о выбраном юзере
if($user_pick){
$query = "SELECT `date`,`name` FROM `names` WHERE `id`='".$user_pick."'";
$result = mysql_query($query) or die(mysql_error());
while($reg_user = mysql_fetch_assoc($result)){
echo 'Дата регистрации пользователя <b><span style=\'color:red\'>'.htmlspecialchars($reg_user['name']).'</span></b>: '.($reg_user['date']).'<br />';
}
}


//Вывод всех зарегистрированных, в обратном порядке
$select_query = "SELECT * FROM `names` ORDER BY DATE DESC ";
$result = mysql_query($select_query) or die(mysql_error());
while($user_write = mysql_fetch_assoc($result)){
echo '<a href=security.php?id='.$user_write['id'].'>'.htmlspecialchars($user_write['name']).'</a><br />';
}
?>

<form action="<?php page ?>" method="post">
<
input name="register" type="text"/>
<
input type="submit"/>
<
br />
</
form>
<
form action="<?php page ?>" method="get">
<
input name="search" type="text"/>
<
input value="Find" type="submit"/>
</
form>


Буду рад любым комментариям по делу. Что можно было бы улучшить иль сделать иначе/проще.



Спустя 3 часа, 16 минут, 39 секунд (22.06.2010 - 16:24) DedMorozzz написал(а):
Хм...по страной причине Огнелис спойлер не открывал. Хром нормально, огнелис - нивкакую

Спустя 30 минут, 58 секунд (22.06.2010 - 16:55) DedMorozzz написал(а):
добавил константу, что бы проще было изменять адресацию...

Спустя 27 минут, 23 секунды (22.06.2010 - 17:22) twin написал(а):
Ну для начала, со стилем. С фигурными скобками.
Объясню поподробнее, что бы все знали.

Существует два основных стиля расстановки фигурных скобок.

1. "Рациональный стиль" Считается самым продвинутым, но только потому, что он и самый старый. Его привнесли Керниген и Ричи, авторы языка C.
  if($var == 1){  
echo "Hello world!";
}

Преимущество - уменьшение вертикального пространства (экономия строк)
Недостаток - при большой вложенности трудночитаем, так как не видно начало и конец блока.

2. Более молодой и более читаемый, но менее почитаемый апологетами "стиль BSD" или "Стиль Алмена"
  if($var == 1)
{
echo "Hello world!";
}

Преимущество - начало и конец блока легко отследить прокручиванием колесика мыши при любой вложенности.
Недостаток - увеличивается количество строк и код "разъезжается" по вертикали.

Как видно - оба стиля не совершенны. И каждый волен выбирать свой. Но.
Если их смешивать, код становится совершенно нечитаемым, так как ждешь скобку в одном месте (так как все аккуратно и стильно), а она черти где.
ИМХО проще читать заведомую кашу, там сразу настраиваешься на бардак.

И хоть тут в одном месте (с функцией), все равно обидно.
И круглых скобок явный перебор.



Дальше, с магическими кавычками что то не совсем то. В поиске имею ввиду. При включенной директиве работает некорректно. Кстати, данные в форму не возвращаются, а это было в условиях.

Редирект. Ну во первых, после редиректа скрипт желательно останавливать, во вторых, очень плохо, что скрипт привязан к названию файла. Это же касается ссылок и форм.
Кроме того, RFC требует полного пути в функции header(). вместе с протоколом.

    header('location: http://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);     
exit();


Функция restore_magic_quotes() неоднозначна. Ты же потом в запросе зачем то заключил id в апострофы... Этого не нужно, именно потому, что данные целочисленные. А получилось в точности до наоборот, если смотреть на запрос. Литеральные без апострофов, а числовые в них.
Это хорошо функция рядом - видно. А если далеко в другом файле?


Ну а вообще конечно гут. Чувствуется рука мастера.




Спустя 39 секунд (22.06.2010 - 17:23) twin написал(а):
Пока писал, один косяк исправил))


_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Быстрый ответ:

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