[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Задача twinа
Michael
Условия задачи здесь
Решил попрактиковаться тоже. В php свой стиль только ищу - буду благодарен за справедливую критику и анализ.
PHP
function check_input($value)
{
    if (get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }
    if (!is_numeric($value)) {
        $value =mysql_real_escape_string($value);
    }
    return $value;
}
// Работа
echo '<h2>Задача авторизации <b>twin</b>а</h2>';
$c=mysql_connect("localhost","searcher","search") or die('Нет соединения');
mysql_select_db("pieces") or die('Не могу выбрать БД');
mysql_query('set names cp1251');
$pole1='';$pole2='';$soob1='';$soob2='';
if (isset($_GET['Submit'])) {
    if (isset($_GET['username'])) {
        $pole1=trim($_GET['username']);
        if(!empty($pole1)) {//--------------------------Поиск
           $poisk = addcslashes($pole1,"\\%_");
           $poisk=check_input($poisk);
           echo '<table border=1><tr><td>Ищем: <b>'.htmlspecialchars($pole1).'</b><br>';
           $query="select name from names where name like '%$poisk%'  order by name";
           $rez=mysql_query($query);
           if ($rez) {
               echo '<ul>';
               if (mysql_num_rows($rez)==0) {
                   echo ' - ничего не найдено';
               } else {
                   while ($row=mysql_fetch_array($rez))            
                   
{
                       echo '<li>'.htmlspecialchars($row['name']).'</li>';
                   }
               }   
               echo 
'</ul>';
           }
           echo '</td></tr></table>';
           
        
} else {
           $soob1=' Внимание: введите что-нибудь';
        }
    }
}
if (isset($_POST['Submit'])) { // ----- Добавление пользователя
    if (!(isset($_POST['username'])) or(trim($_POST['username'])=='')) {
        $soob2='Внимание: введите что-нибудь';
    } else {
        $vvod=check_input($_POST['username']);
        $query="insert into names set name='$vvod'";
        $rez=mysql_query($query);
        if (!$rez) {
            $soob2=' ошибка занесения'.mysql_error();
        } else {
            header("Location:{$_SERVER['PHP_SELF']}"); // редирект при успешном занесении
            die();
        }
    }
}
// Выводим список пользователей
$flag=false;$ii='';
if (isset($_GET['id'])) {
    $flag=true;
    $ii=$_GET['id']; // был переход по этой ссылке
}
$query='select * from names order by date desc';
$rez=mysql_query($query);
if ($rez) {
    echo '<ul>';
    while ($row=mysql_fetch_array($rez))
    {
        $id=$row['id'];
        $nazv=htmlspecialchars($row['name']);
        $dopsoob='';
        if (($flag)&&($ii==$id)) {// конкретизируем о человеке
            $dopsoob='&nbsp;&nbsp;<span style="color:red">(Его id - '.$id.', Зарегистрирован - '.$row['date'].')</span>';
        }

        echo '<li>',"<a href=\"{$_SERVER['PHP_SELF']}?id=$id\">$nazv</a>",$dopsoob,'</li>'."\n";
    }
    echo '</ul><hr>';
}


HTML
<form name="form1" method="get" action="<?php echo $_SERVER['PHP_SELF'];?>">
Поиск:<br>
<input type="text" name="username" value="<?php echo htmlspecialchars($pole1); ?>" ><?php echo $soob1;?>
<br>
<input type="submit" name="Submit" value="Найти">
<br>
</form>
<br>
<form name="form2" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Регистрация:<br>
<input type="text" name="username" value="<?php echo htmlspecialchars($pole2); ?>"><?php echo $soob2;?>
<br>
<input type="submit" name="Submit" value="Зарегистрироваться">

</form>




Спустя 1 час, 15 минут, 6 секунд (29.09.2009 - 12:09) stepan написал(а):
А где описание?

Спустя 43 минуты, 45 секунд (29.09.2009 - 12:53) glock18 написал(а):
Цитата
Michael очень "сложно" написал код, то есть не читаемо!!! вот что заметил...
1. Форму лучше отправляй через метод POST.
2. Обрабатывай сразу своей функцией check_input, $_GET $_POST

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

Michael
код на самом деле читается достаточно плохо.
функцию check_input я бы посоветовал использовать по-другому и несколько переписать.

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

PHP
$poisk = addcslashes($pole1,"\\%_")

это плюс. экранирование специальных символов обычно забывается smile.gif

есть защита от xss

PHP
mysql_fetch_array()

эта функция имеет параметр "тип возвращаемого массива". по умолчанию BOTH. попробуй выведи ее результат по print_r и после либо указывай MYSQL_ASSOC|MYSQL_ROW либо используй соответствующую функцию mysql_fetch_assoc|mysql_fetch_row.

ПС: одинаковые имена полей в разных формах сбивают несколько. различие только по методу - не очень удобно.

Спустя 17 минут, 55 секунд (29.09.2009 - 13:11) twin написал(а):
welbox2
Мне почему то кажется, что тебе рановато давать оценки. Мало того, что ты сам не решал эту задачу, так ты и с условиями не знаком.

Michael
Задача решена верно. Есть отдельные замечания, но в целом очень неплохо.
Особенно мне понравился подход к айдишникам. Оригинально. Эта пять smile.gif Хотя я хотел увидеть, как будут обрабатываться числовые константы для SQL

Замечания.
Читабельность на 4 с минусом или три с плюсом, выбирай.
1. операторы слеплены, не отделяются пробелами
2. Особенно неаккуратно и нечитабельно выполнен SQL
3. Блоки не выделены (вернее не все).
4. Использование фигурных скобок вместо конкатенации никак не способствует повышеню читабельности
5. Это не замечание, а совет. $soob2 я так понимаю - сообщение... Не используй транслит, смешно смотрится.

Серьёзные ошибки
1. Я не совсем понял, как ты сумел его запустить, но хидер у тебя ругается и правомерно, потому что выше есть вывод.
2. При включенных магических кавычках данные при возврате в форму искажаются. Это к вопросу о том, где и как нужно обрабатывать данные. Я недавно писал статью, что не нужно это делать на входе. Вот - иллюстрация.

Замечания по коду
1. Конструкция
PHP
$query='select * from names order by date desc';
$rez=mysql_query($query);
оправдана только тогда, когда за ней идет диагностика.
PHP
$query = 'SELECT * FROM `names` ORDER BY `date` DESC';
$rez = mysql_query($query) or die('MySQL error: '. mysql_error() .'<br>Query: '. $query) ;

А так это лишняя перезапись только и всего. Которая тормозит и жрет.
2. То же самое при инициализации. Избыточность кода:
PHP
(!(isset($_POST['username'])) or(trim($_POST['username'])==''))

никак не улучшает его в целом. Вот так тоже самое
PHP
if (empty($_POST['username'])){

3. Функция mysql_fetch_array() тут не к месту, так как тебе нужен только один массив. Уместнее mysql_fetch_assoc()

Ну пока хватит, позже еще посмотрю.
А в общем мне понравилось, не смотря на нелюбимый мною стиль smile.gif

Спустя 44 минуты, 20 секунд (29.09.2009 - 13:55) twin написал(а):
welbox2
Человек попросил анализ, и ты пытался его сделать. А это оценка ситуации.
И еще ты давал советы. Бестолковые. По этому я и сказал - рановато.
А глаза протереть не могу, ты мне в них пальцем натыкал.

PS А поисковую форму методом GET по двум причинам.
1. Это было в условиях задачи, о чем я тоже указал
2. Попробовал бы ты запостить сюда или передать по аське эту ссылку, если бы это был POST

Спустя 3 минуты, 48 секунд (29.09.2009 - 13:59) Stuff_f написал(а):
Люди, что-то все забывают клевую такую вещь, как классы, очень сокращают обьем, помойму, оромные листы кодинга, это жуть, классы рулят rolleyes.gif

Спустя 1 минута, 36 секунд (29.09.2009 - 14:00) Stuff_f написал(а):
но работа с SQL конечно мне его очень понравилась user posted image

Спустя 1 час, 12 минут, 40 секунд (29.09.2009 - 15:13) Michael написал(а):
Цитата (glock18)
1) функцию check_input я бы посоветовал использовать по-другому и несколько переписать. убирать лишние слеши может понадобиться не только для вставки в базу, но и при любой другой обработке
2)mysql_fetch_array()

