Чужие работы не смотрел

Вот код:
Свернутый текст
<?php
//----------------------------------------
//---------- Omega Registration ----------
//----------------------------------------
define("HOST", "localhost");
define("NAME", "root");
define("PASS", "");
define("DB", "names");
$db = mysql_connect(HOST, NAME, PASS) or die(mysql_error());
mysql_select_db(DB, $db) or die(mysql_error());
mysql_query("SET NAMES utf8") or die(mysql_error());
mysql_query("SET CHARACTER_SET_CLIENT = 'utf8'") or die(mysql_error());
mysql_query("SET CHARACTER_SET_RESULTS = 'utf8'") or die(mysql_error());
mysql_query("SET COLLATION_CONNECTION = 'utf8_general_ci'") or die(mysql_error());
//--------------------------- Инициализируем переменные ------------------------------
$id = !empty($_GET['id']) ? $_GET['id'] : NULL;
$search_name = !empty($_GET['search_name']) ? $_GET['search_name'] : NULL;
$user_name = !empty($_POST['user_name']) ? $_POST['user_name'] : NULL;
$Go = isset($_POST['Go']) ? TRUE : FALSE; // Кнопка регистрации
$Search = isset($_GET['Search']) ? TRUE : FALSE; // И поиска
if (get_magic_quotes_gpc()) :
$user_name = stripslashes($user_name);
$search_name = stripslashes($search_name);
endif;
//------------------------------ Регистрация ----------------------------------------
if ($Go) : // Go нажата
switch ($user_name) : // Проверяем имя
case '' :
echo "<div style='color:#F00'>
Имя не введено. Введите имя.</div>";
break;
case ' ' :
echo "<div style='color:#F00'>
Имя-пробел недопустимо.</div>";
break;
default : // Имя подходит, заносим в таблицу
$sql = "INSERT INTO `names` (`name`) VALUES
('" .mysql_real_escape_string($user_name). "')";
mysql_query($sql) or die(mysql_error());
Header("Location: " .$_SERVER['PHP_SELF']); // F5
endswitch;
endif; // Go нажата
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Registration</title>
</head>
<?php
//--------------------------------- Поискать --------------------------------------
if ($Search) : // Search нажата
$sql = "SELECT `name` FROM `names` WHERE `name`
LIKE '%" .mysql_real_escape_string(addcslashes($search_name, '\%_')). "%'"; // Экранируем \ % и _
$result = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($result) > 0) : // Есть что-то
echo "Вот они, голубчики:";
while ($row = mysql_fetch_assoc($result)) :
echo "<p>" .htmlspecialchars($row['name']). "</p>";
endwhile;
echo "--------------------------------------------------------";
else :
echo "Ничего не нашли ;-(";
endif; // Есть что-то
endif; // Search нажата
//------------------------------ Вывод всех записей --------------------------------
$sql = "SELECT `id`, `name`, `date` FROM `names` ORDER BY `id` DESC";
$result = mysql_query($sql) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) :
print('<p> ' . '<a href="index.php?id=' .$row['id']. '">'
.htmlspecialchars($row['name']). '</a></p>');
endwhile;
//--------------------------- Выводим выбранную запись-------------------------------
if ($id) : // Запись выбрана
$sql = "SELECT * FROM `names` WHERE `id` = '" .intval($id). "'";
$result = mysql_query($sql) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) :
print('<p> Юзверь такой-то: ' .htmlspecialchars($row['name']).
'<br>' . 'Был заподозрен в регистрации: ' .$row['date']. '</p>');
endwhile;
endif; // Запись выбрана
//---------------------------------------------------------------------------------
?>
<body>
<table align="center">
<tr>
<td>
<form method="post" action="" style="text-align:justify">
<input name="user_name" type="text" />
<input name="Go" value="OK" type="submit" />
</form>
<br />
<form method="get" action="" style="text-align:justify">
<input name="search_name" type="text" value="<?php echo htmlspecialchars($search); ?>" />
<input name="Search" value="Поискать" type="submit" />
</form>
</td>
</tr>
</table>
</body>
</html>
Спустя 1 час, 52 минуты, 28 секунд (19.11.2009 - 21:58) twin написал(а):
Красивый код. Задача решена полностью, но есть критическая ошибка. И несколько пожеланий.
Ошибка : Некорректно обрабатывается символ % при поиске. Он так и попадает в запрос как "любой символ" и вытаскивает всех голубчиков.
Пожелания.
1. Кодировку соединения с бд нужно бы указать.
2. Напрасно выполняется операция addslashes() при выключенных магических кавычках. Лучше наоборот - stripslashes() при включенных. Это прозрачнее и экономичнее.
3. Переменные все таки нужно объявлять явно.
4. Дату MySQL умеет устанавливать сам. Есть для этого NOW(). Незачем гонять две функции на стороне php
5. Альтернативный синтаксис как то непривычен... Но это не недостаток. Так, к слову.
Вообще мне понравилось. Аккуратно, с чувством, толком, расстановкой. Чувствуется основательный подход.
Респект.
Ошибка : Некорректно обрабатывается символ % при поиске. Он так и попадает в запрос как "любой символ" и вытаскивает всех голубчиков.

Пожелания.
1. Кодировку соединения с бд нужно бы указать.
2. Напрасно выполняется операция addslashes() при выключенных магических кавычках. Лучше наоборот - stripslashes() при включенных. Это прозрачнее и экономичнее.
3. Переменные все таки нужно объявлять явно.
4. Дату MySQL умеет устанавливать сам. Есть для этого NOW(). Незачем гонять две функции на стороне php
5. Альтернативный синтаксис как то непривычен... Но это не недостаток. Так, к слову.
Вообще мне понравилось. Аккуратно, с чувством, толком, расстановкой. Чувствуется основательный подход.
Респект.

Спустя 2 часа, 49 минут, 58 секунд (20.11.2009 - 00:48) John_761 написал(а):
Надо мне было читать про % и _ с LIKE
Вот такой вариант работает, но не уверен на счет корректности

Вот такой вариант работает, но не уверен на счет корректности

$sql = "SELECT `name` FROM `names` WHERE `name`
LIKE '%" .mysql_real_escape_string(str_replace('%', '\%', $search)). "%'";
Спустя 8 часов, 11 минут, 42 секунды (20.11.2009 - 09:00) twin написал(а):
Вполне корректно.
Еще один нюанс - вывод у тебя идет выше доктайпа. Очень некрасиво это.
Еще один нюанс - вывод у тебя идет выше доктайпа. Очень некрасиво это.
Спустя 26 минут, 9 секунд (20.11.2009 - 09:26) sergeiss написал(а):
Небольшое примечание насчет "альтернативного" синтаксиса. Я им сам постоянно пользуюсь для больших блоков. Удобная штука 
По опыту - надо обязательно давать некие имена (с помощью комментов), иначе сложно что-то найти в коде.
У тебя сейчас вот так сделано:
Но если сделать примерно вот так,
то найти начало и конец блока будет намного проще. Как визуально, так и через поиск текста. И на любых ELSE внутри тоже имеет смысл поставить ту же надпись.

По опыту - надо обязательно давать некие имена (с помощью комментов), иначе сложно что-то найти в коде.
У тебя сейчас вот так сделано:
if (isset($_POST['Go'])) :
// тут много-много кода
endif; // Кнопку все таки нажали
Но если сделать примерно вот так,
if (isset($_POST['Go'])) : // GO PRESSED
// тут много-много кода
endif; // GO PRESSED - Кнопку все таки нажали
то найти начало и конец блока будет намного проще. Как визуально, так и через поиск текста. И на любых ELSE внутри тоже имеет смысл поставить ту же надпись.
Спустя 3 дня, 12 часов, 38 минут, 42 секунды (23.11.2009 - 22:05) John_761 написал(а):
Украду еще пару минут вашего времени
Внес изменения в 1й пост
1) Изменена кодировка на utf8
2) Установлена кодировка соединения с базой
3) При включенных magic_quotes используется stripslashes ( гениально! а я зачем-то их добавлял при включенных и обрезал везде далее
)
4) Явно инициализированы переменные
5) Дата в базу через запрос не заносится,а сама устанавливается функцией NOW() в поле date типа TIMESTAMP
6) Устранена ошибка с использованием шаблонов поиска % и _
7) DOCTYPE перенесен до вывода записей и результатов поиска
8) Добавлено немного комментариев

Внес изменения в 1й пост
1) Изменена кодировка на utf8
2) Установлена кодировка соединения с базой
3) При включенных magic_quotes используется stripslashes ( гениально! а я зачем-то их добавлял при включенных и обрезал везде далее

4) Явно инициализированы переменные
5) Дата в базу через запрос не заносится,а сама устанавливается функцией NOW() в поле date типа TIMESTAMP
6) Устранена ошибка с использованием шаблонов поиска % и _
7) DOCTYPE перенесен до вывода записей и результатов поиска
8) Добавлено немного комментариев

Спустя 33 минуты, 24 секунды (23.11.2009 - 22:38) glock18 написал(а):
1. если имя введено неверное, то вывод все равно начинается до того, как определен doctype 
2. имя "два пробела" разрешено. используй trim для того, чтобы удалить крайние пробелы из строки.
3. тип timestamp имеет одно замечательное свойство. если ему ничего не подавать при вставке/обновлении данных, то он принимает значение CURRENT_TIMESTAMP (синоним NOW). Это к тому, что можно NOW вовсе убрать
В целом, хорошо

2. имя "два пробела" разрешено. используй trim для того, чтобы удалить крайние пробелы из строки.
3. тип timestamp имеет одно замечательное свойство. если ему ничего не подавать при вставке/обновлении данных, то он принимает значение CURRENT_TIMESTAMP (синоним NOW). Это к тому, что можно NOW вовсе убрать

В целом, хорошо
