[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Решение задачи на обработку данных
KOPOJI
тогда я тут тоже накатал маленько, может и мне чего интересного скажут..

условия задачи тут

<?php ob_start();
header('Content-type: text/html; charset=utf-8'); // charset
//defined constants for MySQL

define('DBHOST','dbhost');
define('DBNAME','dbname');
define('DBUSER','dbuser');
define('DBPASS','dbpass');
try {
$db = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME,DBUSER,DBPASS);
}
catch(PDOException $e) {
echo $e->getMessage(); //of course, this is temporary
}
// registration
if(isset($_POST['register'])) {
$name = strip_tags(trim($_POST['name']));
if(empty($name)) echo 'Вы не ввели имя!';
else { //isn't empty
if(!isset($name[3]) || isset($name[15])) echo 'Имя должно содержать от 4 до 15 символов';
else { //all ok, length is needly
//if magic quotes are enabled

if(get_magic_quotes_gpc()) $name = stripslashes ($name);
$res = $db->prepare("SELECT count(`id`) FROM `table` WHERE `name`=:name");
$res->execute(array('name'=>$name));
$data = $res->fetch(PDO::FETCH_NUM);
if(!empty($data[0])) echo 'Такой пользователь уже зарегистрирован!';
else { // $this man isn't register yet, try to fix it :D
$name = $db->quote($name);
$ins = $db->exec("INSERT INTO `table`(`name`) VALUES($name)");
if(!empty($ins)) {
echo 'Вы успешно зарегистрированы';
}
else {
echo 'Произошла ошибка при регистрации. Пожалуйста, попробуйте еще раз';
}
}
}
}
}


// show peoples in out database
if(isset($_GET['show']) && $_GET['show'] == 'all' && !isset($_GET['id'])) {
$res = $db->query("SELECT * FROM `table` ORDER BY `id` DESC");
if($res) {
echo '<table>';
while($row = $res->fetch(PDO::FETCH_OBJ)) { //print
echo '<tr><td>ID: '.$row->id.'</td><td>Name: '.htmlspecialchars($row->name,ENT_QUOTES,'UTF-8').'</td></tr>';
}
echo '</table>';
}
else {
echo 'В настоящий момент сервер не доступен. Приносим извинения за причиненные неудоства';
}
}


// search user
if(isset($_GET['search'])) {
if(isset($_GET['text'])) {
$text = strip_tags(trim($_GET['text']));
if(empty($text)) echo ('Вы не ввели имя для поиска!');
else {
if(get_magic_quotes_gpc()) $text = stripslashes($text);
$res = $db->prepare("SELECT `id`,`date`,`name` FROM `table` WHERE `name` LIKE '%$text%' ORDER BY `id` DESC");
$res->execute(array('text'=>$text));
if(count($res)) {
echo '<table>';
$row = $res->fetchAll();
$count = count($row);
if(!empty($count)){ //print
foreach($row as $k=>$v) {
echo '<a href="?show=all&id='.$v['id'].'">'.htmlspecialchars($v['name'],ENT_QUOTES,'UTF-8').'</a><br />';
}
}

else {
echo 'По вашему запросу никого не найдено<br>';
}
}
}
}
}


//show date of register
if(isset($_GET['show'],$_GET['id'])) {
$id = (int)stripslashes(strip_tags(trim($_GET['id'])));
if($id > 0) {
$res = $db->prepare("SELECT `name`,`date` FROM `table` WHERE `id`='$id'");
$res->execute(array('id'=>$id));
if($res) {
$row = $res->fetch(PDO::FETCH_OBJ);
echo 'Дата регистрации пользователя <b>',htmlspecialchars($row->name,ENT_QUOTES,'UTF-8'),'</b>: ',htmlspecialchars($row->date,ENT_QUOTES,'UTF-8'),'<br>';
}
}

else {
// and what is else???
}
}

?>
<!-- Register -->
<
form method="post">
Your name: <br />
<
input type="text" name="name" required="required" /><br />
<
input type="submit" name="register" value="Регистрация" />
</
form>
<
br />
<!--
Show people -->
<
a href="?show=all"></a><br />
<!--
form search -->
<
form method="GET">
Name for search: <br />
<
input type="text" name="text" value="<?php echo (isset($_GET['text'])
? htmlspecialchars(
$_GET['text'],ENT_QUOTES,'UTF-8') : '' );?>" /><br />
<
input type="submit" name="search" value="Search" />
</
form><br />


P.S. скрипт не проверял)



Спустя 20 минут, 30 секунд (26.08.2012 - 21:01) Игорь_Vasinsky написал(а):
Цитата
$id = (int)stripslashes(strip_tags(trim($_GET['id'])));

WTF??? думаешь сам (int) - не справиться?

Не каширно как то без конкатенации
Цитата
$res = $db->prepare("SELECT `id`,`date`,`name` FROM `table` WHERE `name` LIKE '%$text%' ORDER BY `id` DESC");
        $res->execute(array('text'=>$text));


Здесь по моему ты ноис получишь при отсутствии $_GET['show']

Цитата
isset($_GET['show']) && $_GET['show'] == 'all'


т.е какбы - isset($_GET['show']) - нормально, а вот следующее упоминание, кажись нотис

там помоему < и > пропускать надо
Цитата
$text = strip_tags(trim($_GET['text']));

Спустя 7 минут, 53 секунды (26.08.2012 - 21:09) KOPOJI написал(а):
Цитата
WTF??? думаешь сам (int) - не справиться?
согласен, протупил))
Цитата
т.е какбы - isset($_GET['show']) - нормально, а вот следующее упоминание, кажись нотис
нет, нормально все будет (как раз из за наличия проверки isset-ом перед этим (если isset убрать, то да, нотайс вылезет об индексе)
Цитата
там помоему < и > пропускать надо
я почему то наоборот считал. невнимательность
Цитата
Не каширно как то без конкатенации
это вопрос привычки. я так привык просто

тем более говорю, не проверял - писал с коленки)

Спустя 8 минут, 36 секунд (26.08.2012 - 21:17) Игорь_Vasinsky написал(а):
ох... я не как не могу определиться PDO или mysqli ... начал как то переходить на mysqli, но не привык biggrin.gif так с mysql и работаю.

Спустя 8 минут, 39 секунд (26.08.2012 - 21:26) KOPOJI написал(а):
Цитата
ох... я не как не могу определиться PDO или mysqli ... начал как то переходить на mysqli, но не привык  так с mysql и работаю.

я сам не так уж давно перешел на PDO smile.gif
mysql - уже устарела, ее не советуют использовать.. а то в один прекрасный (a для некоторых просто ужасный) день она вдруг станет deprecated и все biggrin.gif
а в выборе между mysqli или PDO я выбрал PDO (использовал и то, и другое) по двум причинам:
1. Поддержка 12 различных драйверов разных СУБД
2. Именованные параметры (при экранировании запросов)

Если говорить о скорости, то mysqli побыстрее будет конечно, но опять же, всякие вкусности вроде именованных параметров и легкой смены СУБД - хороший плюс smile.gif

А mysql - что mysql.. Слабо защищенная, транзакций нет, экранирование только вручную всякими там mysql_real_escape_string().. Грустно даже, сколько на ней было написано)

Спустя 16 часов, 45 минут, 38 секунд (27.08.2012 - 14:11) twin написал(а):
Зря на коленке. Если решаешь задачу, должен её решать. А не показывать, что ты знаком с PDO. Это уже все поняли.

Для чего была придумана эта задача. Не для того, что бы научиться делать регистрацию. Или показать приемущества PDO или mysqli перед классикой. А для того, чтобы разобраться в принципах хранения, обработки и корректного отображения данных. В этом решении ничего из условий задачи не выполнено толком.

Я вот думаю, оно конечно хорошо - транзакции, защищенность, экранировать не надо. Однако как всегда - хотелось как лучше, получилось как всегда. Похвально, когда человек знает что такое плэйсхолдеры и знает как их применять. Но когда на фоне этого такие элементарные ляпы для первоклашек (читай ниже), начинают терзать смутные сомнения - а хорошо ли это, автоматизация процессов))) Вы же перестаете думать в надежде, что PDO волшебным образом решит все проблемы.

Обработка данных не заканчивается экранированием. Вручную или подготовленными запросами - разницы нет. Особенно если не можешь понять того, что требует задача. А она требует в первую очередь:
Цитата
1. В имени могут присутствовать абсолютно любые символы, включая пробел. Исключением является только пробел в чистом виде, без других символов.
2. Имя должно выводиться в браузер без искажений.

Теперь пробуем зрегистрировать такое имя:
<twin>
Еще пробуем найти такое:
%%%%
или такое:
____

Кроме того, ни где ни полслова не было про ограничение количества символов. Ну даже пусть так, но ведь вроде как реализовано ограничение на символы. А теперь регаем имя
фиг
из трех пальцев символов. И что, сработало? Читай имя)))

Кстати, если убрать его, опять не выполняются условия - не проходит 0(ноль).

Как будет это все отображаться - история умалчивает, ибо отображения нет вообще.

И еще, стиль ужасен. Если хочешь писать "рациональным" стилем, то пиши им. Если BCD - его придерживайся. Но эта гремучая смесь никуда не годится.

Спустя 5 минут, 39 секунд (27.08.2012 - 14:17) Игорь_Vasinsky написал(а):
на лопатки.

Спустя 17 минут, 25 секунд (27.08.2012 - 14:35) KOPOJI написал(а):
Цитата
А не показывать, что ты знаком с PDO. Это уже все поняли.

я и не собирался это показывать. если вам не нравится - могу также сделать через mysql, дело не в этом.
по поводу остального - домой приду, перепишу нормально, на mysql smile.gif благодарю за внимание)

по поводу стиля - писал второпях, netbeans так расставил скобки)

Спустя 4 минуты, 31 секунда (27.08.2012 - 14:39) twin написал(а):
Мне нравится))) Мне не нравится, что люди принимают это за панацею и волшебную палочку. А потому не видят остальных элементарных вещей.

Я ни секунды не сомневаюсь, что ты сможешь решить задачу как нужно и на PDO и на msqli и на mysql. Но суть то не совсем в них))) Суть в том, что остальное тоже заслуживает внимания.


Спустя 10 минут, 20 секунд (27.08.2012 - 14:49) KOPOJI написал(а):
twin, я Вас понял smile.gif признаю вину, поторопился (а если честно - то больше поленился), с работы приду - если будет время, то перепишу и выложу.
P.S. я не принимаю это за волшебную палочку - я все равно очищаю.. просто опять же поленился особо экранировать.. а с % - эт да, не писал замену)

Спустя 22 минуты, 8 секунд (27.08.2012 - 15:12) twin написал(а):
Зачем же удалять? Пусть в назидание потомкам висит))) А то у нас есть горячие головы, которые считают, что узнав принципы подготовленных запросов они схатили Бога за бороду. smile.gif

Спустя 13 минут, 41 секунда (27.08.2012 - 15:25) KOPOJI написал(а):
хотя да, я уже тоже подумал) таким как я урок biggrin.gif

Цитата
на лопатки.
у меня уже походу появились доброжелатели.. чудесно)

Спустя 5 часов, 26 минут, 8 секунд (27.08.2012 - 20:51) KOPOJI написал(а):
<?php ob_start();
header('Content-type: text/html; charset=utf-8');
?>
<!DOCTYPE HTML>
<
html><head>
<
meta charset="utf-8" />
<
title>TITLE</title>
</
head>
<
body>
<?php
define('DB_HOST','localhost');
define('DB_NAME','test');
define('DB_USER','admin');
define('DB_PASS','12345');
$link = mysql_connect(DB_HOST,DB_USER,DB_PASS);
mysql_select_db(DB_NAME,$link);

// show date
if(isset($_GET['date'],$_GET['id'])) {
$id = (int) $_GET['id'];
if($id > 1) {
$res = mysql_query("SELECT `name`,`date` FROM `test` WHERE `id`='$id'");
if($res && mysql_num_rows($res)) {
$row = mysql_fetch_assoc($res);
echo '<br /><b>Дата регистрации пользователя
<span style="color: blue;">'
.htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8').'</span>:
'
.htmlspecialchars($row['date'],ENT_QUOTES,'UTF-8').'</b>';
}
else display_errors('Пользователь не найден');
}
else display_errors('Пользователь не найден');
}

// show list

//if(isset($_GET['show'])) {

$res = mysql_query("SELECT * FROM `test` ORDER BY `id` DESC");
if($res && mysql_num_rows($res)) {
while($row = mysql_fetch_assoc($res)) {
echo '<br />
<a href="?date=yes&id='
.htmlspecialchars($row['id'],ENT_QUOTES,'UTF-8').'">'.$htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8').'</a>';
}
}

//}

//register

if(isset($_POST['register'])) {
$name = htmlentities(trim($_POST['name']),ENT_QUOTES,'UTF-8');
if(!empty($name)) {
if(get_magic_quotes_gpc()) $name = stripslashes($name);
$res = mysql_query(sprintf("SELECT count(`id`) FROM `test` WHERE `name`='%s'",mysql_real_escape_string($name)),$link);
$data = mysql_fetch_array($res,MYSQL_NUM);
if(!empty($data[0])) die('<br />Вы уже зарегистрировались');
//insert
$query = sprintf("INSERT INTO `test`(`name`) VALUES('%s')",mysql_real_escape_string($name),$link);
$ins = mysql_query($query);
if($ins) echo '<br />Регистрация прошла успешно!';
else display_errors('Произошла ошибка при регистрации пользователя: '.mysql_error());
}
else display_errors('Введите имя!');
}

//search man
if(isset($_GET['search'])) {
$text = htmlentities(trim($_GET['text']),ENT_QUOTES,'UTF-8');
if(!empty($text)) {
if(get_magic_quotes_gpc()) $text = stripslashes($text);
$text = mysql_real_escape_string($text);
$text = str_replace('%','\%',$text);
$text = str_replace('_','\_',$text);
$text = str_replace('\\','\\\\',$text);
$res = mysql_query("SELECT * FROM `test` WHERE `name` LIKE '%".$text."%' ORDER BY `id` DESC ");

if($res && mysql_num_rows($res)) {
while($row = mysql_fetch_assoc($res)) {
echo '<br />Результат поиска:<br />
<a style="color: green;" href="?date=yes&id='
.htmlspecialchars($row['id'],ENT_QUOTES,'UTF-8').'">'.htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8').'</a>';
}
}

else display_errors('Такого пользователя не найдено');
}
else display_errors('Вы не ввели текст поиска!');
}

function display_errors($text) {
echo '<br /><b style="font-size: 14pt; color: red">Ошибка:<br />'.$text.'</b><br />';
}
?>
<br /><br /><br />
<!--
registration -->
<
form method="post">
<
br />Ваше имя: <input type="text" name="name" />
<
br /><input type="submit" name="register" value="Регистрация" />
</
form>
<!--
show list -->
<
br /><a href="?show">Список</a>
<!--
form search -->
<
form method="GET">
<
br />Текст поиска: <input type="text" name="text" value="<?=(isset($_GET['text']) ? htmlspecialchars($_GET['text'],ENT_QUOTES,'UTF-8') : '');?>" />
<
br /><input type="submit" name="search" value="Найти" />
</
form>
</
body>
</
html>

вроде все там..

Спустя 9 часов, 39 минут, 6 секунд (28.08.2012 - 06:30) KOPOJI написал(а):
P.S. я там еще не указал кодировку соединения.
mysql_set_charset('utf8');
после mysql_connect или mysql_select_db..

Спустя 19 минут, 33 секунды (28.08.2012 - 06:50) Игорь_Vasinsky написал(а):
		if(get_magic_quotes_gpc()) $text = stripslashes($text);
$text = mysql_real_escape_string($text);
$text = str_replace('%','\%',$text);
$text = str_replace('_','\_',$text);
$text = str_replace('\\','\\\\',$text);


?

для чё?

если кавычки включены - ты получешь экранированую переменную.

потом убираешь слеши
$text = stripslashes($text);


и всё.

потом спокойно
$text = mysql_real_escape_string($text);


Это не к селу ни к городу
Цитата
  $text = str_replace('%','\%',$text);
  $text = str_replace('_','\_',$text);
  $text = str_replace('\\','\\\\',$text);[/php]



Оригинально
Цитата
  $res = mysql_query(sprintf("SELECT count(`id`) FROM `test` WHERE `name`='%s'",mysql_real_escape_string($name)),$link);
  $data = mysql_fetch_array($res,MYSQL_NUM);
  if(!empty($data[0])) die('<br />Вы уже зарегистрировались');


а тык бы mysql_query + mysql_num_rows

Спустя 3 минуты, 58 секунд (28.08.2012 - 06:54) KOPOJI написал(а):
Цитата
Это не к селу ни к городу
да ну? а что будет если в запрос по LIKE подставить к примеру три %%%? он найдет запись с % или может все записи?
mysql_real_escape_string() Не экранирует символы % и _

Спустя 1 минута, 44 секунды (28.08.2012 - 06:56) KOPOJI написал(а):
Цитата
Оригинально
вполне нормально. лучше чем редирект

Спустя 3 минуты, 48 секунд (28.08.2012 - 06:59) Игорь_Vasinsky написал(а):
mysql_real_escape_string - должна за экранировать все спец символы

Цитата
вполне нормально. лучше чем редирект

я не про это


Чтобы узнать есть ли пользователь в БД ты делаешь

		$res = mysql_query(sprintf("SELECT count(`id`) FROM `test` WHERE `name`='%s'",mysql_real_escape_string($name)),$link);
$data = mysql_fetch_array($res,MYSQL_NUM);
if(!empty($data[0])) die('<br />Вы уже зарегистрировались');


а если так?

$query = mysql_query($sql);

if(mysql_num_rows($query))
echo 'Пользователь найден';



я не навязываю, но по моему так элегантней



Спустя 2 минуты, 28 секунд (28.08.2012 - 07:02) KOPOJI написал(а):
элегантнее но быстрее ли? wink.gif если будет к примеру пару сотен тысяч записей smile.gif

Спустя 2 минуты, 42 секунды (28.08.2012 - 07:05) KOPOJI написал(а):
mysql_real_escape_string()
Примечания:
....
Цитата
Замечание: mysql_real_escape_string() не экранирует символы % и _. Эти знаки являются масками групп символов в операторах MySQL LIKE, GRANT и REVOKE.

Спустя 2 минуты, 3 секунды (28.08.2012 - 07:07) Игорь_Vasinsky написал(а):
1. может может. не мерял

2. даж не вкурсе был

Спустя 23 минуты, 45 секунд (28.08.2012 - 07:30) Игорь_Vasinsky написал(а):
т.е. если у меня форма поиска - кто нить введёт %слово% - или %слов__% - то буду найдены не точные совпадения?

