[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Решение задачи от Твина
AlmazDelDiablo
Условия задачи здесь.

Собственно, почти вся работа была сделана за 3,5 часа, но вот поиск по соответствию убил у меня 2 часа. Большое спасибо Анбу, который подсказал запрос в базу для такого поиска. Без него, наверное, до завтра бы ковырял smile.gif

Посмотреть в работе можно тут:
http://almazdeldiablo.ru/index.php

Заранее прошу прощения за небольшую путаницу в коде - вначале делал все под переключатель ?page=reg и ?page=users, но потом забил на это дело.
Исходники:

Файл index.php
<?php

define( 'KEY', true );

require_once 'functions.php';


/* Если нажата кнопка, начинаем проверять данные */
if( isset( $_POST['submit'] ) ) {

/* Вывод ошибки, если поле не заполнено */
if( $_POST['name'] == '' ) {
table_open( 'Ошибка', '', 'padding-bottom: 10px;' );
table_body( '
<tr>
<td style="background: #f2f6fa; border-bottom: #4a627d 1px solid; padding: 5px; font-size: 9pt;">
Введите имя для регистрации
</td>
</tr>
'
);
table_close();
$errors[] = 'Не введен ник';
}

/* Если нет ошибок, добавляем юзера */
if( !count( $errors ) ) {
sql_connect( $host, $user, $pass, $db );
mysql_query( "INSERT INTO `names`
SET
`name` = '"
. mysql_real_escape_string( $_POST['name'] ) . "'"
);
mysql_close();
header( 'Location: /index.php' ); /* Защита от F5 */
}
else {
header( 'Location: /index.php' ); /* Защита от F5 */
}
}


/* HTML */
open_html( 'Решение задачи от twin' );

table_open( 'Регистрация', '', 'margin-top: 20px;' );
table_body( '
<tr>
<td align="center" style="background: #f2f6fa; border-bottom: #4a627d 1px solid; padding: 5px; font-size: 9pt;">
<p>
<form method="post" action="">
<input type="text" name="name" size="15" value="" />
</p>
<p>
<input type="submit" name="submit" value="Зарегистрироваться" />
</form>
</p>
</td>
</tr>
'
);
table_close();

table_open( 'Поиск', '', 'margin-top: 10px;' );
table_body( '
<tr>
<td align="center" style="background: #f2f6fa; border-bottom: #4a627d 1px solid; padding: 5px; font-size: 9pt;">
<p>
<form method="get" action="?">
<input type="text" name="search" size="15" value="" />
</p>
<p>
<input type="submit" name="s_submit" value="Поиск" />
</form>
</p>
</td>
</tr>
'
);
table_close();

$html_margin = "20px;";
sql_connect( $host, $user, $pass, $db );
$query1 = mysql_query( "SELECT * FROM `names` ORDER BY `date` DESC" );

/* Вывод даты регистрации юзера */
if( isset( $_GET['user'] ) ) {
$html_margin = "10px;";
$query2 = mysql_query( "SELECT `name`, `date` FROM `names` WHERE `id` = '" . mysql_real_escape_string( $_GET['user'] ) . "'" );
$result2 = mysql_fetch_assoc( $query2 );
table_open( 'Инфо о юзере', '', 'margin-top: 20px;' );
table_body( '
<tr>
<td align="center" style="background: #f2f6fa; border-bottom: #4a627d 1px solid; padding: 5px; font-size: 9pt;">
<strong>'
. htmlspecialchars( $result2['name'] ) . '</strong> был зарегистрирован <strong>' . htmlspecialchars( $result2['date'] ) . '</strong>
</td>
</tr>
'
);
table_close();
}

/* Поиск */
if( count( $_GET['search'] ) ) {
$html_margin = "10px;";
$query3 = mysql_query( "SELECT * FROM `names` WHERE `name` LIKE '%" . mysql_real_escape_string( $_GET['search'] ) . "%' ORDER BY `date` DESC" );

if( mysql_num_rows( $query3 ) != '0' ) {
table_open( 'Результаты поиска', '', 'margin-top: 20px;' );
table_body( '
<tr>
<td style="background: #f2f6fa; border-bottom: #4a627d 1px solid; padding: 5px; font-size: 9pt;">
<p style="padding-left: 20px;">Всего нашлось: <strong>'
. mysql_num_rows( $query3 ) . '</strong></p>
</td>
</tr>
'
);
while( $result3 = mysql_fetch_assoc( $query3 ) ) {
table_body( '
<tr>
<td style="background: #f2f6fa; border-bottom: #4a627d 1px solid; padding: 5px; font-size: 9pt;">
<p>'
. htmlspecialchars( $result3['name'] ) . '</p>
</td>
</tr>
'
);
}
table_close();
}
else {
table_open( 'Результаты поиска', '', 'margin-top: 20px;' );
table_body( '
<tr>
<td style="background: #f2f6fa; border-bottom: #4a627d 1px solid; padding: 5px; font-size: 9pt;">
Нет такого sad.gif
</td>
</tr>
'
);
table_close();
}
}


table_open( 'Список юзеров', '', 'margin-top: ' . $html_margin . ';' );
/* Вывод списка пользователей */
while( $result1 = mysql_fetch_assoc( $query1 ) ) {
table_body( '
<tr>
<td style="background: #f2f6fa; border-bottom: #4a627d 1px solid; padding: 5px; font-size: 9pt;">
<a style="text-decoration: none; border-bottom: #4a627d 1px dotted; color: #4a627d;" href="/index.php?page=users&user='
. htmlspecialchars( $result1['id'] ) . '">
'
. htmlspecialchars( $result1['name'] ) . '
</a>
</td>
</tr>
'
);
}
table_close();

close_html( 'by AlmazDeldiablo to <a style="text-decoration: none; border-bottom: #4a627d 1px dotted; color: #4a627d;" href="http://phpforum.ru">phpForum.ru</a>' );

?>


functions.php
<?php

if( !defined( 'KEY' ) ) {
header( 'HTTP/1.1 404 Not Found' );
exit( file_get_contents( '404.html' ) );
}

require_once 'mysql.php';

function sql_connect( $host, $user, $pass, $db ) {
$connect = mysql_connect( $host, $user, $pass ) or die( mysql_error() );
$select = mysql_select_db( $db ) or die( mysql_error() );
}


/*
==========================
Функции работы с HTML
==========================
*/

/* Открытие HTML */

function open_html( $page_title ) {

echo <<<HTML
<!DOCTUPE html>
<html>
<head>
<title>
$page_title</title>
<meta http-equiv="content-type" content="text/html; charset=cp1251" />
<link rel="stylesheet" type="text/css">
</link>
</head>
<body style="font-family: Arial; font-size: 7pt; margin: 0; margin-top: 20px;">

HTML;
}

/* Открытие таблицы */
function table_open( $title, $colspan1, $style ) {

echo <<<HTML
<table cellpadding="0" cellspacing="0" style="width: 350px; margin: auto; $style">
<tr>
<td colspan="
$colspan1" align="center" style="border-top: #4a627d 1px solid; border-bottom: #4a627d 1px solid; background: #aab9ca;">$title</td>
</tr>


HTML;

}

/* Тело таблицы */
function table_body( $content ) {

echo <<<HTML
$content
HTML;

}

/* Закрытие таблицы */
function table_close() {

echo <<<HTML
</table>
HTML;

}

/* Закрытие HTML */
function close_html( $copy ) {
echo <<<HTML
<span style="float: right; margin: 10px; color: #4a627d;">
$copy
</span>
HTML;
}

?>


mysql.php
<?php

if( !defined( 'KEY' ) ) {
header( 'HTTP/1.1 404 Not Found' );
exit( file_get_contents( '404.html' ) );
}

$host = "localhost";
$user = "root";
$pass = "";
$db = "add";

?>




Спустя 8 минут, 25 секунд (14.10.2010 - 20:31) aH6y написал(а):
как и написал у тя на сайте делай проверку на пустоту.

и поставь лок сервер. плюсы: скорость проверки - нажал ctrl + s и сразу можешь смотреть результат. и никто не взламает твою базу данных пока ты бушь закрывать дыры типо без емпти и других функций...

Спустя 1 минута, 18 секунд (14.10.2010 - 20:32) kirik написал(а):
В поиске sql-инъекция.

Спустя 5 минут, 57 секунд (14.10.2010 - 20:38) AlmazDelDiablo написал(а):
Обновил код. Вроде закрыл sql-инъекцию в поиске и сделал проверку на пустоту.

Спустя 1 минута, 19 секунд (14.10.2010 - 20:39) kirik написал(а):
Цитата
Warning: Cannot modify header information - headers already sent by (output started at /.../almazdeldiablo.ru/functions.php:47) in /.../almazdeldiablo.ru/index.php on line 36

если с пустым именем регистрироваться

Спустя 7 минут, 14 секунд (14.10.2010 - 20:46) aH6y написал(а):
он выводит текст:

Ошибка
Введите имя для регистрации

до доктайпа и до отправки header'a поэтому ошибку выдаёт.

совет: запиши весь текст ошибки с тегами в переменную и выводи эту переменную если она есть внутри тега body

Спустя 5 минут, 38 секунд (14.10.2010 - 20:52) AlmazDelDiablo написал(а):
Все, больше варнинг не выдает при пустом нике. Но ошибку перестал выдавать sad.gif

/* Если нажата кнопка, начинаем проверять данные */
if( isset( $_POST['submit'] ) ) {

/* Вывод ошибки, если поле не заполнено */
if( $_POST['name'] == '' ) {
header( 'Location: /index.php' ); /* Защита от F5 */
table_open( 'Ошибка', '', 'padding-bottom: 10px;' );
table_body( '
<tr>
<td style="background: #f2f6fa; border-bottom: #4a627d 1px solid; padding: 5px; font-size: 9pt;">
Введите имя для регистрации
</td>
</tr>
'
);
table_close();
$errors[] = 'Не введен ник';
}

/* Если нет ошибок, добавляем юзера */
if( !count( $errors ) ) {
sql_connect( $host, $user, $pass, $db );
mysql_query( "INSERT INTO `names`
SET
`name` = '"
. mysql_real_escape_string( $_POST['name'] ) . "'"
);
mysql_close();
header( 'Location: /index.php' ); /* Защита от F5 */
}
}

Спустя 4 минуты, 36 секунд (14.10.2010 - 20:57) aH6y написал(а):
правильнее писать:
if(empty($_POST['name']))

Спустя 43 минуты, 20 секунд (14.10.2010 - 21:40) twin написал(а):
Код плохо читается. И очень избыточен.
Для чего в логике теги, а потом их же в функцию?
По читабельности - ты если зендовский стандарт юзаешь, то юзай правильно. Не так надо:
	}
else {

а так
	}else{

Длинные строки... все под скролл залезло. Причем при этом не поскупился на 8 пробелов отступа. Табуляторы юзаешь...
Не айс.

По условиям - задача решена не полностью.
Данные в форму при поиске не возвращаются, скрипт зависим от магических кавычек. Поиск символов % и _ некорректен. Не регистрируется имя 0.

Пока плохо. Дальше нет смысла смотреть, исправляй.
И не торопись, никто не гонит. В решения подглядывать тоже не запещает. smile.gif

Спустя 22 минуты, 58 секунд (14.10.2010 - 22:03) AlmazDelDiablo написал(а):
Как будет время - перепишу. Без красивого ХТМЛа и прочего. Просто страницу. с данными ^^

Кстати, а что такое зендовский стандарт?)

Спустя 4 минуты, 49 секунд (14.10.2010 - 22:08) aH6y написал(а):
AlmazDelDiablo
zend framework + google = ответ


_____________
Блог | VK | GitHub | Twitch
Быстрый ответ:

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