Главная страница статей --> Хитрости при программировании php, заметки по базам данных

Делаем простейшее подобие интернет-магазина.

Источник: realcoding.net

Хотя, конечно, вернее будет назвать это "система заказа товаров на сайте".
Но, глядя на сайты многочисленных российских фирм, которые работают
именно по такому принципу (www.dostavka.ru, www.depo.ru, www.wstore.ru),
мы тоже с пафосом назовем набор простеньких скриптов "ИНТЕРНЕТ-МАГАЗИН".
Что для этого потребуется: любой web-сервер, поддерживающий работу с cgi.
Вполне подойдет apache, eserv, pws. Установленный php версий 3.0.х - 4.0.х,
установленный сервер баз данных mysql (хотя, не имеет значения какой именно -
но этот пример написан исходя из того, что установлен именно mysql).
Платформа не имеет особого значения. Это будет работать и на win32, и на unix.
Что мы хотим получить: чтобы пользователи, путешествуя по нашему сайту,
могли заказать интересующие их товары, и чтобы этот заказ попал к нам в руки.
А дальше уже начинается обычная работа менеджеров.
Определим задачи:
1) Каждый пользователь при заходе на сайт должен получить уникальный идентификатор.
Мы же должны знать кто именно заказывает товары?
2) Для каждого пользователя у нас должна хранится виртуальная "корзина",
где будет учитываться что заказано и в каком кол-ве.
3) В конце концов, весь заказ отправляется по e-mail менеждеру (с информацией кто, когда,
что и сколько заказал) и самому пользователю сделавшему заказ.

Начинаем.

Делаем таблицы для базы данных товаров. Здесь нужна оговорка - идеальный случай,
если у вас каждый товар имеет свой уникальный код.
По всем правилам именно так и должно быть.
У вас не так? Сделайте поле auto_increment - сильно облегчите жизнь.
Вообщем, будем счиатать что с базой товаров у Вас все ок.
Для определенности, рассмотрим самый простой случай - у вас всего одна таблица с
примерно такой структурой:

create table main (
id varchar(20) not null,
manufacture varchar(255),
name varchar(255) not null,
price double(8,2) default 0.00 not null,
primary key (id)
);

insert into main values ( 1002575, manuf_1, tovar 1, 150.21);
insert into main values ( 125575, manuf_1, tovar 2, 254.02);
insert into main values ( 1255757, manuf_1, tovar 3, 456.24);
insert into main values ( 4556852, manuf_2, tovar 1, 75.24);
insert into main values ( 15957725, manuf_2, tovar 2, 5721.01);
insert into main values ( 5732548, manuf_2, tovar 3, 685.49);

Но никакой разницы принципиальной нет, конечно же.
1) Делаем файл, в котором у нас каждому пользователю присваивается идентификатор:

Файл cookie.php3

<?
if (isset (
$cookie_tmp))
{
$uid = $cookie_tmp; }
else {
srand(time());
$uid = md5(uniqid( ));
setcookie ( cookie_tmp,$uid,time()+604800, /); }
?>

Этим мы устанавливаем файл cookie с именем cookie_tmp, значением $uid
и временем жизни 1 неделя с настоящего момента.
Этот файл вставляем ДО вывода ЛЮБЫХ тэгов html на все (или на какие надо)
страницы нашего сайта:

<?php require (cookie.php3); ?>

Если Вас не прельщает использование файлов cookie можно таскать
этот самый $uid по всему сайту через строку запроса или скрытые поля формы...

2) Делаем таблицу для хранения "корзины" заказов:

create table shop_tmp (
id int(20) default 0 not null auto_increment,
uid varchar(50) default 0 not null,
activated int(14) default 0 not null,
goods_id int(20) default 0 not null,
goods text not null,
price double(8,2) default 0.00 not null,
quantity smallint(6) default 0 not null,
summa double(8,2) default 0.00 not null,
primary key (id)
);

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

2.1) Делаем файл который добавляет в эту нашу таблицу информацию:

Файл add.php3

<html><body>

<
div align=center>Добавление товаров в корзину</div>

<
table border=1 align=center>
<
tr>
<
td>Производитель</td>
<
td>Наименование товара</td>
<
td>Цена</td>
</
tr>

<?
php

require ( connect.php3);

$result = mysql($dbname, select * from main where id=$id );
$manufacture = mysql_result($result,0, manufacture);
$name = mysql_result($result,0, name);
$price = mysql_result($result,0, price);
?>

<tr>

<td> <? echo $manufacture; ?></td>
<td> <? echo $name; ?></td>
<td> <? echo $price; ?> руб.</td>

</tr></table>

<form action=basket.php3 method=post>

<div align=center>
<p>Количество
<input type=text name=quantity value=1 maxlength=4> шт.
<input type=submit name=add value=Добавить в корзину>
</p>
</div>
<input type=hidden name=goods_id value= <? echo $id; ?>>
<input type=hidden name=goods value= <? echo $manufacture $name; ?>>
<input type=hidden name=price value= <? echo $price; ?>>
<input type=hidden name=uid value= <? echo $uid; ?>>

</form></body></html>

2.2) С учетом этого, теперь наш файл который выводит информацию
из базы данных выглядит примерно так:

Файл show.php3

<?php require ( cookie.php3); ?>
<html>
<head>
<script language=javascript>
function basket(url) { bag = window.open(url,basket,toolbar=no,location=no,status=no,
menubar=no,scrollbars=yes,width=600,height=300,resizable=yes); bag.focus();}
</script>
</head>
<body>

<table border=1>

<?php
require ( connect.php3);

$sql = select * from main order by manufacture, name;

$result = mysql($dbname,$sql);
$num = mysql_num_rows($result);
$i = 0;

while(
$i<$num) {

$id=mysql_result($result,$i, id);
$manuf=mysql_result($result,$i, manufacture);
$name=mysql_result($result,$i, name);
$price=mysql_result($result,$i, price);

echo
<tr>n
<td>$manuf</td>n
<td>$name</tdn>
<td>$price </td>n
<td><a href=
javascript:basket(add.php3?uid=$uid&id=$id)>Заказ</a></td>n
</tr>
;
$i++;
}

?>

</table>
</body></html>

2.3) Делаем файл basket.php3 - он у нас ответственный за добавление записей
в корзину и просмотр этой корзины:

Файл basket.php3

<? require ( cookie.php3); ?>

<html>
<head>
<body>

<div align=center><p>Содержимое вашей корзины</p></div>

<table border=1 align=center>
<tr>
<td>Наименование товара</td>
<td>Цена</td>
<td>Кол-во</td>
<td>Сумма</td>
<td>Удалить</td>
</tr>

<?php
$table_4
= shop_tmp;

echo
<form method=post action=$php_self>;

$summa = $price*$quantity;
$activated = time();

Добавление товаров в корзину

function add() {

global
$uid, $activated, $goods, $price, $quantity, $summa, $goods_id, $table_4;
require (
connect.php3);

$result = mysql($dbname, select * from $table_4 where (goods_id=$goods_id) and (uid=$uid) );
$num = mysql_num_rows($result);

if (
$num > 0) // значит такой товар в корзине уже есть и надо увеличить кол-во и сумму
{
$result_1=mysql($dbname, select * from $table_4 where (goods_id=$goods_id) and (uid=$uid) );

$quantity_table=mysql_result($result_1,0, quantity);
$price=mysql_result($result_1,0, price);

$quantity_total=$quantity_table+$quantity;
$summa_total=$quantity_total*$price;

$sql= update $table_4 set quantity=$quantity_total, summa=$summa_total
where goods_id=$goods_id and uid=$uid
;
mysql_db_query($dbname,$sql);
}

else
// такого товара для этого пользователя еще нет - просто добавляем
{

$sql_insert = insert into $table_4 (id,uid,activated,goods,price,quantity,summa,goods_id)
values (,$uid,$activated,$goods,$price,$quantity,$summa,$goods_id)
;

mysql($dbname,$sql_insert);
}

view(); // добавили и вызывваем функцию для просмотра корзины
}

function
delete() {
global
$id, $table_4;
require (
connect.php3);
$result = mysql($dbname, delete from $table_4 where (id=$id));
view();
}

function
delete_all() {
global
$uid, $table_4;
require (
connect.php3);
$result = mysql($dbname, delete from $table_4 where (uid=$uid));
view();
}

function
view() {
global
$uid, $activated, $table_4;
require (
connect.php3);

$result = mysql($dbname, select * from $table_4 where (uid=$uid) order by goods );
$num = mysql_num_rows($result);

if (
$num == 0) {
echo
<tr>;
echo
<td colspan=5 align=center><p>В Вашей корзине нет ни одного товара! </td></tr>;
}

else {

$total=0.00;
$i=0;

while(
$i<$num)
{
$goods=mysql_result($result,$i, goods);
$goods_id=mysql_result($result,$i, goods_id);
$quantity=mysql_result($result,$i, quantity);
$id=mysql_result($result,$i, id);
$price=mysql_result($result,$i, price);
$summa=mysql_result($result,$i, summa);

echo
<tr>n
<td> $goods </td>n
<td> $price </td>n
<td> $quantity шт. </td>n
<td> $summa </td>n
<td> <a href=basket.php3?action=delete&id=$id&uid=$uid>Удалить</a></td>n
</tr>n
;

$total=$summa+$total;
$i++;

}

}
echo
<tr>
<td colspan=5 align=center><p>Общая сумма заказа - $total руб.</td></tr>
;
}

if (
$add)
{
add(); }

elseif (
$action== delete) {delete(); }

elseif (
$empty) {delete_all(); }

else {
view(); }


?>
</table></form>


<div align=center><br>

<form method=post action=order.php3>
<input type=hidden name=uid value= <? echo $uid; ?>>
<input type=submit name=order value=Оформить заказ>
</form>

<? echo <form method=post action=$php_self>; ?>
<input type=hidden name=uid value= <? echo $uid; ?>>
<input type=submit name=empty value=Очистить корзину>
</form>

</div>
</body>
</html>
================================================================

3) Теперь осталось сформировать текст письма:

Файл order.php3

<html>
<
head>
<
body>
<
form name=order action=end.php3 method=post>
Ваше имя и фамилия <input type=text name=name size=40 maxlength=60><br>
e-mail <input type=text name=email size=40 maxlength=40><br>

<
center> Сейчас заказаны следующие позиции: </center>

<
table border=1 align=center>
<
tr>
<
td>Артикул товара</td>
<
td>Наименование товара</td>
<
td>Цена</td>
<
td>Кол-во</td>
<
td>Сумма</td>
</
tr>

<?
php
{
$table_4 = shop_tmp;

require (
connect.php3);

$result = mysql($dbname, select * from $table_4 where (uid=$uid) );
$num = mysql_numrows($result);

if (
$num == 0) {
echo
<tr>;
echo
<td colspan=5>В Вашей корзине нет ни одного товара! </td></tr>;
}

else {
$body = ;
$total=0;
$i=0;

while(
$i<$num)
{
$goods=mysql_result($result,$i, goods);
$price=mysql_result($result,$i, price);
$goods_id=mysql_result($result,$i, goods_id);
$quantity=mysql_result($result,$i, quantity);
$id=mysql_result($result,$i, id);
$summa=mysql_result($result,$i, summa);
$total=$total+$summa;


$body_1= <tr><td> $goods_id </td> <td> $goods </td><td> $price руб.</td>
<td>$quantity шт.</td><td> $summa руб.</td></tr>
;

echo
$body_1;

$body .= $body_1;

$i++;
}

}

$body = htmlspecialchars ($body);

echo
<tr>
<td colspan=5 align=center>Общая сумма заказа - $total руб. </td></tr>
<input type=hidden name=total value=$total>
<input type=hidden name=body value=
$body>
<input type=hidden name=uid value=$uid>
;
}

?>
</table>
<br>
<div align=center><input type=submit name=submit value=Закончить оформление заказа></div>
</form>
</body></html>

4) ... и отправить письма (клиенту и менеджеру)
Да, необходимый комментарий. Я на первой странице своего сайта
указывал что это просто СОВЕТЫ, а никак не готовые решения.
И что необходимо почитать кое-что еще прежде чем браться за написание.
В данном случае, я намекаю на статью "приемы безопасного программирования на php".
Вот посмотрите листинг следующего файла и прочитайте то,
о чем я говорю - сразу станет ясно где дыра...

Файл end.php3

<?
if (
$name == ) {
echo
Вы не указали свое имя!;
exit; }

elseif (
$email == ) {
echo
Вы не указали адрес email!;
exit;}

else
{

//$message & $header - это для отправки менеджеру
//$message_1 & $header_1 - это для отправки клиенту

$message= <html><body><font size=+1><p align=justify>
Новый заказ с сайта www.nnn.net.<br>
Сведения о покупателе:<br> Имя - $name<br>
Компания - $company<br> Телефон - $phone<br>
e-mail - $email<br><br>
Содержание заказа:<br><br>
<table border=1> $body
<tr><td colspan=5><b> Всего на сумму - $total руб.</b></td></tr>
</table></font></p></body></html>
;

$header= to: info@nnn.netnfrom: mail-robot@nnn.netnreply-to: $emailnx-mailer:
php auto-mailerncontent-type: text/html;nmime-version: 1.0n
;

$message_1= <html><body><font size=+1><p align=justify>
Уважаемый $name!n На сайте фирмы nnn (www.nnn.net) Вами был сделан заказ:
<br><br>
<table border=1> $body
<tr><td colspan=5><b> Всего на сумму - $total руб.</b></td></tr>
</table><br>
Наши менеджеры свяжутся с Вами в самое ближайшее время для уточнения деталей.
Спасибо.
</font></p></body></html>
;

$header_1= to: $emailnfrom: mail-robot@nnn.netnreply-to: info@nnn.netnx-mailer:
php auto-mailerncontent-type: text/html;nmime-version: 1.0n
;

@
mail( info@nnn.net, order from nnn web site, $message, $header);
@
mail($email, order from nnn web site, $message_1, $header_1);

echo
<h4>Уважаемый <b>$name</b>! Ваш заказ принят.
Менеджер нашей фирмы свяжется с Вами в ближайшее время для уточнения деталей.<br>
Спасибо за посещение нашего сайта!</h1>n
;
}
?>

Ну что? Разумеется, опасность в том, что этому скрипту можно подсунуть
ЛЮБЫЕ данные и он их отправит спокойно..
Выход: не пересылать с предыдущей страницы содержимое заказа,
а формировать его непосредственно в этом скрипте.
Вообще, надо стараться таскать за собой как можно меньше данных.
Также, НИКОГДА не повредит проверка того, с какой страницы пришел запрос.
5) Все. Мы получили все что хотели. Теперь осталось только сделать функцию
которая будет чистить таблицу shop_tmp от старых заказов. Но это уже сами.

6) Перед всеми операциями с базой данных вызывается файл
для соединения с базой данных такого вида:

Файл connect.php3

<?php
{
$dbname = test;
$host = localhost;
$port = 3306;
$user = root;
$password = ;

mysql_connect($host,$user,$password);
mysql_select_db($dbname) or die( unable to select database);
}

?>

ps. Еще раз повторяю - все что здесь написано я проверил -
ЭТО работает. Если у вас не так - вы просто что-то неправильно сделали...
pps. По просьбам трудящихся, дописан пункт 4.
И немного поправлен пункт три..



Похожие статьи:
- Сайт по кирпичикам или все о SSI
- Эмуляция директивы register_globals on
- Анализ посещаемости сайта рефералами
- SSI для бедных
- Защита сайта от скачивания
- Справочник по мета тегам
- AJAX? Atlas!
- MySQL для пользователя
- Использование команды UNION
- Безопасность при работе с WebMoney
- Движок для сайта своими руками. Часть вторая
- Пишем простейший текстовой счётчик
- Критерии выбора СУБД при создании информационных систем


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.001]