Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: форма заказа
 
 автор: Dizels   (13.07.2009 в 22:46)   письмо автору
 
 

Добрый вечер.
Тренируюсь и осваиваю php. Поставил перед собой задачу написать форму заказа. Есть следующие поля:

Кол-во:
Способ оплаты:
Способ доставки:
Итого к оплате:

К примеру, 1шт. стоит 18 у.е.
Способ оплаты:
- 1 способ
- 2 способ (предоставляется скидка 2%)
Способ доставки (есть 3 варианта):
-почта (5 у.е.)
-авиапочта (15 у.е.)
-курьер (8 у.е.)

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

Прошу помочь с тем, как это реализовать, а то пока чего-то не понимаю как это сделать.

Пока у меня реализовано все так:
1. В файле buy.php - форма заказа данные из которой передаются в zakaz.php
2. В файле zakaz.php происходит обработка данных и их последующая запись в БД.

Все работает, но как просчитать итоговую стоимость - не понимаю.

  Ответить  
 
 автор: Trianon   (13.07.2009 в 23:00)   письмо автору
 
   для: Dizels   (13.07.2009 в 22:46)
 

ну а файлы-то почему не показываете?
Или все эти данные предполагается извлечь из БД для составления окончательного отчета по заказу?
Тогда дамп чтоли приведите...

способы оплат и способы доставок заданы жестко или таблицами в БД описаны?

  Ответить  
 
 автор: Dizels   (13.07.2009 в 23:23)   письмо автору
 
   для: Trianon   (13.07.2009 в 23:00)
 

Ну файлы там стандартные.
файл: buy.php
<form name="form" action="zakaz.php" method="post">
<table cellspacing="7">
                                    <tr>
                                        <td><p class="text">Кол-во:</p></td>
                                        <td><input size="3" type="text" name="kolvo" value="1"> шт.</td>
                                    </tr>
                                    <tr>
                                        <td><p class="text">Способ оплаты:</p></td>
                                        <td>
                                            <input type="radio" name="money" value="webmoney">WebMoney (скидка 2%)<Br>
                                            <input type="radio" name="money" value="yandexmoney">ЯндексДеньги<Br>                                        
                                        </td>
                                    </tr>
                                    <tr>
                                        <td><p class="text">Способ доставки:</p></td>
                                        <td>
                                            <input type="radio" name="dostavka" value="1">1 вариант<Br>
                                            <input type="radio" name="dostavka" value="2">2 вариант<Br>                                            
                                        </td>
                                    </tr>
                                    
                                    <tr>
                                        <td><p class="text">Итого к оплате:</p></td>
                                        <td><input size="3" type="text" name="price">грн.</td>
                                    </tr>
                                    <tr>
                                        <td></td>
                                        <td><input class="button" type="submit" value="Заказать"></td>
                                    </tr>
                                </table>            

                </form>

Файл zakaz.php:
<?php

// Выставляем уровень обработки ошибок
Error_Reporting(E_ALL & ~E_NOTICE); 

// Устнавливаем соединение с базой данных
include "config.php";

// Проверим - достаточно ли информации для занесения в базу данных
if(empty($_POST['kolvo'])) links("Отсутствует title");
if(empty(
$_POST['money'])) links ("Выберите способ оплаты");
if(empty(
$_POST['dostavka'])) links ("Выберите способ доставки");
//if(empty($_POST['price'])) links ("Не высчитана общая стоимость заказа - обратитесь в тех. поддержку");

$kolvo $_POST['kolvo'];
$money $_POST['money'];
$dostavka $_POST['dostavka'];
$price $_POST['price'];

echo 
"$kolvo$money$dostavka$price";    
// Формируем и выполняем SQL-запрос на добавление заказа
$query "INSERT INTO zakaz VALUES (NULL,
                                    
$kolvo,
                                    '
$money',
                                    '
$dostavka',                                    
                                    
$price);";
if(
mysql_query($query))
    {
        
// Осуществляем автоматический переход на страницу с данными о заказе
        
echo "<HTML><HEAD>
                <META HTTP-EQUIV='Refresh' CONTENT='0; URL=rezult.php'>
                </HEAD>"
;
    }
else 
links("Ошибка при добавлении новой записи в базу данных");
// Небольшая вспомогательная функция для вывода
// сообщений в окно браузера
function links($msg)
    {
        echo 
"<p>".$msg."</p>";
        exit();
    }
?>

Вот но нужно, чтобы в файле buy.php автоматически высчитывалась общая стоимость заказа.

способы оплат и способы доставок заданы жестко

  Ответить  
 
 автор: buldovsky   (13.07.2009 в 23:28)   письмо автору
 
   для: Dizels   (13.07.2009 в 23:23)
 


<?php

// $price - расчитываем в зависимости от количества товаров голую стоимость

// взависимости от того какая оплата выбрана устанавливаем скидку
switch ($oplata) :
   case 
"pay1" $skidka 0; break;
   case 
"pay2" $skidka 0.02; break;
   default : 
$skidka 0; break;
endswitch;

switch (
$dostavka) :
   case 
"post" $dost_sum 5; break;
   case 
"avia" $dost_sum 15; break;
   case 
"сourier" $dost_sum 8; break;
endswitch;

// расчитываем сумму
$price $price * ($skidka) + $dost_sum;

?>

  Ответить  
 
 автор: Dizels   (13.07.2009 в 23:37)   письмо автору
 
   для: buldovsky   (13.07.2009 в 23:28)
 

Большое спасибо и последний нерешенный вопросик остался - я так понимаю, что тут нужно или java-скрипт или AJAX - как все это вывести в поле Итоговая стоимость без перезагрузки страницы?

  Ответить  
 
 автор: buldovsky   (13.07.2009 в 23:56)   письмо автору
 
   для: Dizels   (13.07.2009 в 23:37)
 

первое - нужно создать функцию js которая при каком-либо событии (например при изменении значения элемента формы) обращаласть бы к файлу buy.php (в котором содержиться php код расчета стоимости) и отправляла ему необходимые для этого переменные (пример такой функции приведу если потребуется). А затем получив результат сгенерированый сервером, разместить значение итоговой суммы в нужном месте страницы (средствами js).

  Ответить  
 
 автор: Dizels   (14.07.2009 в 00:07)   письмо автору
 
   для: buldovsky   (13.07.2009 в 23:56)
 

buldovsky, буду очень признателен за примеры.

  Ответить  
 
 автор: Trianon   (14.07.2009 в 00:27)   письмо автору
 
   для: Dizels   (14.07.2009 в 00:07)
 

<html>
<head>


</head>
<body>
<script>
function recalc1(x)
{
    var e = x.elements;
    var qty  = parseInt(e.kolvo.value);
    var discount = (100.0-( e.money[0].checked*2
                           +e.money[1].checked*0))/100;
    var delivery = e.dostavka[0].checked*5
                  +e.dostavka[1].checked*15
                  +e.dostavka[2].checked*8;
//    return " qty="+qty+" ds="+discount+" dry="+delivery;
    var price = 20;
    price = (price * qty) * discount + delivery;
    e.price.value = price;
}
</script>

<table cellspacing="7">
<form name="form" action="zakaz.php" method="post">
 <tr>
     <td><p class="text">Кол-во:</p></td>
     <td><input size="3" type="text" name="kolvo" value="1"
        onChange="recalc1(this.form);" > шт.</td>
 </tr>
  <tr>
      <td><p class="text">Способ оплаты:</p></td>
      <td>
          <input type="radio" name="money" value="webmoney"
            onClick="recalc1(this.form);" >WebMoney (скидка 2%)<Br>
          <input type="radio" name="money" value="yandexmoney"
            onClick="recalc1(this.form);" >ЯндексДеньги<Br>
      </td>
  </tr>
  <tr>
      <td><p class="text">Способ доставки:</p></td>
      <td>
          <input type="radio" name="dostavka" value="1"
               onClick="recalc1(this.form);" >1 вариант<Br>
          <input type="radio" name="dostavka" value="2"
             onClick="recalc1(this.form);" >2 вариант<Br>
          <input type="radio" name="dostavka" value="3"
             onClick="recalc1(this.form);" >3 вариант<Br>
      </td>
  </tr>

  <tr>
      <td><p class="text">Итого к оплате:</p></td>
      <td><input size="3" type="text" name="price">грн.</td>
  </tr>
  <tr>
      <td></td>

      <td><input class="button" type="submit" value="Заказать"></td>
  </tr>
</form>
</table>
</body>
</html>

  Ответить  
 
 автор: buldovsky   (14.07.2009 в 00:42)   письмо автору
 
   для: Dizels   (14.07.2009 в 00:07)
 

Если понадобится вариант использования AJAX:


// эта функция подгатавливает асинхронный запрос AJAX (для большинства браузеров)
// пригодится если вы часто используете AJAX
function prepareRequest() {
   var http_request = false;
   if (window.XMLHttpRequest) {
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType) {}
   } else if (window.ActiveXObject) {
      try {http_request = new ActiveXObject("Msxml2.XMLHTTP");}
      catch (e) {try {http_request = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {}}
   }
   if (!http_request) {alert('error'); return false;}
   return http_request;
}


// ваша функция которая будет вызываться при изменении в форме
function calcPrise(form) {

  //Эта переменная должна содержать переменные в виде "&variable=value", например
  var postvar = "&kolvo=2&oplata=pay1&dostavka=avia"; // и т.д. перечисляете все переменные которые нужно передать серверу
  // их значения берете из формы "form"

  var xmlHttp = prepareRequest();  //создаем новый запрос
  xmlHttp.open("POST", "/buy.php", true);  // Открыть соединение с сервером
// ставим заголовок, указывающий тип запроса
  xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");  

  xmlHttp.send(postvar);   // Передаем запрос
  xmlHttp.onreadystatechange = function () {  // Установить функцию для сервера, которая выполнится после его ответа
    if (xmlHttp.readyState == 4) {
        var answer = xmlHttp.responseText; // теперь эта переменныя содержит ответ от сервера
        // осталось только вставить этот ответ в нужное место страницы c помощью функции innerHTML
    }
  }
}

  Ответить  
 
 автор: Trianon   (13.07.2009 в 23:35)   письмо автору
 
   для: Dizels   (13.07.2009 в 23:23)
 

>Вот но нужно, чтобы в файле buy.php автоматически высчитывалась общая стоимость заказа.

То есть прямо в момент выбора элементов формы?
Тогда это на JS.



[Horisontal scrolling ЛАП on]

  Ответить  
 
 автор: Dizels   (14.07.2009 в 00:39)   письмо автору
 
   для: Trianon   (13.07.2009 в 23:35)
 

В общем пока сделал с перезагрузкой страницы. Появился еще один вопрос, вернее даже 2 вопроса:

После оформления заказа я хочу, чтобы выводилась краткая информация по нему, а именно: итоговая сумма, адрес доставки и т.д.

Для этого в файле zakaz.php после успешного добавления данных в БД делаю перенаправление на страницу о заказе:
if(mysql_query($query))
    {
        // Осуществляем автоматический переход на страницу с данными о заказе
        echo "<HTML><HEAD>
                <META HTTP-EQUIV='Refresh' CONTENT='0; URL=rezult.php?id'>
                </HEAD>";
    }

И вот здесь как раз и наступает вопрос - как получить id только что добавленной записи в таблицу.

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

  Ответить  
 
 автор: Trianon   (14.07.2009 в 00:44)   письмо автору
 
   для: Dizels   (14.07.2009 в 00:39)
 

Можно же сперва проверить, что заказ принадлежит именно этому посетителю ($_SESSION, user_id и т.п.).

  Ответить  
 
 автор: Dizels   (14.07.2009 в 00:53)   письмо автору
 
   для: Trianon   (14.07.2009 в 00:44)
 

Дело в том, что изначально я не планирую на данный момент делать регистрацию и т.д., так как теоретически - продаваться будет только 1 товар.

  Ответить  
 
 автор: Trianon   (14.07.2009 в 01:12)   письмо автору
 
   для: Dizels   (14.07.2009 в 00:53)
 

А слова $_SESSION Вы не заметили?

  Ответить  
 
 автор: Trianon   (14.07.2009 в 01:13)   письмо автору
 
   для: Dizels   (14.07.2009 в 00:39)
 

>И вот здесь как раз и наступает вопрос - как получить id только что добавленной записи в таблицу.

в поиск. Тема разжевана в кашу.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования