Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обработка простенькой формы

9.6K
02 января 2006 года
MiKar
20 / / 06.11.2005
Приветствую!

Вот такой код:

<?php
if ($post == ‘add’)
{
$db = mysql_pconnect ('localhost', 'login', 'passwd');
mysql_select_db('database');
$query = ‘insert into cats (cat_name) values ("‘.$cat_name.’")’;
$result = mysql_query ($query);
}
?>

<form method=”post” action=”<?php $PHP_SELF; ?>”>
<input type=”hidden” name=”post” value=”add”>
<input type=”text” name=”cat_name”>
<input type=”submit” value=”добавить”>
</form>

Информацию в БД добавляет, но если $post != ‘add’, пишет:
“Undefined variable: post in … on line”, где if ($post = ‘add’)

Хотелось написать скрипт, который обрабатывает “сам себя”, но эта ошибка все портит. Как и где объявить переменную post?

Заранее благодарен,
Михаил.
9.6K
02 января 2006 года
MiKar
20 / / 06.11.2005
Цитата:
Originally posted by MiKar

Как и где объявить переменную post?



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

8
02 января 2006 года
mfender
3.5K / / 15.06.2005
Во-первых, не следует брать переменную $post. Рекомендуется оперировать с массивом $_POST. Т.е., в данном случае это будет выглядеть как $_POST['post'].

В целом, данный пример может выглядеть примерно так:
Код:
if(isset($_POST['post'])){
    $query = null;
    if ($_POST['post'] == 'add'){
        $query = "
            INSERT INTO cats
            SET
                cat_name = '{$_POST['cat_name']}'
            "
;
    }
    elseif ($_POST['post'] == 'edit'){
        /*Вроде как вносим изменения в запись*/
        $query = "UPDATE cats SET cat_name='{$_POST['cat_name']}' WHERE id={$_POST['id']}";
    }

    /*Производим изменения в БД, если переменная $_POST['post']
    имела значения add или edit*/

    if(!is_null($query)){
        $db = mysql_pconnect ('localhost', 'login', 'passwd');
        mysql_select_db('database');
        $result = mysql_query ($query);
    }
}
else echo "Никаких движений с БД";


Добавлю сюда же, что все переменные, которые передаются методами POST и GET, а также COOKIE можно найти в одном массиве - $_REQUEST. Иногда это очень полезно.

Да. И еще.
Все входящие переменные следует препарировать. Т.е. подготовить их к использованию в SQL-запросе. Ибо человек со стороны браузера может чёрт знает что понаписать. Например, в приведённом мною тексте, поле cat_name, имеющее текст Это поле с именем 'cat_name' вызовет ошибку, действительно приведёт к ошибке mysql. Нужно экранировать апострофы.
Для этого можно использовать htmlspecialchars. Но я предпочитаю использовать таку функцию:

 
Код:
function strPrepare($s)
{
    $s=ereg_replace("'","&#039;",$s);
    $s=ereg_replace("<","&lt;",$s);
    $s=ereg_replace(">","&gt;",$s);
    $s=ereg_replace("\"","&quot;",$s);
    return $s;
}


Таким образом, запрос будет выглядеть так:
$query = "
INSERT INTO cats
SET
cat_name = '".strPrepare($_POST['cat_name'])."'
";

Да, забыл. ereg скоро не будет. Следует пользоваться preg-функциями. Поэтому это будет выглядеть так:
 
Код:
function strPrepare($s){
    $pat = array("/\\x22/", "/'/", "/</", "/>/");
    $rep = array("&quot;", "&#039;", "&lt;", "&gt;");
    return preg_replace($pat, $rep, $s);
}
2.0K
03 января 2006 года
Prokur
85 / / 13.10.2004
Ужас! Бедный MiKar :)
mfender, ты что-нибудь знаешь о дозировании информации? Вроде не похоже что ты это копировал откуда-то, но в любом случае зачем так много-то за один раз?

Маленькое замечание ко всему тобою написанному:
ни preg_replace, ни еreg_replace не стоит использовать в таких простых случаях. Есть в 10 раз быстрая функция str_replace.
15
03 января 2006 года
shaelf
2.7K / / 04.05.2005
Цитата:
Originally posted by Prokur
Ужас! Бедный MiKar :)
mfender, ты что-нибудь знаешь о дозировании информации? Вроде не похоже что ты это копировал откуда-то, но в любом случае зачем так много-то за один раз?

Маленькое замечание ко всему тобою написанному:
ни preg_replace, ни еreg_replace не стоит использовать в таких простых случаях. Есть в 10 раз быстрая функция str_replace.


На самом деле при входе достаточно mysql_escape_string(), а на выходе stripslashes(htmlspecialchars()).

8
03 января 2006 года
mfender
3.5K / / 15.06.2005
Цитата:
Originally posted by Prokur
Маленькое замечание ко всему тобою написанному:
ни preg_replace, ни еreg_replace не стоит использовать в таких простых случаях. Есть в 10 раз быстрая функция str_replace.


В таких случаях - да. Но есть же и более тяжёлые случаи... Например, найти слова по маске, или вообще проанализировать текст на наличие нежелательных фраз... Тут str_replace окажется помедленнее.
К тому же - куда спешить? Да и кто сказал, что str_replace быстрее, чем preg_replace? Можно ведь и замерить...

Цитата:

На самом деле при входе достаточно mysql_escape_string(), а на выходе stripslashes(htmlspecialchars()).


И чем это лучше однократного преобразования?

8
03 января 2006 года
mfender
3.5K / / 15.06.2005
Забавно... Взял большой текст и замерил время, за которое выполняется функция strPrepare (моя, где preg_replace), и такую же со str_replace сделал.
Результат:
0.001655 секунд - с preg_replace
0.002865 секунд - со str_replace

И где тут в 10 раз быстрее?
15
03 января 2006 года
shaelf
2.7K / / 04.05.2005
Цитата:
Originally posted by mfender
И чем это лучше однократного преобразования?


Что именно? И из чего приобразования? При ручной замене так же не забываем про %27 и иже с ним (mysql_escape_string() делает и это, в чём её глобальная разница с addslashes()).

8
03 января 2006 года
mfender
3.5K / / 15.06.2005
Цитата:
Originally posted by shaelf
Что именно? И из чего приобразования? При ручной замене так же не забываем про %27 и иже с ним (mysql_escape_string() делает и это, в чём её глобальная разница с addslashes()).


Блиндр...
А чем я не вариант привёл про #27? (он же $39)
Просто я забиваю в БД уже препарированный текст, с целью просто вывести его в бровзер с максимальной скоростью, а вы мне все пытаетесь впарить некие преобразования для того, чтобы их ещё раз преобразовывать в процессе вывода в поток. При этом ещё кто-то умудряется о каких-то прочитанных 1000 процентах прибыли рассуждать! Блиндр, ребята! Вы программисты, или теоретики? Вы книги читаете, или программируете?
Занимайтесь делом, в конце-концов....

15
03 января 2006 года
shaelf
2.7K / / 04.05.2005
Цитата:
Originally posted by mfender
Блиндр...
А чем я не вариант привёл про #27? (он же $39)
Просто я забиваю в БД уже препарированный текст, с целью просто вывести его в бровзер с максимальной скоростью, а вы мне все пытаетесь впарить некие преобразования для того, чтобы их ещё раз преобразовывать в процессе вывода в поток. При этом ещё кто-то умудряется о каких-то прочитанных 1000 процентах прибыли рассуждать! Блиндр, ребята! Вы программисты, или теоретики? Вы книги читаете, или программируете?
Занимайтесь делом, в конце-концов....


Наверное теоретики:). Я сейчас не об HTML, а об URL кодировки. где пробел = %20 "'" = %27 и т.д.. Просто беда в том, что MySQL одинаково хорошо воспринимает "%27" и "'" и для этого эта функция и была специально введена.

8
03 января 2006 года
mfender
3.5K / / 15.06.2005
Цитата:
Originally posted by shaelf
Просто беда в том, что MySQL одинаково хорошо воспринимает "%27" и "'" и для этого эта функция и была специально введена.


Старичуля, мы с тобой в году минувшем так пиффка и не попили....
У меня теория такова, что не стоит напрягать БД лишними вычислениями. Да и запросы выходят слишком громоздкими.
В последнее время все мордочки для работы с БД (даже MySQL) стараюсь писать в виде win=приложений, в основном на Delphi. И таким макаром полутшается толстый клиент... И всего-лишь сервант MySQL....

15
04 января 2006 года
shaelf
2.7K / / 04.05.2005
Цитата:
Originally posted by mfender
Старичуля, мы с тобой в году минувшем так пиффка и не попили....
У меня теория такова, что не стоит напрягать БД лишними вычислениями. Да и запросы выходят слишком громоздкими.
В последнее время все мордочки для работы с БД (даже MySQL) стараюсь писать в виде win=приложений, в основном на Delphi. И таким макаром полутшается толстый клиент... И всего-лишь сервант MySQL....


Готов исправить:). Пишу только на PHP (хотя сейчас из-за попытки перебраться на никсы пытаюсь подучивать Perl, забавный язык:)), поэтому до Delphi мне далековато (да и без него пока хватает). Этими исчислениями мы БД не как не напрягаем, т.к. это всё делаеться до входа. Эллементарниший пример получения POST'a

 
Код:
$test = mysql_escape_string($_POST['test']);
, всё, и не надо особо мудрить (если это строка и её не надо делить или особо фармотировать, т.к. это отдельный разговор). На выходе уже писал выше.
8
04 января 2006 года
mfender
3.5K / / 15.06.2005
Цитата:
Originally posted by shaelf
Готов исправить:). ... и не надо особо мудрить (если это строка и её не надо делить или особо фармотировать, т.к. это отдельный разговор).


Блиндр... Что-то давеча съел видимо много чего-то.... То-ли шампаньского много было, то-ли водки, то-ли пива.... Помню, что было много всего, а вот от чего забылся - не помню. Очнулся сейчас в кроватке ребёнка. Видимо, он меня спать и укладывал....
Прочитал свои записки... Неудобно...
Но я прав.
По-поводу mysql_escape_string - соглашусь, но в плане ООП реализация - не катит. А вдруг вся программа становится работать на MSSQL, или FB, или PgSQL? Что тогда делать с mysql_escape_string? Все скрипты, в которых это дело натыкано переписывать?
Извини, Старик, но у меня привычка мыслить абстрактно и объектно. Я лучше десять файлов с классами напишу, чем буду конкретизировать в одном всё и сразу.

15
04 января 2006 года
shaelf
2.7K / / 04.05.2005
Цитата:
Originally posted by mfender
Блиндр... Что-то давеча съел видимо много чего-то.... То-ли шампаньского много было, то-ли водки, то-ли пива.... Помню, что было много всего, а вот от чего забылся - не помню. Очнулся сейчас в кроватке ребёнка. Видимо, он меня спать и укладывал....
Прочитал свои записки... Неудобно...
Но я прав.
По-поводу mysql_escape_string - соглашусь, но в плане ООП реализация - не катит. А вдруг вся программа становится работать на MSSQL, или FB, или PgSQL? Что тогда делать с mysql_escape_string? Все скрипты, в которых это дело натыкано переписывать?
Извини, Старик, но у меня привычка мыслить абстрактно и объектно. Я лучше десять файлов с классами напишу, чем буду конкретизировать в одном всё и сразу.


В этом наше главное отличие:). Но, эта функция просто так названа была, а к MySQL она вообще не какого отношения не имеет, она просто подготавливает данные для записи в ДБ, не более того:). Меня название тоже иногда смущало, потом перестало. Знаю, это мой большой минус, что я привязан своими знаниями тольок к PHP and MySQL, но надеюсь в дальнейшем исправиться. Кстати, тут нашего товарища не видно. Ау, ааавтор, хоть бы ответил, помогли или нет.

9.6K
04 января 2006 года
MiKar
20 / / 06.11.2005
Конечно помогли! Огромное спасибо!
8
04 января 2006 года
mfender
3.5K / / 15.06.2005
Меня терзает вопрос: а где же Prokur, утверждающий, что str-функции работают на 1000% производительнее, нежели preg?
15
04 января 2006 года
shaelf
2.7K / / 04.05.2005
Цитата:
Originally posted by mfender
Меня терзает вопрос: а где же Prokur, утверждающий, что str-функции работают на 1000% производительнее, нежели preg?


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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог