[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Решение задачи от Twina на корректную обработку
Админ

условие тут тут

<?php
/*--------------------------начальные установки-----------------------------------------*/

$err = 0;
error_reporting (E_ALL);
define("page","1.php");
$db = mysql_connect ('localhost', 'root', '') or die(mysql_error());
mysql_select_db ('test',$db) or die(mysql_error());

/* ----------------------обработка переменной name--------------------------------------*/

if (isset ($_POST ['name']))
{
$name_for_form = $_POST ['name'];
$name = trim ($_POST ['name']);
if ($name == "")
{
$err = 1;
}
else
{
$name = base64_encode ($name);
}
}


/*-----------------------------проверка может такое имя уже есть в базе-------------------*/

if ( isset ($name) and $err == 0)
{
$res = mysql_query("SELECT * FROM names WHERE name = '$name'");
$user = mysql_num_rows($res);
if ($user > 0)
{
$err = 2;
}
}


/*-----------------------------заносим нового пользователя в базу--------------------------*/

if ( isset ($name) and $err == 0)
{
mysql_query ("INSERT INTO names (date,name) VALUES (NOW(),'$name')");
header('location: http://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
exit();
}

/* --------------------------------если была нажата ссылка-------------------------------- */

if (isset ($_GET ['id']))
{
$id = (int)$_GET ['id'];
$res = mysql_query("SELECT date,name FROM names WHERE id='$id'");
$row = mysql_fetch_assoc ($res);
$nam = base64_decode ($row ['name']);
$date = $row ['date'];
echo ("пользователь ".htmlspecialchars ($nam)." зарегестрирован ".$date."<br>");
}

/* -------------------------------обработка поиского запроса------------------------------ */

if (isset ($_GET ['search']))
{
$search_for_form = htmlspecialchars ($_GET ['search']);
$search = $_GET ['search'];
$search = (string)$search;
if ($search == "")
{
$err = 3;
}
}


/* -----------------перебор в базе с выводом совпадений----------------------------------- */

if (isset ($search) and $err == 0 )
{
$i = 0;
$res = mysql_query ("SELECT * FROM names");
while ($row = mysql_fetch_assoc ($res))
{
$rowread = base64_decode ($row ['name']);
$rowread = (string)$rowread;
$ok = strstr ($rowread,$search);
if ($ok)
{
$i = $i + 1;
echo ($i.".".htmlspecialchars ($rowread)."<br>");
}
}

if ($i == 0)
{
echo ("Нету тут таких<br><br>");
}
else
{
echo ("всего найдено ".$i." пользователей<br><br>");
}
}


/* ------------------------------вывод списка всех пользователей------------------------- */

$res = mysql_query("SELECT * FROM `names` ORDER BY id DESC ");
while($user = mysql_fetch_assoc($res))
{
$namem = base64_decode ($user ['name']);
echo '<a href=1.php?id='.$user ['id'].'>'.htmlspecialchars($namem).'</a><br />';
}
?>

<!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>made by Maloy</title>
</
head>
<
body><br>
<
form action="<?php page ?>" method="post">
<
input name="name" type="text" <?php if (isset ($name_for_form) and $err == 2) {echo ("value=$name_for_form");}?> size="50" maxlength="50">
<
input name="" type="submit" value="регистрация"><br>
<?php
if ($err == 1)
{
echo ("пустое имя<br>");
}
if ($err == 2)
{
echo ("Есть тут такой уже<br>");
}
?>
</form>

<
form action="<?php page ?>" method="get">
<
input name="search" type="text" <?php if (isset ($search_for_form) and $err != 3) {echo ("value=$search_for_form"); } ?> size="50" maxlength="50">
<
input name="" type="submit" value="поиск"><br>
<?php
if ($err == 3)
{
echo ("надо чё нибудь ввести");
}
?>
</form>
</
body>
</
html>




Спустя 34 секунды (14.09.2010 - 18:55) Админ написал(а):
сильно не пинайте я считаю что для человека,который про пхп узнал 3 дня назад я думаю очень неплохо.
тенарные операторы,функции типа empty(),и конструкции типа ++i - не использовал для наглядности.
я ещё не всё до конца понимаю использовал только те функции которые точно знал.

Спустя 12 минут, 32 секунды (14.09.2010 - 19:08) DedMorozzz написал(а):
Для 3х дней, если это так - действительно очень хорошо.
Но задача не решена. И более того, скрипт сам проверял? Чёт кажется, что не работает.
Более подробно Твин опишет. Он уже смотрит тему smile.gif

Спустя 3 минуты, 29 секунд (14.09.2010 - 19:11) Админ написал(а):
у меня всё работает - час тестил (я очень быстро учусь) smile.gif

Спустя 26 минут, 7 секунд (14.09.2010 - 19:37) twin написал(а):
Цитата
про пхп узнал 3 дня назад

Ну молодец, коли так))) Пинать буду так же как всех, так как делать можно или хорошо, или никак.