Спустя 50 минут, 22 секунды (28.08.2012 - 08:21) KOPOJI написал(а):
если не заэкранировать процент и ввести в поиск знак процента - выведет все записи smile.gif так же если ввести id = 0 - выведутся все записи smile.gif

Спустя 4 минуты, 53 секунды (28.08.2012 - 08:26) Игорь_Vasinsky написал(а):
ну эт понятно.
чёт я не слышал за это не от кого)

Спустя 2 минуты, 37 секунд (28.08.2012 - 08:28) KOPOJI написал(а):
по поводу процента - это только при поиске по LIKE, потому что там он используется. а id всегда smile.gif теперь услышал wink.gif

Спустя 3 минуты, 33 секунды (28.08.2012 - 08:32) KOPOJI написал(а):
кстати, twin.. По поводу ограничения числа символов - да, я не прав) вернее наполовину. это из за кодировки UTF-8, ты же знаешь (что там каждая русская буква в два байта вместо одного - а пых проверяет по байту а не символу)

Спустя 9 минут, 41 секунда (28.08.2012 - 08:42) killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 09:28)
по поводу процента - это только при поиске по LIKE, потому что там он используется. а id всегдатеперь услышал

даа user posted image
сколько записей выведет такой запрос?
SELECT * FROM `table` WHERE `id` = 0
Цитата (KOPOJI @ 28.08.2012 - 08:02)
элегантнее но быстрее ли?если будет к примеру пару сотен тысяч записей

при поиске юзера в таблице, количество рядов в результате, будет либо 0, либо 1. Разница в быстродействии mysql_num_rows(), и SQL COUNT() практически равна нулю.



Спустя 43 секунды killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 09:32)
а пых проверяет по байту а не символу)

открой для себя mb_strlen() wink.gif

Спустя 6 минут, 15 секунд (28.08.2012 - 08:48) KOPOJI написал(а):
Цитата
при поиске юзера в таблице
а кто сказал что у меня будет один юзер с таким именем? В таблице где я проверял у меня десятка три юзеров с именем name (со старых тестов).
Цитата
открой для себя mb_strlen() 
давно уже открыл mb-функции. Просто isset() быстрее работает, вот и не подумал.
По поводу id - сам не знаю с чего я так решил. Вроде кто то когда то сказал, а я не проверял, просто запомнив.. Виноват, каюсь smile.gif

Спустя 4 минуты, 3 секунды (28.08.2012 - 08:52) killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 09:48)
а кто сказал что у меня будет один юзер с таким именем?

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

Спустя 4 минуты, 38 секунд (28.08.2012 - 08:56) KOPOJI написал(а):
Цитата
юзера ищут не по имени, а по логину, а в пределах сайта логин обязан быть уникальным, если у тебя по другому, то исправляй ошибки.

у меня на сайтах не по другому. здесь, в тестовой таблице - по другому. зачем мне это исправлять? так интереснее smile.gif
P.S. name - это имя, логин это все таки login как бы.. А имя вполне может быть одинаковым (в общем, при регистрации в несколько полей)

Спустя 9 минут, 56 секунд (28.08.2012 - 09:06) killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 09:56)
P.S. name - это имя, логин это все таки login как бы..

Я вообще не пойму о чем мы спорим? У тебя что, пользователи авторизуются по имени? blink.gif

Спустя 38 секунд (28.08.2012 - 09:07) KOPOJI написал(а):
кстати в задании не говорится о том, что имя должно быть уникальным. Говорится только о защите от обновления страницы при регистрации. Это просто я так сделал

Спустя 51 секунда (28.08.2012 - 09:08) KOPOJI написал(а):
нет biggrin.gif я вообще не пойму ЧТО мы спорим вообще biggrin.gif давай дождемся twin-а, что он скажет wink.gif

Спустя 4 минуты, 55 секунд (28.08.2012 - 09:13) killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 10:07)
кстати в задании не говорится о том, что имя должно быть уникальным.

А это разве не очевидно? biggrin.gif
Обрати внимание
Цитата
4. Иметь поисковик, который должен осуществлять поиск по полю с именами и выводить все имеющиеся совпадения (по части слова).

Как ты вообще представляешь себе систему, в которой может быть несколько профилей с одним логином? biggrin.gif

Спустя 5 минут, 41 секунда (28.08.2012 - 09:19) KOPOJI написал(а):
Цитата
Как ты вообще представляешь себе систему, в которой может быть несколько профилей с одним логином?

кривой представляю biggrin.gif но все таки представляю)))
и эта цитата, опять же, не говорит о наличии уникальности в имени.
Опять же, обрати внимание
Цитата
осуществлять поиск по полю с именами
а не с логином wink.gif что если имеется в виду затем чуть расширить задание - в регистрации два поля, имя и логин, а поиск нужно делать именно по имени?

