условия задачи тут
<?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, но не привык так с mysql и работаю.
Спустя 8 минут, 39 секунд (26.08.2012 - 21:26) KOPOJI написал(а):
Цитата |
ох... я не как не могу определиться PDO или mysqli ... начал как то переходить на mysqli, но не привык так с mysql и работаю. |
я сам не так уж давно перешел на PDO
mysql - уже устарела, ее не советуют использовать.. а то в один прекрасный (a для некоторых просто ужасный) день она вдруг станет deprecated и все
а в выборе между mysqli или PDO я выбрал PDO (использовал и то, и другое) по двум причинам:
1. Поддержка 12 различных драйверов разных СУБД
2. Именованные параметры (при экранировании запросов)
Если говорить о скорости, то mysqli побыстрее будет конечно, но опять же, всякие вкусности вроде именованных параметров и легкой смены СУБД - хороший плюс
А mysql - что mysql.. Слабо защищенная, транзакций нет, экранирование только вручную всякими там mysql_real_escape_string().. Грустно даже, сколько на ней было написано)
Спустя 16 часов, 45 минут, 38 секунд (27.08.2012 - 14:11) twin написал(а):
Зря на коленке. Если решаешь задачу, должен её решать. А не показывать, что ты знаком с PDO. Это уже все поняли.
Для чего была придумана эта задача. Не для того, что бы научиться делать регистрацию. Или показать приемущества PDO или mysqli перед классикой. А для того, чтобы разобраться в принципах хранения, обработки и корректного отображения данных. В этом решении ничего из условий задачи не выполнено толком.
Я вот думаю, оно конечно хорошо - транзакции, защищенность, экранировать не надо. Однако как всегда - хотелось как лучше, получилось как всегда. Похвально, когда человек знает что такое плэйсхолдеры и знает как их применять. Но когда на фоне этого такие элементарные ляпы для первоклашек (читай ниже), начинают терзать смутные сомнения - а хорошо ли это, автоматизация процессов))) Вы же перестаете думать в надежде, что 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 благодарю за внимание)
по поводу стиля - писал второпях, netbeans так расставил скобки)
Спустя 4 минуты, 31 секунда (27.08.2012 - 14:39) twin написал(а):
Мне нравится))) Мне не нравится, что люди принимают это за панацею и волшебную палочку. А потому не видят остальных элементарных вещей.
Я ни секунды не сомневаюсь, что ты сможешь решить задачу как нужно и на PDO и на msqli и на mysql. Но суть то не совсем в них))) Суть в том, что остальное тоже заслуживает внимания.
Я ни секунды не сомневаюсь, что ты сможешь решить задачу как нужно и на PDO и на msqli и на mysql. Но суть то не совсем в них))) Суть в том, что остальное тоже заслуживает внимания.
Спустя 10 минут, 20 секунд (27.08.2012 - 14:49) KOPOJI написал(а):
twin, я Вас понял признаю вину, поторопился (а если честно - то больше поленился), с работы приду - если будет время, то перепишу и выложу.
P.S. я не принимаю это за волшебную палочку - я все равно очищаю.. просто опять же поленился особо экранировать.. а с % - эт да, не писал замену)
P.S. я не принимаю это за волшебную палочку - я все равно очищаю.. просто опять же поленился особо экранировать.. а с % - эт да, не писал замену)
Спустя 22 минуты, 8 секунд (27.08.2012 - 15:12) twin написал(а):
Зачем же удалять? Пусть в назидание потомкам висит))) А то у нас есть горячие головы, которые считают, что узнав принципы подготовленных запросов они схатили Бога за бороду.
Спустя 13 минут, 41 секунда (27.08.2012 - 15:25) KOPOJI написал(а):
хотя да, я уже тоже подумал) таким как я урок
Цитата |
на лопатки. |
у меня уже походу появились доброжелатели.. чудесно)
Спустя 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() Не экранирует символы % и _
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 написал(а):
элегантнее но быстрее ли? если будет к примеру пару сотен тысяч записей
Спустя 2 минуты, 42 секунды (28.08.2012 - 07:05) KOPOJI написал(а):
Цитата |
Замечание: mysql_real_escape_string() не экранирует символы % и _. Эти знаки являются масками групп символов в операторах MySQL LIKE, GRANT и REVOKE. |
Спустя 2 минуты, 3 секунды (28.08.2012 - 07:07) Игорь_Vasinsky написал(а):
1. может может. не мерял
2. даж не вкурсе был
2. даж не вкурсе был
Спустя 23 минуты, 45 секунд (28.08.2012 - 07:30) Игорь_Vasinsky написал(а):
т.е. если у меня форма поиска - кто нить введёт %слово% - или %слов__% - то буду найдены не точные совпадения?
Спустя 50 минут, 22 секунды (28.08.2012 - 08:21) KOPOJI написал(а):
если не заэкранировать процент и ввести в поиск знак процента - выведет все записи так же если ввести id = 0 - выведутся все записи
Спустя 4 минуты, 53 секунды (28.08.2012 - 08:26) Игорь_Vasinsky написал(а):
ну эт понятно.
чёт я не слышал за это не от кого)
чёт я не слышал за это не от кого)
Спустя 2 минуты, 37 секунд (28.08.2012 - 08:28) KOPOJI написал(а):
по поводу процента - это только при поиске по LIKE, потому что там он используется. а id всегда теперь услышал
Спустя 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 всегдатеперь услышал |
даа
сколько записей выведет такой запрос?
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()
Спустя 6 минут, 15 секунд (28.08.2012 - 08:48) KOPOJI написал(а):
Цитата |
при поиске юзера в таблице |
а кто сказал что у меня будет один юзер с таким именем? В таблице где я проверял у меня десятка три юзеров с именем name (со старых тестов).
Цитата |
открой для себя mb_strlen() |
давно уже открыл mb-функции. Просто isset() быстрее работает, вот и не подумал.
По поводу id - сам не знаю с чего я так решил. Вроде кто то когда то сказал, а я не проверял, просто запомнив.. Виноват, каюсь
По поводу id - сам не знаю с чего я так решил. Вроде кто то когда то сказал, а я не проверял, просто запомнив.. Виноват, каюсь
Спустя 4 минуты, 3 секунды (28.08.2012 - 08:52) killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 09:48) |
а кто сказал что у меня будет один юзер с таким именем? |
юзера ищут не по имени, а по логину, а в пределах сайта логин обязан быть уникальным, если у тебя по другому, то исправляй ошибки.
Спустя 4 минуты, 38 секунд (28.08.2012 - 08:56) KOPOJI написал(а):
Цитата |
юзера ищут не по имени, а по логину, а в пределах сайта логин обязан быть уникальным, если у тебя по другому, то исправляй ошибки. |
у меня на сайтах не по другому. здесь, в тестовой таблице - по другому. зачем мне это исправлять? так интереснее
P.S. name - это имя, логин это все таки login как бы.. А имя вполне может быть одинаковым (в общем, при регистрации в несколько полей)
Спустя 9 минут, 56 секунд (28.08.2012 - 09:06) killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 09:56) |
P.S. name - это имя, логин это все таки login как бы.. |
Я вообще не пойму о чем мы спорим? У тебя что, пользователи авторизуются по имени?
Спустя 38 секунд (28.08.2012 - 09:07) KOPOJI написал(а):
кстати в задании не говорится о том, что имя должно быть уникальным. Говорится только о защите от обновления страницы при регистрации. Это просто я так сделал
Спустя 51 секунда (28.08.2012 - 09:08) KOPOJI написал(а):
нет я вообще не пойму ЧТО мы спорим вообще давай дождемся twin-а, что он скажет
Спустя 4 минуты, 55 секунд (28.08.2012 - 09:13) killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 10:07) |
кстати в задании не говорится о том, что имя должно быть уникальным. |
А это разве не очевидно?
Обрати внимание
Цитата |
4. Иметь поисковик, который должен осуществлять поиск по полю с именами и выводить все имеющиеся совпадения (по части слова). |
Как ты вообще представляешь себе систему, в которой может быть несколько профилей с одним логином?
Спустя 5 минут, 41 секунда (28.08.2012 - 09:19) KOPOJI написал(а):
Цитата |
Как ты вообще представляешь себе систему, в которой может быть несколько профилей с одним логином? |
кривой представляю но все таки представляю)))
и эта цитата, опять же, не говорит о наличии уникальности в имени.
Опять же, обрати внимание
Цитата |
осуществлять поиск по полю с именами |
а не с логином что если имеется в виду затем чуть расширить задание - в регистрации два поля, имя и логин, а поиск нужно делать именно по имени?
Спустя 5 минут, 38 секунд (28.08.2012 - 09:24) killer8080 написал(а):
Цитата (KOPOJI @ 28.08.2012 - 10:19) |
Опять же, обрати внимание Цитата осуществлять поиск по полю с именами а не с логиномчто если имеется в виду затем чуть расширить задание - в регистрации два поля, имя и логин, а поиск нужно делать именно по имени? |
В той задаче "имя" - это имя под которым юзер авторизуется в системе, это и есть логин, а не то как тебя родители в детстве назвали Мне бы и в голову не пришло, что такое нужно разжевывать, видимо Николаю то же
Спустя 5 минут, 48 секунд (28.08.2012 - 09:30) KOPOJI написал(а):
Ну я так и сделал в принципе.. В контексте данной задачи - все равно верно выполнено, просто получается пару строчек лишние.
Это все из за моей тестовой таблицы то что у меня там есть и логин, и имя - записывал в имя (на уровне подсознания наверное так решил что имя это все таки трактуется как имя а не логин )
Это все из за моей тестовой таблицы то что у меня там есть и логин, и имя - записывал в имя (на уровне подсознания наверное так решил что имя это все таки трактуется как имя а не логин )
Спустя 1 час, 23 минуты, 28 секунд (28.08.2012 - 10:53) twin написал(а):
Уникальность - совершенно не обязательный параметр. Этот скрипт к регистрации вообще никакого отношения не имеет, просто хотелось как то более по человечески написать задание. К тому же идея это не моя, я её нагло спер с софттайма и немного подретушировал.
KOPOJI
Все-таки торопишься. И надеешься на авось или еще на что-то... Ну что вот это такое:
KOPOJI
Все-таки торопишься. И надеешься на авось или еще на что-то... Ну что вот это такое:
Цитата |
<a href="?date=yes&id='.htmlspecialchars($row['id'],ENT_QUOTES,'UTF-8').'">'.$htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8').'</a>'; |
Явно не проверял скрипт.
Дальше. Зачем стал писать на mysql, если не можешь без плэйсхолдеров. Ведь вот это не просто глупо и избыточно смотрится, это еще и изрядно тормозит.
Дальше.
Дальше.
<twin>
и жмем ссылку "список". Комментировать даже не стану. Тоже самое произойдет и с апострофом. Ведь были имена для проверки. Допустим
O'Railly
Дальше. Регистрируем обратный слэшик.
\
и пытаемся найти его через поиск. Находит, да. Но смотрим в форму и что там?
В общем как я и говорил - расхолаживают эти изыски типа PDO и прочих приблуд. Для того и придумана задача, что бы не надеялись на чудеса прогресса. Прогресс это хорошо, но нет разницы откуда ударит током. Из "евророзетки" или из старосоветской, если лезть в неё голыми руками.
По стилю, обрати внимание на длинные строки. Вот так куда симпатичнее и чище:
Дальше. Зачем стал писать на 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);Это с чего такой вывод? Однозначно можно заявить только то, что запрос успешно прошел. Но ведь запросто может возникнуть ситуация, что мускул не вернул ошибку, а строка добавлена не будет. Для этих целей есть mysql_affected_rows(), коль скоро ты решил отказаться от прогресса)))
$ins = mysql_query($query);
if($ins) echo '<br />Регистрация прошла успешно!';
Дальше.
$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) |
Уникальность - совершенно не обязательный параметр. Этот скрипт к регистрации вообще никакого отношения не имеет, просто хотелось как то более по человечески написать задание. |
И как сие стыкуется с
Цитата |
Задача. Написать скрипт регистрации. Он должен: |
Спустя 5 минут, 39 секунд (28.08.2012 - 12:42) twin написал(а):
Нормально стыкуется. Где там хоть полслова про аутентификацию? Регистрация вовсе не подразумевает уникальность. Тем более там нигде нет слова "логин". Регистрировать можно и одинаковые имена. К примеру для подсчета количества посетивших сайт Николаев.
Зарегистрировалось 5 Николаев, или один пять раз - не важно. Да и не в этом вовсе суть, а в правильной работе с данными.
Зарегистрировалось 5 Николаев, или один пять раз - не важно. Да и не в этом вовсе суть, а в правильной работе с данными.
Спустя 13 минут, 13 секунд (28.08.2012 - 12:56) killer8080 написал(а):
Цитата (twin @ 28.08.2012 - 13:42) |
Нормально стыкуется. Где там хоть полслова про аутентификацию? Регистрация вовсе не подразумевает уникальность. Тем более там нигде нет слова "логин". Регистрировать можно и одинаковые имена. К примеру для подсчета количества посетивших сайт Николаев. |
Понятно, сбил столку словом "регистрация", никакого отношения к регистрации значит задача не имеет.
Спустя 4 минуты, 52 секунды (28.08.2012 - 13:01) twin написал(а):
Ну если дотошно, то не имеет к аутентификации. Просто привыкли эти два понятия отождествлять.
Спустя 55 минут, 6 секунд (28.08.2012 - 13:56) KOPOJI написал(а):
twin, я проверял, только от XSS уже здесь прописывал, сразу забыл торопился, да.. спать хотелось..
Цитата |
Это с чего такой вывод? |
об этом не подумал..
Цитата |
По стилю |
согласен
Спустя 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() - а что вы предлагаете взамен? |
ничего я не предлагал... Все тут сделано верно.
Цитата |
а по поводу слэша - не знаю, проверял и так, и эдак - все нормально.. |
А если на сервере включить магические кавычки?
Ну и по мелочам.
А по большому счету рациональнее COUNT(*) AS `cnt` и mysql_result(), но не столь тут важно.
А вообще огромный респект за терпение. Многие бросают сразу, мол чего привязался, я и сам с усам))). Надеюсь пошло на пользу.
Ну и по мелочам.
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);сюда просятся массивы. Или еще проще addcslashes.
$text = str_replace('%','\%',$text);
$text = str_replace('_','\_',$text);
$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(*) совсем не означет, что запрос недетерменирован. Как раз наоборот - подразумевается только подсчет строк, без привязок к полю. Поэтому такая фишка работает быстрее.