Информационные технологииStfw.Ru 🔍

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

🕛 25.10.2006, 15:48
Хотя, конечно, вернее будет назвать это "система заказа товаров на сайте".
Но, глядя на сайты многочисленных российских фирм, которые работают
именно по такому принципу (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.
И немного поправлен пункт три..

PHP   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