Спустя 5 минут, 38 секунд (28.08.2012 - 09:24) killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 10:19)
Опять же, обрати внимание Цитата
осуществлять поиск по полю с именами

а не с логиномчто если имеется в виду затем чуть расширить задание - в регистрации два поля, имя и логин, а поиск нужно делать именно по имени?

В той задаче "имя" - это имя под которым юзер авторизуется в системе, это и есть логин, а не то как тебя родители в детстве назвали biggrin.gif Мне бы и в голову не пришло, что такое нужно разжевывать, видимо Николаю то же biggrin.gif

Спустя 5 минут, 48 секунд (28.08.2012 - 09:30) KOPOJI написал(а):
Ну я так и сделал в принципе.. В контексте данной задачи - все равно верно выполнено, просто получается пару строчек лишние.
Это все из за моей тестовой таблицы smile.gif то что у меня там есть и логин, и имя - записывал в имя (на уровне подсознания наверное так решил что имя это все таки трактуется как имя а не логин biggrin.gif)

Спустя 1 час, 23 минуты, 28 секунд (28.08.2012 - 10:53) twin написал(а):
Уникальность - совершенно не обязательный параметр. Этот скрипт к регистрации вообще никакого отношения не имеет, просто хотелось как то более по человечески написать задание. К тому же идея это не моя, я её нагло спер с софттайма и немного подретушировал.

KOPOJI
Все-таки торопишься. И надеешься на авось или еще на что-то... Ну что вот это такое:
Цитата
<a href="?date=yes&id='.htmlspecialchars($row['id'],ENT_QUOTES,'UTF-8').'">'.$htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8').'</a>';
Явно не проверял скрипт.

Дальше. Зачем стал писать на mysql, если не можешь без плэйсхолдеров. Ведь вот это не просто глупо и избыточно смотрится, это еще и изрядно тормозит.

$res = mysql_query(sprintf("SELECT count(`id`) FROM `names` WHERE `name`='%s'",mysql_real_escape_string($name)),$link);


Дальше.
		$query = sprintf("INSERT INTO `names`(`name`) VALUES('%s')",mysql_real_escape_string($name),$link);
$ins = mysql_query($query);
if($ins) echo '<br />Регистрация прошла успешно!';
Это с чего такой вывод? Однозначно можно заявить только то, что запрос успешно прошел. Но ведь запросто может возникнуть ситуация, что мускул не вернул ошибку, а строка добавлена не будет. Для этих целей есть mysql_affected_rows(), коль скоро ты решил отказаться от прогресса)))

Дальше.
	$name = htmlentities(trim($_POST['name']),ENT_QUOTES,'UTF-8');
Айяйяйяйяйяйяяяя-яяй. Вот и результат. Регистрируем имя
<twin>
и жмем ссылку "список". Комментировать даже не стану. Тоже самое произойдет и с апострофом. Ведь были имена для проверки. Допустим
O'Railly

Дальше. Регистрируем обратный слэшик.
\
и пытаемся найти его через поиск. Находит, да. Но смотрим в форму и что там?

В общем как я и говорил - расхолаживают эти изыски типа PDO и прочих приблуд. Для того и придумана задача, что бы не надеялись на чудеса прогресса. Прогресс это хорошо, но нет разницы откуда ударит током. Из "евророзетки" или из старосоветской, если лезть в неё голыми руками.

По стилю, обрати внимание на длинные строки. Вот так куда симпатичнее и чище:
            while($row = mysql_fetch_assoc($res)) {
echo '<br />Результат поиска:<br />'
. '<a style="color: green;" href="?date=yes&id='
. htmlspecialchars($row['id'],ENT_QUOTES,'UTF-8').'">'
. htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8').'</a>';
}

Спустя 4 минуты, 52 секунды (28.08.2012 - 10:58) twin написал(а):
Цитата (KOPOJI @ 28.08.2012 - 06:32)
кстати, twin.. По поводу ограничения числа символов - да, я не прав) вернее наполовину. это из за кодировки UTF-8, ты же знаешь (что там каждая русская буква в два байта вместо одного - а пых проверяет по байту а не символу)

Ну дык а я про что.

Спустя 1 час, 19 минут, 25 секунд (28.08.2012 - 12:18) Игорь_Vasinsky написал(а):
о как..

Спустя 19 минут, 9 секунд (28.08.2012 - 12:37) killer8080 написал(а):
Цитата (twin @ 28.08.2012 - 11:53)
Уникальность - совершенно не обязательный параметр. Этот скрипт к регистрации вообще никакого отношения не имеет, просто хотелось как то более по человечески написать задание.


И как сие стыкуется с blink.gif
Цитата
Задача.
Написать скрипт регистрации. Он должен:

Спустя 5 минут, 39 секунд (28.08.2012 - 12:42) twin написал(а):
Нормально стыкуется. Где там хоть полслова про аутентификацию? Регистрация вовсе не подразумевает уникальность. Тем более там нигде нет слова "логин". Регистрировать можно и одинаковые имена. К примеру для подсчета количества посетивших сайт Николаев. smile.gif

Зарегистрировалось 5 Николаев, или один пять раз - не важно. Да и не в этом вовсе суть, а в правильной работе с данными.

Спустя 13 минут, 13 секунд (28.08.2012 - 12:56) killer8080 написал(а):
Цитата (twin @ 28.08.2012 - 13:42)
Нормально стыкуется. Где там хоть полслова про аутентификацию? Регистрация вовсе не подразумевает уникальность. Тем более там нигде нет слова "логин". Регистрировать можно и одинаковые имена. К примеру для подсчета количества посетивших сайт Николаев.


Понятно, сбил столку словом "регистрация", никакого отношения к регистрации значит задача не имеет. smile.gif

Спустя 4 минуты, 52 секунды (28.08.2012 - 13:01) twin написал(а):
Ну если дотошно, то не имеет к аутентификации. Просто привыкли эти два понятия отождествлять.

Спустя 55 минут, 6 секунд (28.08.2012 - 13:56) KOPOJI написал(а):
twin, я проверял, только от XSS уже здесь прописывал, сразу забыл sad.gif торопился, да.. спать хотелось..
Цитата
Это с чего такой вывод?
об этом не подумал..
Цитата
По стилю
согласен smile.gif

Спустя 29 минут, 46 секунд (28.08.2012 - 14:25) KOPOJI написал(а):
<?php ob_start();
header('Content-type: text/html; charset=utf-8');
?>
<!DOCTYPE HTML>
<
html><head>
<
meta charset="utf-8" />
<
title>TITLE</title>
</
head>
<
body>
<?php
define('DB_HOST','localhost');
define('DB_NAME','test');
define('DB_USER','admin');
define('DB_PASS','12345');
$link = mysql_connect(DB_HOST,DB_USER,DB_PASS);
mysql_select_db(DB_NAME,$link);
mysql_set_charset('utf8');

// show date
if(isset($_GET['date'],$_GET['id'])) {
$id = (int) $_GET['id'];
if($id > 1) {
$res = mysql_query("SELECT `name`,`date` FROM `test` WHERE `id`='$id'",$link);
if($res && mysql_num_rows($res)) {
$row = mysql_fetch_assoc($res);
echo '<br /><b>Дата регистрации пользователя
<span style="color: blue;">'

.htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8').'</span>: '
.htmlspecialchars($row['date'],ENT_QUOTES,'UTF-8').'</b>';
}
else display_errors('Пользователь не найден');
}
else display_errors('Пользователь не найден');
}

// show list

//if(isset($_GET['show'])) {

$res = mysql_query("SELECT * FROM `test` ORDER BY `id` DESC",$link);
if($res && mysql_num_rows($res)) {
while($row = mysql_fetch_assoc($res)) {
echo '<br /><a href="?date=yes&id='
.htmlspecialchars($row['id'],ENT_QUOTES,'UTF-8').'">'
.htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8').'</a>';
}
}

//}

//register

if(isset($_POST['register'])) {
$name = trim($_POST['name']);
if(!empty($name)) {
if(get_magic_quotes_gpc()) $name = stripslashes($name);
$res = mysql_query("SELECT count(`id`) FROM `test` WHERE `name`='".mysql_real_escape_string($name)."'",$link);
$data = mysql_fetch_array($res,MYSQL_NUM);
if(!empty($data[0])) die('<br />Вы уже зарегистрировались');
//insert
$query = sprintf("INSERT INTO `test`(`name`) VALUES('%s')",mysql_real_escape_string($name),$link);
$ins = mysql_query($query);
if($ins && mysql_affected_rows()) echo '<br />Регистрация прошла успешно!';
else display_errors('Произошла ошибка при регистрации пользователя: '.mysql_error());
}
else display_errors('Введите имя!');
}

//search man
if(isset($_GET['search'])) {
$text = trim($_GET['text']);
if(!empty($text)) {
if(get_magic_quotes_gpc()) $text = stripslashes($text);
$text = str_replace('\\','\\\\',$text);
$text = str_replace('%','\%',$text);
$text = str_replace('_','\_',$text);
$text = mysql_real_escape_string($text);
$res = mysql_query("SELECT * FROM `test` WHERE `name` LIKE '%".$text."%' ORDER BY `id` DESC ");

if($res && mysql_num_rows($res)) {
echo '<br />Результат поиска:<br />';
while($row = mysql_fetch_assoc($res)) {
echo '<a style="color: green;" href="?date=yes&id='
.htmlspecialchars($row['id'],ENT_QUOTES,'UTF-8').'">'
.htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8').'</a><br />';
}
}

else display_errors('Такого пользователя не найдено');
}
else display_errors('Вы не ввели текст поиска!');
}

function display_errors($text) {
echo '<br /><b style="font-size: 14pt; color: red">Ошибка:<br />'.$text.'</b><br />';
}
?>
<br /><br /><br />
<!--
registration -->
<
form method="post">
<
br />Ваше имя: <input type="text" name="name" />
<
br /><input type="submit" name="register" value="Регистрация" />
</
form>
<!--
show list -->
<
br /><a href="?show">Список</a>
<!--
form search -->
<
form method="GET">
<
br />Текст поиска: <input type="text" name="text" value="<?=(isset($_GET['text']) ? htmlspecialchars($_GET['text'],ENT_QUOTES,'UTF-8') : '');?>" />
<
br /><input type="submit" name="search" value="Найти" />
</
form>
</
body>
</
html>

подправил. по поводу mysql_real_escape_string() - а что вы предлагаете взамен? это функция самой библиотеки.. почему то всегда считал что ее нужно юзать.. если заменить на addslashes - так ее можно обойти на другой кодировке.. а вручную заменять еще и это.. не знаю :rolleyes:

Спустя 2 минуты, 25 секунд (28.08.2012 - 14:28) KOPOJI написал(а):
а по поводу слэша - не знаю, проверял и так, и эдак - все нормально..

Спустя 25 минут, 19 секунд (28.08.2012 - 14:53) twin написал(а):
Ну вот, другое дело. Уже почти чисто.

Правда я так и не понял, в чем профит ткой записи
		$query = sprintf("INSERT INTO `names`(`name`) VALUES('%s')",mysql_real_escape_string($name),$link);
$ins = mysql_query($query);
перед такой
		$ins = mysql_query("INSERT INTO `names`(`name`) VALUES('". mysql_real_escape_string($name) ."')", $link); 

Цитата
по поводу mysql_real_escape_string() - а что вы предлагаете взамен?
ничего я не предлагал... Все тут сделано верно.
Цитата
а по поводу слэша - не знаю, проверял и так, и эдак - все нормально..
А если на сервере включить магические кавычки?

Ну и по мелочам.
if($res && mysql_num_rows($res)) 
не совсем красиво без приведения типов. Семмантика.

$res = mysql_query("SELECT count(`id`)... 
лучше юзать COUNT(*)
А по большому счету рациональнее COUNT(*) AS `cnt` и mysql_result(), но не столь тут важно.

if($ins && mysql_affected_rows())
тут первая проверка лишняя. просто нужно правильно применять mysql_affected_rows()

		$text = str_replace('\\','\\\\',$text);
$text = str_replace('%','\%',$text);
$text = str_replace('_','\_',$text);
сюда просятся массивы. Или еще проще addcslashes.
$text = addcslashes($text, '\%_');


А вообще огромный респект за терпение. Многие бросают сразу, мол чего привязался, я и сам с усам))). Надеюсь пошло на пользу.

Спустя 13 минут, 23 секунды (28.08.2012 - 15:07) KOPOJI написал(а):
Цитата
А если на сервере включить магические кавычки?

так очищаю же вроде везде
if(get_magic_quotes_gpc()) $text = stripslashes($text);

Благодарю за респект, вам тоже огромный респект (причем за тоже самое) :D

насчет addslashes: addslashes() vs mysql_real_escape_string()
я согласен что при UTF-8 ничего не получится, но все же :)

Цитата
лучше юзать COUNT(*)
а чем? это просто привычка с неиспользования выбора всех полей если не надо..
Цитата
А по большому счету рациональнее COUNT(*) AS `cnt`

просто тогда не числовые индексы вернет.. по идее с числовыми побыстрее будет работать. возможно, я ошибаюсь

Спустя 42 минуты, 14 секунд (28.08.2012 - 15:49) killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 15:25)
  .htmlspecialchars($row['id'],ENT_QUOTES,'UTF-8').'">'

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

Спустя 1 минута, 40 секунд (28.08.2012 - 15:50) twin написал(а):
Цитата
так очищаю же вроде везде
А тут?
Текст поиска: <input type="text" name="text" value="<?=(isset($_GET['text']) ? htmlspecialchars($_GET['text'],ENT_QUOTES,'UTF-8') : '');?>" />
Вот поэтому и лучше сразу на входе очистить суперглобальные массивы и не париться.
Цитата
просто тогда не числовые индексы вернет.. по идее с числовыми побыстрее будет работать. возможно, я ошибаюсь
вернет количество строк. Вообще COUNT(*) совсем не означет, что запрос недетерменирован. Как раз наоборот - подразумевается только подсчет строк, без привязок к полю. Поэтому такая фишка работает быстрее.
Быстрый ответ:

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