1) Вот на этом меня twin и спалил...(я не тестил при включенных кавычках blink.gif ) - добавил функцию только убирать слеши
2) я вообще-то пользуюсь только mysql_fetch_row, но тут решил для лучшего вашего просмотра

Цитата (twin)
как будут обрабатываться числовые константы для SQL

знаю что надо приводить к числу (у вас же и читал), но в базу вводится строковое поле.
Цитата (twin)
Использование фигурных скобок вместо конкатенации никак не способствует повышеню читабельности

Странно, в книге на них особо напирали.
Цитата (twin)
Я не совсем понял, как ты сумел его запустить, но хидер у тебя ругается и правомерно, потому что выше есть вывод

Знаю, что надо до вывода html заголовки передавать, но у меня на localhost всегда и так прекрасно работает (куки также) - я думал это устаревшая рекомендация...
Цитата (twin)
Конструкция
$query='select * from names order by date desc';
$rez=mysql_query($query);
оправдана только тогда, когда за ней идет диагностика.

Мне удобно отделять текст запроса от его выполнения - можно старые просто комментировать и прорабатывать один за другим.

Всем спасибо за участие - мне есть пища для размышления.

Спустя 15 минут, 1 секунда (29.09.2009 - 15:28) twin написал(а):
Цитата
Странно, в книге на них особо напирали.

В разных книгах напирают на разное. Верить не книгам надо, а своим глазам. Просто посмотри по подсветке
PHP
header("Location:{$_SERVER['PHP_SELF']}");
header('Location: '. $_SERVER['PHP_SELF'] );

Цитата
но у меня на localhost всегда и так прекрасно работает (куки также) - я думал это устаревшая рекомендация...

Это просто у тебя уровень ошибок выставлен непутево. А прекрасно не работает, не может хидер так работать. Если только в настройках сервера или .htaccess не прописано. Что делать не рекомендуется по причине, которя и имеет место. Я вот не смог запустить.

Спустя 8 минут, 29 секунд (29.09.2009 - 15:36) Michael написал(а):
в php.ini:
error_reporting = E_ALL
с .htaccess не связываюсь пока.
В принципе не проблема - на будущее учту.

Спустя 26 минут, 15 секунд (29.09.2009 - 16:03) glock18 написал(а):
Цитата
но у меня на localhost всегда и так прекрасно работает (куки также) - я думал это устаревшая рекомендация...


тут дело не в error_reporting, а не в output_buffering.

Цитата
В разных книгах напирают на разное. Верить не книгам надо, а своим глазам. Просто посмотри по подсветке

PHP
header("Location:{$_SERVER['PHP_SELF']}");
header('Location: '$_SERVER['PHP_SELF'] );


справедливости ради скажу, что подсветка во всех редакторах работает по-разному. то есть то, что подсветка синтаксиса на форуме не подстветила строку со скобками, не значит, что она нигде не будет подсвечена.

так вот - скобки и конкатенация - дело вкуса. например, у меня в обеих IDE, которых сейчас работаю (nusphere phped, net beans) подсветка работает в обоих случаях.

хотя я лично и предпочитаю конкатенацию, это в любом случае дело вкуса.

Спустя 55 минут, 5 секунд (29.09.2009 - 16:58) twin написал(а):
Цитата
то есть то, что подсветка синтаксиса на форуме не подстветила строку со скобками, не значит, что она нигде не будет подсвечена.

Факт, не спорю. Но от обратного - подсветка конкатенации есть везде, а скобок выборочно. Это тоже читабельность. Вот форум - уже минус. smile.gif

Спустя 14 часов, 12 минут, 18 секунд (30.09.2009 - 07:10) Michael написал(а):
Цитата (glock18 @ 29.09.2009 - 13:03)
тут дело не в error_reporting, а не в output_buffering.

У меня output_buffering = 4096
Так советуете:
output_buffering = Off ?

Спустя 25 минут (30.09.2009 - 07:35) twin написал(а):
Конечно вещь это удобная, но ни на одном уважающем себя хостинге она не включена. По этому лучше и дома не расслабляться. К тому же эта штука тормозит скрипт.
Лучше off.

Спустя 3 дня, 13 часов, 41 минута, 44 секунды (3.10.2009 - 21:17) Pinoplast написал(а):
Цитата (glock18 @ 29.09.2009 - 09:53)
Цитата
Michael очень "сложно" написал код, то есть не читаемо!!! вот что заметил...
1. Форму лучше отправляй через метод POST.
2. Обрабатывай сразу своей функцией check_input, $_GET $_POST

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

Michael
код на самом деле читается достаточно плохо.
функцию check_input я бы посоветовал использовать по-другому и несколько переписать.

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

PHP
$poisk = addcslashes($pole1,"\\%_")

это плюс. экранирование специальных символов обычно забывается smile.gif

есть защита от xss

PHP
mysql_fetch_array()

эта функция имеет параметр "тип возвращаемого массива". по умолчанию BOTH. попробуй выведи ее результат по print_r и после либо указывай MYSQL_ASSOC|MYSQL_ROW либо используй соответствующую функцию mysql_fetch_assoc|mysql_fetch_row.

ПС: одинаковые имена полей в разных формах сбивают несколько. различие только по методу - не очень удобно.

Если читаеться плохо это хорошо, менше умных пацанов буду капаться в том что им ненадо, моя мысля в слух biggrin.gif

Спустя 20 минут, 30 секунд (3.10.2009 - 21:37) glock18 написал(а):
Pinoplast
было бы в чем, и главное, для чего копаться smile.gif

а плохой стиль, хоть и осложняет восприятие, не встанет проблемой "если надо".

Спустя 12 часов, 49 минут, 14 секунд (4.10.2009 - 10:27) Michael написал(а):
Финальный код, с учетом основных замечаний:

По нижеследующим замечаниям, чтоб не плодить портянки, в код
внесено небольшое изменение (это место отмечено крестом (X))
PHP
<?php
//Определение функций
function check_input0($value)
{
// избавление от "лишних" слешей
    if (get_magic_quotes_gpc()) 
    
{
        if (!is_numeric($value))
        {
            $value = stripslashes($value);
        }    
    
}
    return $value;
}

function check_input($value)
{
// подготовка данных в базу
    $value=check_input0($value);
    if (!is_numeric($value)) 
    
{
        $value =mysql_real_escape_string($value);
    }
    return $value;
}
// Соединение с БД
$c=mysql_connect("localhost","searcher","search") or die('Нет соединения');
mysql_select_db("pieces") or die('Не могу выбрать БД');
mysql_query('set names cp1251');
// Начальные установки
ini_set('magic_quotes_runtime',0); //***X***
$pole1='';$pole2='';$mess1='';$mess2='';
// Добавление пользователя
if (isset($_POST['Submit'])) 
{ 
    if 
(!(isset($_POST['username'])) or(trim($_POST['username'])=='')) 
    
{// нет данных для добавления
        $mess2='Внимание: введите что-нибудь';
    } 
    else 
    
{
        $vvod=check_input($_POST['username']);
        $query="insert into names set name='".$vvod."'";
        $rez=mysql_query($query);
        if (!$rez) {
            $mess2=' ошибка занесения'.mysql_error();
        } else {
            header('Location:'.$_SERVER['PHP_SELF']); // редирект при успешном занесении
            die();
        }
    }
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Задача Твина</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<body>
<?php


echo 
'<h2>Задача авторизации <b>twin</b>а</h2>';

// Поиск
if (isset($_GET['Submit'])) 
{
    if (isset($_GET['usernamepoisk'])) 
    
{
        $pole1=trim($_GET['usernamepoisk']);
        if(!empty($pole1)) 
        
{// заданы данные для поиска
           $poisk = addcslashes($pole1,"\\%_");// Специальные символы в like
           $pole1=check_input0($pole1);// для html
           $poisk=check_input($poisk); // для БД
           echo '<table border=1><tr><td>Ищем: <b>'.htmlspecialchars($pole1).'</b><br>';
           $query="select name from names where name like '%".$poisk."%'  order by name";
           $rez=mysql_query($query);
           if ($rez) 
           
{
               echo '<ul>';
               if (mysql_num_rows($rez)==0) 
               
{
                   echo ' - ничего не найдено';
               } 
               else 
               
{
                   while ($row=mysql_fetch_assoc($rez))            
                   
{
                       echo '<li>'.htmlspecialchars($row['name']).'</li>';
                   }
               }   
               echo 
'</ul>';
           }
           echo '</td></tr></table>';
           
        
} else 
        
{
           $mess1=' Внимание: введите что-нибудь';
        }
    }
}

// Выводим список пользователей
$flag=false;$ii='';// установки без конкретики о пользователе
if (isset($_GET['id'])) 
{//... с конкретикой
    $flag=true; 
    $ii
=$_GET['id']; // был переход по этой ссылке
}
$rez=mysql_query('select * from names order by date desc');
if ($rez) 
{
    echo '<ul>';
    while ($row=mysql_fetch_assoc($rez))
    {
        $id=$row['id'];
        $nazv=htmlspecialchars($row['name']);
        $dopsoob='';//подробнее о человеке
        if (($flag)&&($ii==$id)) 
        
{// конкретизируем о человеке
            $dopsoob='&nbsp;&nbsp;<span style="color:red">(Его id - '.$id.', Зарегистрирован - '.$row['date'].')</span>';
        }
        echo '<li>','<a href="'.$_SERVER['PHP_SELF'].'?id='.$id.'">'.$nazv.'</a>'.$dopsoob.'</li>'."\n";
    }
    echo '</ul><hr>';
}

HTML
<form name="form1" method="get" action="<?php echo $_SERVER['PHP_SELF'];?>">
Поиск:<br>
<input type="text" name="usernamepoisk" value="<?php echo htmlspecialchars($pole1); ?>" ><?php echo $mess1;?>
<br>
<input type="submit" name="Submit" value="Найти">
<br>
</form>
<br>
<form name="form2" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Регистрация:<br>
<input type="text" name="username" value="<?php echo htmlspecialchars($pole2); ?>"><?php echo $mess2;?>
<br>
<input type="submit" name="Submit" value="Зарегистрироваться">

</form>

Спустя 27 минут, 30 секунд (4.10.2009 - 10:54) twin написал(а):
Ну не совсем финальный. С магическими кавычками ты так и не разобрался. Напиши в .htaccess это:
Код
php_flag magic_quotes_gpc on
php_flag magic_quotes_runtime on

и посмотри, в каком виде выйдут на экран кавычки и апострофы.
И второй момент, я уже указывал на него. Вот тут
PHP
if (!(isset($_POST['username'])) or(trim($_POST['username'])==''))

у тебя прямое обращение к члену массива, которого вполне может и не оказаться. То есть ты в функцию trim() суешь заведомо неопределенную переменную. Сделай проще, не мудри:
PHP
$username = !empty($_POST['username'])?trim($_POST['username']:NULL;

это решит сразу обе проблемы. Во первых, сразу проверка на пустоту, а во вторых функция empty() не вызывает ошибку при обращении к неустановленной переменной.

И еще один совет - пиши операторы SQL в верхнем регистре. Очень трудно читать такие запросы. Ты поймешь это, когда они станут по 500-100 символов.

Ну а в целом - прогресс.))

Спустя 7 минут, 5 секунд (4.10.2009 - 11:01) twin написал(а):
И еще, по читабельности и аккуратности кода. Засунь его сюда и посмотри, как должно быть в идеале. smile.gif

Спустя 18 минут, 22 секунды (4.10.2009 - 11:19) Michael написал(а):
Цитата (twin @ 4.10.2009 - 07:54)
1) Ну не совсем финальный. С магическими кавычками ты так и не разобрался. Напиши в .htaccess это:
Код
php_flag magic_quotes_gpc on
php_flag magic_quotes_runtime on

и посмотри, в каком виде выйдут на экран кавычки и апострофы.

2) И второй момент, я уже указывал на него. Вот тут
PHP
if (!(isset($_POST['username'])) or(trim($_POST['username'])==''))

у тебя прямое обращение к члену массива, которого вполне может и не оказаться. То есть ты в функцию trim() суешь заведомо неопределенную переменную.

1) у меня вообще почему то .htaccess никаких корректировок не ввел sad.gif
get_magic_quotes_gpc()===false
И я так понимаю runtime можно ж отключать программно(в ini_set)

2) twin, прям основы мне расшатываете mad.gif
Если !(isset($_POST['username'])) вернет true то
or(trim($_POST['username'])=='') php не станет вычислять вообще, разве не так?

Цитата
Засунь его сюда и посмотри, как должно быть в идеале

Че то не суется...

Спустя 29 минут, 8 секунд (4.10.2009 - 11:49) twin написал(а):
Цитата
1) у меня вообще почему то .htaccess никаких корректировок не ввел 
get_magic_quotes_gpc()===false
И я так понимаю runtime можно ж отключать программно(в ini_set)

ну попробуй в ini_set
Цитата
Если !(isset($_POST['username'])) вернет true то
or(trim($_POST['username'])=='') php не станет вычислять вообще, разве не так?

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

прекрасно все сунулось...

Спустя 37 минут, 31 секунда (4.10.2009 - 12:26) glock18 написал(а):
Цитата
нет, не так. интерпретатор должен проверить оба условия, а значит должен выполнить то, что там прописано.



Michael прав. Если условие составное, то вычисление может быть остановлено после расчета (первого выражения, скажем):
а) false and <condition> - <condition> не будет расчитываться, а сразу будет возвращено false.
б) true or <condition> - аналогично, возвращено будет true.

Спустя 48 минут, 47 секунд (4.10.2009 - 13:15) twin написал(а):
Цитата
Michael прав.

Нет, не прав.
Посмотри на код внимательно. Если переменная неустановлена, то !iset() вернет true, а значит начнет проверяться второе условие. И будет работать с неустановленной переменной.

Спустя 15 минут, 20 секунд (4.10.2009 - 13:30) glock18 написал(а):
это случай

true or... расчета второго выражения не будет. это можно легко проверить

PHP
$a 1;
if (!isset(
$var) or $a++);

echo 
$a;
$var true;

if (!isset(
$var) or $a++);
echo 
$a;


выведет 12.

Спустя 2 минуты, 1 секунда (4.10.2009 - 13:32) Michael написал(а):
Цитата (twin @ 4.10.2009 - 10:15)
Цитата
Michael прав.

Нет, не прав.
Посмотри на код внимательно. Если переменная неустановлена, то !iset() вернет true, а значит начнет проверяться второе условие. И будет работать с неустановленной переменной.

Когда !iset() вернет true
работает условие б) true or <condition>
т.е. не проверяется <condition> , т.к. итак ясно что true;

Спустя 7 минут, 35 секунд (4.10.2009 - 13:40) twin написал(а):
Ну убедили, был неправ. К тому же по условиям там может быть 0. Погорячился. sad.gif

Спустя 9 минут, 32 секунды (4.10.2009 - 13:49) glock18 написал(а):
twin
да ладно, всяко бывает. главное, истину найти smile.gif

Спустя 3 минуты, 36 секунд (4.10.2009 - 13:53) Michael написал(а):
Цитата (twin @ 4.10.2009 - 08:49)
ну попробуй в ini_set

При включенном в php.ini magic_quotes_runtime
Вставил в начало скрипта:
ini_set('magic_quotes_runtime',0);
- все отображает OK.

P.S. Вообще magic_quotes_runtime что-то удивительно странное по
своей "полезности".


Спустя 2 часа, 3 минуты, 6 секунд (4.10.2009 - 15:56) twin написал(а):
Ну сам по логике скрипта посмотри, когда функция работает, а когда нет.
Если не можешь оключить кавычки, вот твой скрипт без них.

PS наврал, наоборот, с ними.

Спустя 3 минуты, 59 секунд (4.10.2009 - 16:00) Michael написал(а):
twin, это не мой скрипт!!! Мой работает нормально.
У меня на входе:
magic_quotes_gpc = On
magic_quotes_runtime = On
Скрипт - выше(добавил ini_set).
Что у вас?

Спустя 13 минут, 45 секунд (4.10.2009 - 16:14) glock18 написал(а):
magic_quotes нельзя устанавливать ini_set'ом. поставь в php.ini. возможно, подействует, если установить в htaccess, но я не уверен. ini_set точно не может менять его значение пост-фактум

Спустя 2 минуты, 52 секунды (4.10.2009 - 16:17) Michael написал(а):
glock18, ну вот так же:
ini_set('magic_quotes_runtime',0);
можно же?
Все работает.
Я читал, что только magic_quotes_gpc нельзя так ставить.

Спустя 12 минут (4.10.2009 - 16:29) glock18 написал(а):
рантайм вообще не причем. важно понимать, что до того момента когда скрипт будет запущен, кавычки уже отработают (или нет - если отключены). поэтому хоть завыставляйся magic_quotes. а тебе нужно чтобы проверить работоспособность скрипта с ними, выставлять именно magic_quotes_gpc. Хотя я хоть и догадываюсь о чем говорит Твин, но в код не смотрел. так что не могу утверждать, что у тебя там появятся где-то слеши.

Спустя 14 минут, 17 секунд (4.10.2009 - 16:43) twin написал(а):
Это именно твой скрипт. А по логике посмотри - если кавычки включены, стрипслэшет толко данные для запросов. А на вывод они идут как есть.
Я немного не то написал в топике. Там включены кавычки. Вот так там:
Код
php_flag magic_quotes_gpc on
php_flag magic_quotes_runtime on

Спустя 3 минуты, 4 секунды (4.10.2009 - 16:46) Michael написал(а):
Я понял, что при загрузке из БД при magic_quotes_runtime = On
вставляются слеши.
Это убираю установкой ini_set('magic_quotes_runtime',0) - до работы с БД.
А magic_quotes_gpc без изменений работает.

Блин, где же собака зарыта smile.gif ?
twin, а в начале помещенного вами скрипта стоит:
ini_set('magic_quotes_runtime',0); ? (я добавил в "финальную" версию)
У меня такая работа наблюдается только если не стоит.

Спустя 1 час, 24 минуты, 12 секунд (4.10.2009 - 18:10) twin написал(а):
Да, действительно, не услышал я твой крик души на протяжении нескольких топиков.
Цитата
glock18, ну вот так же:
ini_set('magic_quotes_runtime',0);
можно же?
Все работает.
Я читал, что только magic_quotes_gpc нельзя так ставить.

Можно ставить, но только по условиям задачи скрипт не должен зависить от состояния этой директивы, а не устанавливать её. Дело в том, что не все хостеры предоставляют возможность устанавливать настройки через ini_set(). По этому я и не увидел. Так что это не лучший выход из положения. А самое главное, цель этого условия была другой. Не сделать рабочий скрипт, это не сложно, а разобраться в логике обработки данных. Пока с кавычками на 3 с минусом)))

Спустя 16 часов, 3 минуты, 33 секунды (5.10.2009 - 10:14) Michael написал(а):
PHP
//Определение функций
function check_input0($value)
{
// избавление от "лишних" слешей из get/post/cookie
    
if (get_magic_quotes_gpc()) 
    {
        if (!
is_numeric($value))
        {
            
$value stripslashes($value);
        }    
    }
    return 
$value;
}
//
function check_input1($value)
{
// избавление от "лишних" слешей при загрузке данных из БД
    
if (get_magic_quotes_runtime()) 
    {
        if (!
is_numeric($value))
        {
            
$value stripslashes($value);
        }    
    }
    return 
$value;
}
//
function check_input($value)
{
// подготовка данных в базу
    
$value=check_input0($value);
    if (!
is_numeric($value)) 
    {
        
$value =mysql_real_escape_string($value);
    }
    return 
$value;
}
// Соединение с БД
$c=mysql_connect("localhost","searcher","search") or die('Нет соединения');
mysql_select_db("pieces") or die('Не могу выбрать БД');
mysql_query('set names cp1251');
// Начальные установки
$pole1='';$pole2='';$mess1='';$mess2='';
// Добавление пользователя
if (isset($_POST['Submit'])) 

    
$username=empty($_POST['username'])? NULL:trim($_POST['username']);
    if (!
$username//
    
{// нет данных для добавления
        
$mess2='Внимание: введите что-нибудь';
    } 
    else 
    {
        
$vvod=check_input($username);
        
$query="INSERT INTO names SET name='".$vvod."'";
        
$rez=mysql_query($query);
        if (!
$rez) {
            
$mess2=' ошибка занесения'.mysql_error();
        } else {
            
header('Location:'.$_SERVER['PHP_SELF']); // редирект при успешном занесении
            
exit();
        }
    }
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Задача Твина</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<body>
<?php

echo '<h2>Задача авторизации <b>twin</b>а</h2>';

// Поиск
if (isset($_GET['Submit'])) 
{
    if (isset(
$_GET['usernamepoisk'])) 
    {
        
$pole1=trim($_GET['usernamepoisk']);
        if(!empty(
$pole1)) 
        {
// заданы данные для поиска
           
$poisk addcslashes($pole1,"\\%_");// Специальные символы в like
           
$pole1=check_input0($pole1);// для html
           
$poisk=check_input($poisk); // для БД
           
echo '<table border=1><tr><td>Ищем: <b>'.htmlspecialchars($pole1).'</b><br>';
           
$query="SELECT name FROM names WHERE name LIKE '%".$poisk."%'  ORDER BY name";
           
$rez=mysql_query($query);
           if (
$rez
           {
               echo 
'<ul>';
               if (
mysql_num_rows($rez)==0
               {
                   echo 
' - ничего не найдено';
               } 
               else 
               {
                   while (
$row=mysql_fetch_assoc($rez))            
                   {
                       
$viv=check_input1($row['name']);//из базы загрузка
                       
echo '<li>'.htmlspecialchars($viv).'</li>';
                   }
               }   
               echo 
'</ul>';
           }
           echo 
'</td></tr></table>';
           
        } else 
        {
           
$mess1=' Внимание: введите что-нибудь';
        }
    }
}

// Выводим список пользователей
$flag=false;$ii='';// установки без конкретики о пользователе
if (isset($_GET['id'])) 
{
//... с конкретикой
    
$flag=true
    
$ii=$_GET['id']; // был переход по этой ссылке
}
$rez=mysql_query('SELECT * FROM names ORDER BY date DESC');
if (
$rez
{
    echo 
'<ul>';
    while (
$row=mysql_fetch_assoc($rez))
    {
        
$id=(int)$row['id'];
        
$nazv=htmlspecialchars(check_input1($row['name']));// из базы
        
$dopsoob='';//подробнее о человеке
        
if (($flag)&&($ii==$id)) 
        {
// конкретизируем о человеке
            
$dopsoob='&nbsp;&nbsp;<span style="color:red">(Его id - '.$id.', Зарегистрирован - '.$row['date'].')</span>';
        }
        echo 
'<li>','<a href="'.$_SERVER['PHP_SELF'].'?id='.$id.'">'.$nazv.'</a>'.$dopsoob.'</li>'."\n";
    }
    echo 
'</ul><hr>';
}

HTML
<form name="form1" method="get" action="<?php echo $_SERVER['PHP_SELF'];?>">
Поиск:<br>
<input type="text" name="usernamepoisk" value="<?php echo htmlspecialchars($pole1); ?>" ><?php echo $mess1;?>
<br>
<input type="submit" name="Submit" value="Найти">
<br>
</form>
<br>
<form name="form2" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Регистрация:<br>
<input type="text" name="username" value="<?php echo htmlspecialchars($pole2); ?>"><?php echo $mess2;?>
<br>
<input type="submit" name="Submit" value="Зарегистрироваться">

</form>

Спустя 2 часа, 41 минута, 31 секунда (5.10.2009 - 12:55) twin написал(а):
Ну вот, теперь работает. smile.gif Только это можно было сделать одним движением, не расписывая на разные функции.
Вот так примерно
PHP
if( get_magic_quotes_gpc() )  
{  
    
$_GET check_input0$_GET );  
    
$_POST check_input0$_POST );  
}

и тогда вторая функция будет не нужна.

А в целом гут. Поздравляю)))


_____________
There never was a struggle in the soul of a good man that was not hard
Быстрый ответ:

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