Обработка простенькой формы
Вот такой код:
<?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?
Заранее благодарен,
Михаил.
Как и где объявить переменную 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. Но я предпочитаю использовать таку функцию:
{
$s=ereg_replace("'","'",$s);
$s=ereg_replace("<","<",$s);
$s=ereg_replace(">",">",$s);
$s=ereg_replace("\"",""",$s);
return $s;
}
Таким образом, запрос будет выглядеть так:
$query = "
INSERT INTO cats
SET
cat_name = '".strPrepare($_POST['cat_name'])."'
";
Да, забыл. ereg скоро не будет. Следует пользоваться preg-функциями. Поэтому это будет выглядеть так:
$pat = array("/\\x22/", "/'/", "/</", "/>/");
$rep = array(""", "'", "<", ">");
return preg_replace($pat, $rep, $s);
}
mfender, ты что-нибудь знаешь о дозировании информации? Вроде не похоже что ты это копировал откуда-то, но в любом случае зачем так много-то за один раз?
Маленькое замечание ко всему тобою написанному:
ни preg_replace, ни еreg_replace не стоит использовать в таких простых случаях. Есть в 10 раз быстрая функция str_replace.
Ужас! Бедный MiKar :)
mfender, ты что-нибудь знаешь о дозировании информации? Вроде не похоже что ты это копировал откуда-то, но в любом случае зачем так много-то за один раз?
Маленькое замечание ко всему тобою написанному:
ни preg_replace, ни еreg_replace не стоит использовать в таких простых случаях. Есть в 10 раз быстрая функция str_replace.
На самом деле при входе достаточно mysql_escape_string(), а на выходе stripslashes(htmlspecialchars()).
Маленькое замечание ко всему тобою написанному:
ни preg_replace, ни еreg_replace не стоит использовать в таких простых случаях. Есть в 10 раз быстрая функция str_replace.
В таких случаях - да. Но есть же и более тяжёлые случаи... Например, найти слова по маске, или вообще проанализировать текст на наличие нежелательных фраз... Тут str_replace окажется помедленнее.
К тому же - куда спешить? Да и кто сказал, что str_replace быстрее, чем preg_replace? Можно ведь и замерить...
На самом деле при входе достаточно mysql_escape_string(), а на выходе stripslashes(htmlspecialchars()).
И чем это лучше однократного преобразования?
Результат:
0.001655 секунд - с preg_replace
0.002865 секунд - со str_replace
И где тут в 10 раз быстрее?
И чем это лучше однократного преобразования?
Что именно? И из чего приобразования? При ручной замене так же не забываем про %27 и иже с ним (mysql_escape_string() делает и это, в чём её глобальная разница с addslashes()).
Что именно? И из чего приобразования? При ручной замене так же не забываем про %27 и иже с ним (mysql_escape_string() делает и это, в чём её глобальная разница с addslashes()).
Блиндр...
А чем я не вариант привёл про #27? (он же $39)
Просто я забиваю в БД уже препарированный текст, с целью просто вывести его в бровзер с максимальной скоростью, а вы мне все пытаетесь впарить некие преобразования для того, чтобы их ещё раз преобразовывать в процессе вывода в поток. При этом ещё кто-то умудряется о каких-то прочитанных 1000 процентах прибыли рассуждать! Блиндр, ребята! Вы программисты, или теоретики? Вы книги читаете, или программируете?
Занимайтесь делом, в конце-концов....
Блиндр...
А чем я не вариант привёл про #27? (он же $39)
Просто я забиваю в БД уже препарированный текст, с целью просто вывести его в бровзер с максимальной скоростью, а вы мне все пытаетесь впарить некие преобразования для того, чтобы их ещё раз преобразовывать в процессе вывода в поток. При этом ещё кто-то умудряется о каких-то прочитанных 1000 процентах прибыли рассуждать! Блиндр, ребята! Вы программисты, или теоретики? Вы книги читаете, или программируете?
Занимайтесь делом, в конце-концов....
Наверное теоретики:). Я сейчас не об HTML, а об URL кодировки. где пробел = %20 "'" = %27 и т.д.. Просто беда в том, что MySQL одинаково хорошо воспринимает "%27" и "'" и для этого эта функция и была специально введена.
Просто беда в том, что MySQL одинаково хорошо воспринимает "%27" и "'" и для этого эта функция и была специально введена.
Старичуля, мы с тобой в году минувшем так пиффка и не попили....
У меня теория такова, что не стоит напрягать БД лишними вычислениями. Да и запросы выходят слишком громоздкими.
В последнее время все мордочки для работы с БД (даже MySQL) стараюсь писать в виде win=приложений, в основном на Delphi. И таким макаром полутшается толстый клиент... И всего-лишь сервант MySQL....
Старичуля, мы с тобой в году минувшем так пиффка и не попили....
У меня теория такова, что не стоит напрягать БД лишними вычислениями. Да и запросы выходят слишком громоздкими.
В последнее время все мордочки для работы с БД (даже MySQL) стараюсь писать в виде win=приложений, в основном на Delphi. И таким макаром полутшается толстый клиент... И всего-лишь сервант MySQL....
Готов исправить:). Пишу только на PHP (хотя сейчас из-за попытки перебраться на никсы пытаюсь подучивать Perl, забавный язык:)), поэтому до Delphi мне далековато (да и без него пока хватает). Этими исчислениями мы БД не как не напрягаем, т.к. это всё делаеться до входа. Эллементарниший пример получения POST'a
Готов исправить:). ... и не надо особо мудрить (если это строка и её не надо делить или особо фармотировать, т.к. это отдельный разговор).
Блиндр... Что-то давеча съел видимо много чего-то.... То-ли шампаньского много было, то-ли водки, то-ли пива.... Помню, что было много всего, а вот от чего забылся - не помню. Очнулся сейчас в кроватке ребёнка. Видимо, он меня спать и укладывал....
Прочитал свои записки... Неудобно...
Но я прав.
По-поводу mysql_escape_string - соглашусь, но в плане ООП реализация - не катит. А вдруг вся программа становится работать на MSSQL, или FB, или PgSQL? Что тогда делать с mysql_escape_string? Все скрипты, в которых это дело натыкано переписывать?
Извини, Старик, но у меня привычка мыслить абстрактно и объектно. Я лучше десять файлов с классами напишу, чем буду конкретизировать в одном всё и сразу.
Блиндр... Что-то давеча съел видимо много чего-то.... То-ли шампаньского много было, то-ли водки, то-ли пива.... Помню, что было много всего, а вот от чего забылся - не помню. Очнулся сейчас в кроватке ребёнка. Видимо, он меня спать и укладывал....
Прочитал свои записки... Неудобно...
Но я прав.
По-поводу mysql_escape_string - соглашусь, но в плане ООП реализация - не катит. А вдруг вся программа становится работать на MSSQL, или FB, или PgSQL? Что тогда делать с mysql_escape_string? Все скрипты, в которых это дело натыкано переписывать?
Извини, Старик, но у меня привычка мыслить абстрактно и объектно. Я лучше десять файлов с классами напишу, чем буду конкретизировать в одном всё и сразу.
В этом наше главное отличие:). Но, эта функция просто так названа была, а к MySQL она вообще не какого отношения не имеет, она просто подготавливает данные для записи в ДБ, не более того:). Меня название тоже иногда смущало, потом перестало. Знаю, это мой большой минус, что я привязан своими знаниями тольок к PHP and MySQL, но надеюсь в дальнейшем исправиться. Кстати, тут нашего товарища не видно. Ау, ааавтор, хоть бы ответил, помогли или нет.
Меня терзает вопрос: а где же Prokur, утверждающий, что str-функции работают на 1000% производительнее, нежели preg?
Об этом все пишут (включая оф сайты). Возможно тут + ко всему имееться ввиду нагрузка на сервер.