PDA

View Full Version : правильное обращение к бд или проблема с модулем


Alie
29.08.2006, 04:10
Решила прописать свой модуль. В нём одна из частей (switch) представляет собой бланк для заказа услуг.
Ребята, у меня такой вопрос:
с самим модулем я разобралась, а вот как правильно загнать информацию в ДБ и отобразить её на другой странице?
Заодно подскажите какую таблицу нужно создать в MySQL
Необходимая информация -
Имя (простое поле ввода), мыло (простое поле ввода), исполнитель заказа (выбрать с помощью checkbox одного из трёх), суть заказа (подробное описание в textarea).

Всю страницу писать не буду, выставлю только необходимый switch пункт (если потребуется вся страница - сообщите и я выставлю здесь-же):


function send (){

echo "<br>";
OpenTable();
echo"

<form method=\"post\" action=\"\">
<table border=0 width=80% cellpadding=8>
<tr>
<td><b>Ваше имя:</b></td>
<td align=left>
<input type=text name=\"orderfrom\" maxlength=20>
</td>
</tr>
<tr>
<td><b>E-Mail:</b></td>
<td align=left>
<input type=text name=\"EMail\" maxlength=80>
</td>
</tr>
<tr>
<td><b>Выберите мастера:</b></td>
<td>
<input type=checkbox name=\"orderto\" value=\"master_fir\" />Мастер 1
<br />
<input type=checkbox name=\"orderto\" value=\"master_sec\" />Мастер 2
<br />
<input type=checkbox name=\"orderto\" value=\"master_thi\" />Мастер 3 эффектов Хельги
<br />
</td>
</tr>
<tr>
<td><b>Тип заказа:</b></td>
<td><input type=checkbox name=\"ordertype\" value=\"coat\" />Услуга 1
<br />
<input type=checkbox name=\"ordertype\" value=\"portreit\" />Услуга 2
<br />
<input type=checkbox name=\"ordertype\" value=\"avatar\" />Услуга 3
<br />
<input type=checkbox name=\"ordertype\" value=\"user\" />Услуга 4
<br />
</td>
</tr>
<tr>
<td><b>Описание работы:</b></td>
<td>
<textarea cols=\"50\" rows=\"8\" name=\"ordertext\">
</textarea>
</td>
</tr>
<tr>
<td colspan=2>
<input type=radio value=\"Accept_rules\" name=\"rules\"> - С правилами согласен.<p>
<input type=radio checked value=\"Ignore_Rules\" name=\"rules\"> - С правилами не согласен.
</td>
</tr>
<tr>
<td>
<div align=\"right\"><input type=submit value=\"Заказать\"></div>
</td>
<td>
<div align=\"left\"><input type=\"reset\" name=\"reset\" value=\"Сброс\"></div>
</td>
</tr>
</table>
</form>


</b></center><br>";
CloseTable();
echo "<br>";

}


Может я чего не дописала, забыла - укажите на ошибки плз.
Заранее огромное спасибо всем, кто откликнется :wink:

Soniks
31.08.2006, 13:06
Alie делайте по аналогии с каким нибудь другим модулем
т.е. должена быть обработ ка данных поступаемых через POST и запись в БД:


$db->sql_query("INSERT INTO ".$prefix."_order (id, name, email, type, master, order) VALUES(NULL, '". $_POST['orderfrom']."', '". $_POST['EMail']."', '". $_POST['ordertype']."', ". $_POST['orderto']."', '". $_POST['ordertext']."')");

соответственно нужно создать таблицу в БД, например так:

CREATE TABLE nuke_order (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 250 ) NOT NULL ,
`email` VARCHAR( 250 ) NOT NULL ,
`type` VARCHAR( 250 ) NOT NULL ,
`master` VARCHAR( 250 ) NOT NULL ,
`order` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
);

Alie
04.09.2006, 19:49
Большое спасибо за ответ!
Ещё парочка мелких вопросов по этому поводу: первым делом - "id" - что это? Как я понимаю - это номер. Только вот чего?
Второй вопрос: какой строкой я вывожу данные из БД?

$result=mysql_query("SELECT orderfrom,ordermail,orderto,ordertype,ordertext FROM ".$prefix."_ordering");
while ($row=mysql_fetch_row($result))
echo " &row[0,1,2,3,4]";

Правильный-ли это способ, может есть получше?

Третий вопрос: как обезопасить поля ввода от инъекций? Что именно мне нужно прописать?

Все эти вопросы я задаю чтоб понять как ПРАВИЛЬНО и НАИЛУЧШИМ образом писать модули. Если вы сможете привести в качестве примера одну строку со всеми возможностями:
ввод данных в MySQL, вывод данных, создание админки для данных.

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

Я понимаю что последний вариант слишком "напрягает", но всё-же, если у кого-нибудь из желающих дойдут руки - буду только рада. Коментарии в файлах так-же приветствуются: чем больше - тем лучше.
Такой примерчик кстати неплохо поместить в вашу школу будет. :wink:

Заранее спасибо за ответ!

Alexander-V-Sh
04.09.2006, 22:46
Alie
id - номер записи, ставится автоматически.
Првильный способ:

$result = $db->sql_query("SELECT orderfrom,ordermail,orderto,ordertype,ordertext FROM ".$prefix."_ordering");
while ($row = $db->sql_fetchrow($result)) {
$orderfrom = filter($row['orderfrom']); //назначение переменным данных их БД
---и т.д все строки из базы
echo "$orderfrom";
}

Для безопастности использовать фильтры.
Для цифр
$id = intval($id);
Для данных без хтмл
$title = filter($title, "nohtml");
Для данных с хтмл
$title = filter($title);

Например если ты делаешь запрос в базу:
$result = $db->sql_query("SELECT orderfrom,ordermail,orderto,ordertype,ordertext FROM ".$prefix."__ordering WHERE id='$id'");
А переменная $id - цифра, то и определить ее нужно как цифру перед этим: $id = intval($id);
Обязательно фильтровать все пользовательские вводимые данные, которые записываются в БД (да и вообще все переменные, которые пишутся в базу и выводяться). Чтобы вместо текста простого не вписали что то нехорошее :)
А так же прочитай про безопастность.

Модуль с одной строкой как нибудь выложу, я себе писал для анекдотов. Но его сперва нужно под общую нюку переделать...
А хорошим примером послужат примеры модулей с самой нюки. В самодельных и старых модулях много ошибок попадается. Посмотри как сделаны модули, как сделана админка, как идут запросы и т.д. Что непонятно спрашивай, ищи ответы на форуме или читай статьи.

Alie
05.09.2006, 02:03
2 Alexander-V-Sh: первым делом - спасибо за оперативность и за подсказку.

Просьба подготовить столь специфический модуль у меня зародилась тогда, когда я собственноручно пыталась разобратся с каким-то файлом нюки. Возьмём простой пример: для того, чтоб полностью понять суть того-же запроса к БД, о котором говорилось выше, нужно предварительно "очистить" файл от огромного количества "шелухи" (графика, ненужные нам функции и т.п.). Лично я, работая по приведённому мной в пример методу - допускаю ошибки при написании и\или удалении кода, что приводит к полному отключению модуля. Причём причину мы сможем понять только предварительно обнаружив опечатку. В противном случае, вполне вероятно, что опечатка будет принята за неправильно описаную функцию.
Кому я это обьясняю? Вы и так всё прекрасно понимаете ведь тоже когда-то начинали "с нуля"... :smile:

Если выставите файл - укажите на форуме в какую категорию он будет залит...