Приступим.
Задача решена не полностью.
1. Скрипт зависим от директивы magic_quotes_gpc.
2. Cлово в форму возвращается с искажениями. (попробуй первым символом апостроф или два слова через пробел)

Кстати говоря, проверка на уникальность не требовалась задачей, но если сделал, то нужно делать правильно. По твоей схеме на сторону PHP будет передана вся таблица. А если она большая?

Так же совсем неоптимально делать поиск на стороне PHP. Если в базе 100000 записей, то будет 100000 интераций цикла и столько же проверок. Ты положишь сервер.

Теперь грубые ошибки.
1. Не установлена кодировка соединения с БД.
2. Данные ты хранишь в базе в закодированном (base64) виде. А это не есть гут. Ломается совместимость и вообще плохо. Если потребуется работа с данными, то на стороне мускула, про это можно забыть. Что крайне неоптимально. База для того и создана, чтобы облегчить эту самую работу. Не просто для хранения.

Из-за этой грубейшей логической ошибки нет смысла дальше разбирать функционал. Нужно переделывать почти полностью.

И еще, один штришок. Вот это место
<form action="<?php page ?>" method="post">

ничего не забыл?

Спустя 17 минут, 26 секунд (14.09.2010 - 19:55) Админ написал(а):
thanksn за пинки

отвечу по пунктам

1.плохо знаком с данной директивой (magic_quotes_gpc.) поэтому решил не заморачиваться и просто закодировать входящие данные и пусть там хоть чего хакер напихает или как там сервер настроен - по барабану я ж не отправляю в поток и в базу исходный запрос.
2.это легко решаемо.
3.условий о быстродействии сервера не ставилось.
4.про юникод забыл - каюсь.(хотел в последнюю очередь вставить чтоб не мешал).
5.условий о формате хранения данных в базе не ставилось. (Кроме того важны оптимальность, читабельность и стиль написания - к условиям не относятся тем более не понятно какая оптимальность важна - подумал оптимальность написания)
штришок:
ну на локальной машине и так работало - думаю ничего страшного.(если не работает можно заменить на 1.php)

Спустя 16 минут, 3 секунды (14.09.2010 - 20:11) Админ написал(а):
twin

насчёт 3 дней - срок примерный (+- сутки) был бы спец не задавал бы вопросы в топе для новичков (один из них как раз используется в скрипте - приведение к строковому типу)

тем более применённая технология - на мой взгляд более оптимальна (тем паче она стара как мир) - зачем проводить сложные проверки , если проще закодировать информацию и не думать о всяких проблеммах типа шприцывания базы - технология довольно распостронена в не которых областях передачи данных
Вам ли этого не знать
P.S.спать хочу но ответа дождусь. ph34r.gif

Спустя 15 минут, 20 секунд (14.09.2010 - 20:26) twin написал(а):
Цитата
1.плохо знаком с данной директивой (magic_quotes_gpc.) поэтому решил не заморачиваться и просто закодировать входящие данные и пусть там хоть чего хакер напихает или как там сервер настроен - по барабану я ж не отправляю в поток и в базу исходный запрос.

Ну тут дело вовсе не в хакерах. Просто искажение данных. Сделай в корне файл .htaccess такого содержания:
php_flag magic_quotes_gpc On
и попробуй такое имя O'Relly
Цитата
2.это легко решаемо.
Это вообще не решаемо с 90% операторов SQL
Цитата

3.условий о быстродействии сервера не ставилось.

5.условий о формате хранения данных в базе не ставилось

В том и вся прелесть профессии - писать так, чтобы было все правильно, не зависимо от корректности ТЗ.
Решение с поиском на стороне PHP не есть оптимальное. И единственное ему оправдание - облегчить труд программиста не взирая на возможные (а тут - обязательные) нехорошие последствия.
Другими словами - наколоть заказчика. Это не делает чести.

По этому
Цитата
если проще закодировать информацию и не думать о всяких проблеммах типа шприцывания базы - технология довольно распостронена в не которых областях передачи данных
плохое начало. Так ты далеко не уедешь, а будешь разоблачен заказчиком и бит.
Это не передача данных, а их хранение с последующей возможностью обработки.

Спустя 14 минут, 21 секунда (14.09.2010 - 20:40) Админ написал(а):
twin
я работаю в области далёкой от програмирования - таких нюансов не знал = следовательно пункт про заказчиков логически не верен (в тз не на писано )
с маг.ковычками постараюсь разобраться - возможно представлю новое решение - просто остальные решения (других участников) используют в принципе одинаковый алгоритм обработки - мне это неинтересно - нужно нестандартное решение.
в пункте 2 имелось ввиду,что это решаемо касаемо проблеммы - Cлово в форму возвращается с искажениями.

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

спасибо за оценку - я проанализирую сопутсвующие факторы

Спустя 10 минут, 13 секунд (14.09.2010 - 20:51) twin написал(а):
Ну поиск собственных решений, это всегда хорошо. Однако эта задача специально построена так, что имеет очень маленький разброс вариантов решения. Именно для того, чтобы показать, как именно нужно работать со скриптами, использующими БД.

По этому кардинальное изменение принципов работы с БД даже не оговаривалось - имело статус априори.
Никто и никогда в здравом уме и рассудке не станет хранить в базе закодированный текст. Ведь может понадобится и другой поиск, и изменение записей и многое другое, что призван делать MySQL сервер. А тут эти возможности рубятся на корню. Тогда зачем он вообще...

Спустя 16 минут, 56 секунд (14.09.2010 - 21:08) Админ написал(а):
странно слышать такие мысли - я на форуме 1 день откуда мне знать про постулаты хотя это спорно( незнание не освобождает от ответственности) - но суть не в этом - я не буду говорить про частные случаи хранения инфы в бд ( хешированные пароли например) - я исхожу из другой логики - то что сегодня догма - завтра анекдот и вопрос шифрования инфы по ключу даёт те же возможности при поиске на стороне базы - необходимо лишь наличие библиотеки.
вопрос шифрования данных в базе я думаю скоро станет одним из приоритетных ибо гарантирует более высокую вероятность сохранности данных.

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

Спустя 2 минуты, 20 секунд (14.09.2010 - 21:10) Админ написал(а):
а если думать о быстродействии так зачем тогда вообще нужен пхп - давайте на си кодить - ничего не понятно зато быстро smile.gif

Спустя 6 минут, 48 секунд (14.09.2010 - 21:17) twin написал(а):
Цитата
вопрос шифрования инфы по ключу даёт те же возможности при поиске на стороне базы - необходимо лишь наличие библиотеки.

Ну это из другой области. Пока библиотеки нет - и суда нет. smile.gif

Цитата
а если думать о быстродействии так зачем тогда вообще нужен пхп - давайте на си кодить - ничего не понятно зато быстро
А если не думать - реально сервак положишь. Или из-за двух неграмотных строчек заставишь раскошелиться потребителя скрипта на пару косарей евров.

Спустя 15 минут, 52 секунды (14.09.2010 - 21:33) Админ написал(а):
twin
спс за советы - буду думать.
P.S.
кстати по поводу быстродействия - цикл с миллионом итераций на php занимает 2 секунды если использовать pentium 100.

Спустя 25 минут, 56 секунд (14.09.2010 - 21:59) twin написал(а):
Цитата
цикл с миллионом итераций на php занимает 2 секунды если использовать pentium 100.

Ты ошибаешься. На более серьёзной машине это занимает несколько десятков секунд. Вот выдержка из твоего скрипта, примерно рядом, меряй
<?php
set_time_limit(0);
$s = microtime(true);

$row ['name'] = 'dGVzdA==';
$rowread = 'test';

$i = 1000000;

while (!empty($i))
{
--$i;
$rowread = base64_decode ($row ['name']);
$rowread = (string)$rowread;
$ok = strstr ($rowread,$search);
if ($ok)
{
$test = ($i.".".htmlspecialchars ($rowread)."<br>");
}
}


echo microtime(true) - $s;


Умножь на занимаемую память и предполагаемую посещаемость. Сколько потребуется ресурса при 100 посещениях? а при 1000?

Спустя 11 минут, 1 секунда (14.09.2010 - 22:10) Админ написал(а):
правильно у тебя всё я думаю - я верю (тем паче так легко проверить)
признаю был неправ
у меня имелся ввиду очень простой цикл - просто тяжко уже думать - я посплю потом буду думать - но раз такие спецы обращают внимание - на полуграмотного меня - это стимулирует.

Спустя 42 минуты, 3 секунды (14.09.2010 - 22:52) proviruz написал(а):
чуваку респект

Спустя 23 часа, 29 минут, 29 секунд (15.09.2010 - 22:21) Админ написал(а):

<?php
// --------------начальные установки----------------------------
$err = 0;
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'");

// --------- магические кавычки------------------------------

function strip ($z)
{
if (!get_magic_quotes_gpc() and $err == 0)
{
$z = mysql_real_escape_string ($z);
}
return $z;
}

//-----------------заносим имя в базу------------------------

if (isset ($_POST ['name']))
{
$name = trim ($_POST ['name']);
$name = (string)$name ;
if (empty($name))
{
$err = 1;
}
strip ($name);
if ($err == 0)
{
mysql_query ("INSERT INTO `names` (`date`,`name`) VALUES (NOW(),'$name')");
header('location: http://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
exit();
}
}


//-------------------обработка ссылки--------------------------

if (isset ($_GET ['id']))
{
$id = (int)$_GET ['id'];
$res = mysql_query("SELECT `date`,`name` FROM `names` WHERE id='$id'");
$row = mysql_fetch_assoc ($res);
echo ("пользователь ".htmlspecialchars ($row['name'])." зарегестрирован ".$row['date']."<br>");
}

//------------------обработка поиска--------------------------

if (isset ($_GET ['search']))
{
$search = trim ($_GET ['search']);
$search_for_form = stripslashes ($_GET ['search']);
$search_for_form = htmlspecialchars ($search_for_form);
$search = (string)$search;
if (empty ($search))
{
$err = 2;
}
if ($err != 2)
{
strip ($search);
$search = addslashes ($search);
$res = mysql_query("SELECT * FROM `names`WHERE `name` LIKE '%".$search."%'");
$count = mysql_num_rows($res);
if ($count != 0)
{ echo ("Найдено ".$count." пользователей<br>");
while($users = mysql_fetch_assoc($res))
{
echo (htmlspecialchars($users['name'])."<br>");
}
}

else {echo "нету тут таких<br>";}
}
}

echo '<br>';

//-----------------вывод всех пользователей ------------------------

$res = mysql_query("SELECT * FROM `names` ORDER BY id DESC ");
while($user = mysql_fetch_assoc($res))
{
echo '<a href=2.php?id='.$user['id'].'>'.htmlspecialchars($user['name']).'</a><br />';
}
?>

<!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>made by Maloy</title>
</
head>
<
body><br>
<
form action="<?php $_SERVER ['SCRIPT_NAME'] ?>" method="post">
<
input name="name" type="text" size="50" maxlength="50">
<
input name="" type="submit" value="регистрация"><br>
<?php
if ($err == 1)
{
echo ("пустое имя<br>");
}
?>
</form>
<
br>
<
form action="<?php $_SERVER ['SCRIPT_NAME'] ?>" method="get">
<
input name="search" type="text"
<?php
if (isset ($search_for_form) and $err != 2) {echo ("value=$search_for_form" ); }
if (isset ($search_for_form))
{
if($search_for_form == "'") {echo ("'"); }
}

?>
size="50" maxlength="50">
<
input name="" type="submit" value="поиск"><br>
<?php
if ($err == 2)
{
echo ("надо чё нибудь ввести");
}
?>
</form>
</
body>
</
html>


Вот переделка - код стал похож на остальные,но пока некогда чё то другое придумать.
стиль поменялся в связи с тем,что стал юзать phpDesigner.
жду пинков.

Спустя 23 минуты, 52 секунды (15.09.2010 - 22:45) Админ написал(а):
аууу мне вставать через 6 часов

Спустя 7 минут, 20 секунд (15.09.2010 - 22:52) twin написал(а):
Ну вот, уже ближе к теме.
Цитата
код стал похож на остальные,но пока некогда чё то другое придумать.
Это не конкурс - "кто лучше". Это для того, чтобы ты разобрался. smile.gif

Вот смотри
function strip ($z)
{
if (!get_magic_quotes_gpc())
{
$z = mysql_real_escape_string ($z);
}
return $z;
}
тут опечатка наверно была по поводу and $err == 0, я убрал. Но суть не изменилась. Надежнее обрабатывать данные всегда. Вне зависимости от настроек сервера. А последствия магических кавычек просто убрать. Поройся ещё в решениях, поймешь как.

А при твоем раскладе попробуй зарегать нечетное количество апострофов. Не выйдет.

Не решен вопрос с поиском символов _ и %

Поля в форме так и корежит. Попробуй найти такой текст '>

И штришок. smile.gif Ну вот поменял ты в форме на это:
<form action="<?php $_SERVER ['SCRIPT_NAME'] ?>" method="get">
Но
1. Где echo потерял?
2. В акшен лучше ничего вообще не ставь, как и получилось без echo
3. Если делаешь без привязки к файлу, то почему в ссылках стоит 2.php?
Да и сами ссылки вылезли выше доктайпа... Посмотри HTML страницы.

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

Немного грешишь перезаписями. Экономнее надо. Вот тут например:
    $count = mysql_num_rows($res);
if ($count != 0)
можно просто

    if (mysql_num_rows($res) > 0)

ну и еще там несколько таких моментов.

Пробелы ставят обычно в конструкциях. Или в функциях. Или нигде. Или везде. Но не как попало - то есть, то нет. Я имею ввиду перед скобкой.
    strip ($search);
$search = addslashes ($search);
$res = mysql_query("SELECT * FROM `names`WHERE `name` LIKE '%".$search."%'");
$count = mysql_num_rows($res);
if ($count != 0)
{ echo ("Найдено ".$count." пользователей<br>");
while($users = mysql_fetch_assoc($res))
{
echo (htmlspecialchars($users['name'])."<br>");
}
Видишь каша какая из-за табуляции.

А вообще уже близко к правде. smile.gif

Спустя 15 минут, 11 секунд (15.09.2010 - 23:07) Админ написал(а):
насчёт пробелов - так эт из-за дизайнера - ставишь скобку и он сразу вторую проставляет - в итоге пока там стёр там добавил - каша.
script_name вставил в конце - не помню тестил или нет - но косяк факт.
помимо _% я так и не решил вопрос по поводу вывода в поле поиска символа одиночный апостроф(тож косяк признаю).
спасибо за резьюм - буду следовать поговорке - не ошибается тот , кто ничего не делает.
буду дальше саморазвиваться.
Быстрый ответ:

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