За последние 24 часа нас посетили 19113 программистов и 1848 роботов. Сейчас ищут 955 программистов ...

Защита от "случайного заказа"

Тема в разделе "PHP и базы данных", создана пользователем Ric, 21 фев 2011.

  1. Ric

    Ric Активный пользователь

    С нами с:
    9 фев 2011
    Сообщения:
    97
    Симпатии:
    2
    Доброе время суток.
    При реализации формы заказа возникла следующая проблема:
    после того как юзер заполнил(или мы за него заполнили) поля формы заказа
    PHP:
    1.  
    2. <?php
    3. require_once('include_fns.php');
    4. do_html_header('Окончательный расчет');
    5. $user_details=get_user_det($_SESSION['valid_user']);
    6. $fio=$user_details['fio'];
    7. $gorod=$user_details['gorod'];
    8. $address=$user_details['address'];
    9. $tel=$user_details['tel'];
    10. ################################################################################
    11. ################################################################################
    12. $ship_fio=$_POST['ship_fio'];
    13. $ship_gorod=$_POST['ship_gorod'];
    14. $ship_address=$_POST['ship_address'];
    15. $ship_tel=$_POST['ship_tel'];
    16. $pozhelania=$_POST['pozhelania'];
    17.  if(strlen($ship_fio)<1)
    18.  {  
    19.        $ship_fio=$user_details['fio'];    
    20.    }  
    21.     if(!($ship_gorod))
    22.         {
    23.             $ship_gorod=$gorod;      
    24.         }
    25.     if(strlen($ship_address)<1)
    26.         {
    27.             $ship_address=$address;
    28.         }
    29.    if(!($ship_tel))
    30.        {
    31.            $ship_tel=$tel;
    32.        }
    33.    if(!($pozhelania))
    34.        {
    35.            $pozhelania='(NULL)';
    36.        }
    37.       $userid=$_SESSION['valid_user'];
    38.       var_dump($userid);
    39.        $orderid=insert_order($userid,$ship_fio,$ship_gorod,$ship_address,$ship_tel);
    40.        var_dump($orderid);
    41.  do_html_footer();
    42.  
    код функции insert_order
    PHP:
    1.  
    2. function insert_order($userid,$ship_fio,$ship_gorod,$ship_address,$ship_tel)
    3. {              
    4.                 $conn=db_connect();
    5.                $date=date('Y-m-d H:i');
    6.                $order_status="Заказ принят";
    7.                $query1="insert into orders(`orderid`,`userid`,`amount`,`date`,
    8.                   `order_status`,`ship_fio`,`ship_gorod`,`ship_address`,`ship_tel`,`pozhelania`)
    9.                   values(NULL,'$userid',".$_SESSION['total_price'].",'$date',
    10.                       '$order_status','$ship_fio','$ship_gorod','$ship_address','$ship_tel','$pozhelania')";
    11.                $result=$conn->query($query1);
    12.                if(!$result){
    13.                    echo "!";
    14.                    return false;
    15.                }
    16.                $query="select orderid from orders where
    17.                   userid='$userid' and
    18.                           date='$date' and
    19.                           order_status='$order_status' and
    20.                           ship_fio='$ship_fio' and
    21.                           ship_address='$ship_address'";          
    22.               $result=$conn->query($query);
    23.            if(!$result)
    24.                {
    25.                    echo "Селект orderid не дал результата";
    26.                    return false;
    27.                }
    28.                $num_order=$result->num_rows;
    29.     if($num_order == 0)
    30.         return false;
    31.     $row=$result->fetch_object();
    32.     return $row->orderid;
    проблемка состоит в том, что когда пользователь в форме заказа нажимает оформить заказ
    http://s004.radikal.ru/i207/1102/ca/4bc412cd3091.jpg
    то функция insert_order заносит данные в бд и делает выборку orderid
    так вот если обновить страницу после того как пользователь нажмет на кнопку оформить заказ
    http://s40.radikal.ru/i090/1102/b0/fb87d99e6d95.jpg
    то тот же самый заказ занесеться в базу. Подскажите пожалуйста, как обезопасить себя(базу) и пользователя от таких вот покупок.
     
  2. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Редиректить на любую другую страницу.
    Курите meta redirect, header location
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    редирект на самое себя можно. можно обработчик вынести вобще в отдельный файл.

    это происходит потому что браузер при клике на "обновить" отсылает все по-новой для вашего же удобства :D
     
  4. Ric

    Ric Активный пользователь

    С нами с:
    9 фев 2011
    Сообщения:
    97
    Симпатии:
    2
    о да, очень удобно:)
    спасибо admyx,igordata
     
  5. Ric

    Ric Активный пользователь

    С нами с:
    9 фев 2011
    Сообщения:
    97
    Симпатии:
    2
    Народ мне очень не удобно что приходиться вас напрегать но чет либо голова не варит либо хз...
    снова тот же код
    PHP:
    1.  
    2. <?php
    3. //header('Location:index.php');    
    4. require_once('include_fns.php');
    5. do_html_header('Окончательный расчет');
    6. $user_details=get_user_det($_SESSION['valid_user']);
    7. $fio=$user_details['fio'];
    8. $gorod=$user_details['gorod'];
    9. $address=$user_details['address'];
    10. $tel=$user_details['tel'];
    11. ################################################################################
    12. ################################################################################
    13. $ship_fio=$_POST['ship_fio'];
    14. $ship_gorod=$_POST['ship_gorod'];
    15. $ship_address=$_POST['ship_address'];
    16. $ship_tel=$_POST['ship_tel'];
    17. $pozhelania=$_POST['pozhelania'];
    18.  if(strlen($ship_fio)<1)
    19.  {  
    20.        $ship_fio=$user_details['fio'];    
    21.    }  
    22.     if(!($ship_gorod))
    23.         {
    24.             $ship_gorod=$gorod;      
    25.         }
    26.     if(strlen($ship_address)<1)
    27.         {
    28.             $ship_address=$address;
    29.         }
    30.    if(!($ship_tel))
    31.        {
    32.            $ship_tel=$tel;
    33.        }
    34.    if(!($pozhelania))
    35.        {
    36.            $pozhelania='(NULL)';
    37.        }
    38.       $userid=$_SESSION['valid_user'];
    39.       var_dump($userid);
    40.        $orderid=insert_order($userid,$ship_fio,$ship_gorod,$ship_address,$ship_tel);
    41.        var_dump($orderid);
    42.        
    43.       insert_order_items($orderid);
    44.  do_html_footer();
    45. ?>
    46.  
    проблема с insert_order_items
    PHP:
    1.  
    2. <?php function insert_order_items($orderid)
    3. {
    4.     $conn=db_connect();
    5.                   foreach($_SESSION['cart'] as $artikul=>$qty)
    6.                       {
    7.                           $flow=get_flow_details($artikul);
    8.                           $query="insert into order_items(`orderid`,`artikul`,`item_price`,`quantity`)
    9.                              values('$orderid','$artikul',".$flow['price'].",'$qty')";
    10.                               $result=$conn->query($query);
    11.                               if(!$result)
    12.                                   echo 'нет результа';
    13.                               return false;
    14.                       }
    15.                     return $result;
    16. }
    17. ?>
    18.  
    проблема в том, что если покапать выбрал несколько товаров(с разными артикулами) то в таблицу order_items записываеться тот который был добавлен в корзину первый...
    var_dump($_SESSION['cart'];
    выдал такой результат
    array(2) { [1]=> string(1) "3" [2]=> string(1) "1" }
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    хз =) на вид должно пахать правильно
     
  7. Ric

    Ric Активный пользователь

    С нами с:
    9 фев 2011
    Сообщения:
    97
    Симпатии:
    2
    вот и яж тоже с ним маюсь, на вид он вроде правильный а на деле не совсем...
     
  8. Ric

    Ric Активный пользователь

    С нами с:
    9 фев 2011
    Сообщения:
    97
    Симпатии:
    2
    код исправлен:
    PHP:
    1.  
    2.  <?php function insert_order_items($orderid)
    3.  {
    4.      $conn=db_connect();
    5.                    foreach($_SESSION['cart'] as $artikul=>$qty)
    6.                        {
    7.                            $flow=get_flow_details($artikul);
    8.                            $query="insert into order_items(`orderid`,`artikul`,`item_price`,`quantity`)
    9.                               values('$orderid','$artikul',".$flow['price'].",'$qty')";
    10.                                $result=$conn->query($query);
    11.                                if(!$result){
    12.                                    echo 'нет результа';
    13.                                return false;
    14. }
    15.                        }
    16.                      return $result;
    17.  }
    18.  ?>
    19.  
    не были добписаны скобки после if(!$result)