[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Web - программирование / PHP /

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


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




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Web - программирование / PHP /

GTK+: перспективы развития
02-03-2010   

Библиотека GTK+ прошла долгий путь развития и сейчас очень популярна. GNOME, одна из ведущих оконных сред, использует GTK+ почти исключительно, GIMP построен на GTK+, множество коммерческих разработчиков ПО, таких как Abobe, NVidia и VMware, решили использовать эту библиотеку в качестве графической основы для своих продуктов... подробнее

Кол. просмотров: общее - 4393 сегодня - 0

Новостной портал
13-11-2009   

Slashdot.org – популярный новостной портал с посещаемостью 50 млн. человек в месяц. Авторы проекта добились такого успеха, предоставляя пользователям свежие и интересные новости из мира IT... подробнее

Кол. просмотров: общее - 4286 сегодня - 0

Параллельное выполнение скриптов может нарушить целостность информации в файлах
13-11-2009   

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

Кол. просмотров: общее - 4102 сегодня - 0

No spam.php
10-11-2009   

...и снова о спаме. Кто о нем только не писал, и все писали, что это плохо и ай-яй-яй. Я не буду оригинальничать, и тоже скажу – это плохо. Это ай-яй-яй. Как бороться со спамерами со своей стороны... подробнее

Кол. просмотров: общее - 4148 сегодня - 0

Начинаем работу с рисунками в php для Windows
10-11-2009   

Эта статья даст вам общее представление о том, как создавать, обрабатывать и выводить рисунки в PHP4 для Windows... подробнее

Кол. просмотров: общее - 4134 сегодня - 0



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects