За последние 24 часа нас посетили 17828 программистов и 1280 роботов. Сейчас ищут 1472 программиста ...

Как лучше использовать $_POST

Тема в разделе "PHP для новичков", создана пользователем vanatomas, 14 сен 2010.

  1. vanatomas

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

    С нами с:
    11 сен 2010
    Сообщения:
    7
    Симпатии:
    0
    Помогите советом. Как лучше обрабатывать $_POST?
    Интересны разные пути реализации, чтобы вабрать лучший.

    Раньше я использовал два варианта.
    Первый это когда при submit на определенную страницу (http://host/news/add.php) я обрабатывал $_POST и там же отрисовывал содержимое страницы (скажем preview).

    Второй это когда я submit передавал на одну страницу (http://host/news/upl.php) , на ней обрабатывал, заносил в базу, а потом делал релинк на страницу где отрисовывал содержимое (http://host/news/preview.php)

    Первый способ удобен тем, что можно обработать ошибки и подсветить обратно на форме. Второй, тем, что Refresh страницы перестает работать.

    Что же из этого лучше? Может есть более красивое решение.

    А после того, как я попробовал ЧПУ, добавил в .htaccess

    Код (Text):
    1. RewriteEngine On
    2. RewriteRule ^([^.]+)$ index.php
    $_POST-ы перестали работать. Работают только когда submit на корень (http://host).
    Как быть в этом случае?
     
  2. engager

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

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    есть еще web2.0 подход, также известный под названием ajax. слыхал про такое?
    в классическом виде я лично предпочитаю твой второй вариант. если при сабмите и обработке возникают ошибки, отрисовывешь их и оставляешь юзера на той же странице. если все ок - редиректишь куда-нить и предотвращаешь повторый сабмит.
     
  3. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    У меня в системе сначала отрабатывает main class - который инициализирует юзверя и т.п.; потом контроллер модуля, который, собственно и отслеживает действия юзверя, и, только потом уже идет подключение модуля.
    Я лично делаю редирект после исполнения метода контроллера - если он вызван.
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    vanatomas
    как нравайся - так и делай
     
  5. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    vanatomas, у первого способа обновление можно запретить (сделав редирект на саму страницу при успешной проверке). Я всегда использую именно его - первый способ. Хотя бы потому что удобнее пользователю.
     
  6. vanatomas

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

    С нами с:
    11 сен 2010
    Сообщения:
    7
    Симпатии:
    0
    Вот и мне первый способ как то ближе. Но вот беда, попробовал ЧПУ и больше не могу им пользоваться.
    Я что-то делаю не так? Или с ЧПУ только второй и третий (AJAX) способ можно использовать?
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Да второй способ, однозначно.
    А данные о ошибках сохранить в сессию например.
     
  8. vanatomas

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

    С нами с:
    11 сен 2010
    Сообщения:
    7
    Симпатии:
    0
    Эээх... я то так делаю, то так, никак определиться не могу. Вот если бы Гуру сделал за меня выбор и сказал делай так, а так лучше не надо. Я бы принял это как аксиому, и было бы мне счастье... :)
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    vanatomas
    чпу пофик на методы передачи переменных. у тебя не работает что-то когда включаешь чпу?
     
  10. vanatomas

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

    С нами с:
    11 сен 2010
    Сообщения:
    7
    Симпатии:
    0
  11. vanatomas

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

    С нами с:
    11 сен 2010
    Сообщения:
    7
    Симпатии:
    0
    Ты хочешь сказать, что должно работать?
    Я правильно включаю ЧПУ? Может в этом причина? Можешь показать свой вариант?
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    могу

    но раз у тебя в корне работает - то и хорошо. значит все ок. у меня просто все на сайте подключается через include в одном единственном основном index.php, а в нем уже я ковыряю запрошеный урл и от этого пляшу.

    Код (Text):
    1. <IfModule mod_rewrite.c>
    2.   RewriteEngine on
    3.   RewriteCond %{REQUEST_FILENAME} !-f
    4.   RewriteCond %{REQUEST_FILENAME} !-d
    5.   RewriteCond %{REQUEST_URI} !=/favicon.ico
    6.   RewriteRule ^(.*)$ index.php?$1 [L,QSA]
    7. </IfModule>
    а дальше отталкивайся от $_SERVER['REQUEST_URI'] подгружай и т.п.

    я не знаю как работает твой и какова у тебя струтура, поэтому не знаю, в чем беда, но у меня все пашет так, как я описал.
     
  13. vanatomas

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

    С нами с:
    11 сен 2010
    Сообщения:
    7
    Симпатии:
    0
    вот на коленках накидал, вроде работает... теперь весь сайт переделывать..
    тоже все через index.php

    Код (Text):
    1. <?
    2. /* file index.php */
    3.  
    4. //session
    5. session_id("test-session");
    6. session_start();
    7.  
    8. //defines
    9. define( 'HOST', 'http:/'.'/'.$_SERVER['HTTP_HOST'] );
    10.  
    11. //разбираем URL
    12. $SITE = explode('/', trim($_SERVER['REQUEST_URI'],'/'));
    13.  
    14. if((isset($_SESSION['_url_from']))&&($_SESSION['_url_from']==$_SERVER['REQUEST_URI']))
    15. {
    16.     if((isset($_SESSION['_url_force_to']))&&(!empty($_SESSION['_url_force_to'])))
    17.     {
    18.         header('Location: '.$_SESSION['_url_force_to']);
    19.         exit;
    20.     }
    21. }
    22.  
    23. //если есть submit
    24. if((isset($_POST['cmd']))&&($_POST['cmd']=='submit'))
    25. {
    26.     $_SESSION['_post_keys']='';
    27.     foreach($_POST as $key=>$value)
    28.     {
    29.         $_SESSION['_post_keys'] .= $key.';';
    30.         $_SESSION['_post>'.$key] = $value;
    31.     }
    32.  
    33.     if(is_uploaded_file($_FILES['file']['tmp_name']))
    34.     {
    35.         move_uploaded_file($_FILES['file']['tmp_name'], "uploads/".$_FILES['file']['name']);
    36.         $_SESSION['_files_name'] = $value;
    37.     }
    38.  
    39.     if((isset($_POST['from']))&&(!empty($_POST['from'])))
    40.     {
    41.         header('Location: '.$_POST['from']);
    42.         exit;
    43.     }
    44. }
    45. //если нет submit
    46. else
    47. {
    48.     if((isset($_SESSION['_post_keys']))&&($_SESSION['_post_keys']!=''))
    49.     {
    50.         $post_keys=explode(';', $_SESSION['_post_keys']);
    51.         foreach($post_keys as $value)
    52.         {
    53.             if(isset($_SESSION['_post>'.$value]))
    54.             {      
    55.                 $_POST[$value]=$_SESSION['_post>'.$value];
    56.             }
    57.         }
    58.     }
    59. }
    60.  
    61. function empty_session_and_post()
    62. {
    63.     if((isset($_SESSION['_post_keys']))&&($_SESSION['_post_keys']!=''))
    64.     {
    65.         $post_keys=explode(';', $_SESSION['_post_keys']);
    66.         foreach($post_keys as $value)
    67.         {
    68.             if(isset($_SESSION['_post>'.$value]))
    69.             {      
    70.                 unset($_SESSION['_post>'.$value]);
    71.                 unset($_POST[$value]);
    72.             }
    73.         }
    74.         unset($_SESSION['_post_keys']);
    75.     }
    76.    
    77.     if(isset($_SESSION['_url_from'])) unset($_SESSION['_url_from']);
    78.     if(isset($_SESSION['_url_force_to'])) unset($_SESSION['_url_force_to']);
    79. }
    80.  
    81. //include "/page/news/add.php";
    82. // содержание "/page/news/add.php" ниже
    83. if($SITE[1]=='from'){
    84.  
    85.     if((isset($_POST['cmd']))&&($_POST['cmd']=='submit'))
    86.     {
    87.         if((isset($_POST['val1']))&&(empty($_POST['val1']))) $error['val1']=true;
    88.         if((isset($_POST['val2']))&&(empty($_POST['val2']))) $error['val2']=true;
    89.        
    90.         if(isset($error))
    91.         {
    92.             $status='NOK';
    93.         }
    94.         else
    95.         {
    96.             //=== SAVE TO DB HERE ===
    97.             //и здесь обрабатываем загруженный файл
    98.             //(пробка сейчас)
    99.            
    100.             $v1=$_POST['val1'];
    101.             $v2=$_POST['val2'];
    102.            
    103.             //если нормально возвращаем
    104.             $status='OK';
    105.             //-----------------------
    106.         }
    107.     }
    108.     else
    109.     {
    110.         $status='NOK';
    111.     }  
    112.  
    113.     if($status!='OK')
    114.     {
    115.         ?><form action="<? print(HOST); ?>" method ="POST" ENCTYPE="multipart/form-data">
    116.         <input type="hidden" name="cmd" value="submit">
    117.         <input type="hidden" name="from" value="<? print($_SERVER['REQUEST_URI']); ?>">
    118.        
    119.         <label>val1: </label><input type="text"
    120.             class="<? print( isset($error['val1']) ? 'err' : '' ); ?>"
    121.             name="val1" value="<? print( isset($_POST['val1']) ? $_POST['val1'] : '' ); ?>"><br>
    122.         <label>val2: </label><textarea name="val2"
    123.             class="<? print( isset($error['val2']) ? 'err' : '' ); ?>"
    124.             ><? print( isset($_POST['val2']) ? $_POST['val2'] : '' ); ?></textarea><br>
    125.         <label>file: </label><input type="file" name="file">
    126.         <input type="hidden" name="MAX_FILE_SIZE" value="1000000"><br>
    127.         <input type="submit" value="Отправить">
    128.         </form><?
    129.     }
    130.     else
    131.     {
    132.         empty_session_and_post();
    133.         $_SESSION['_url_from']=$_SERVER['REQUEST_URI'];
    134.         $_SESSION['_url_force_to']='/url/view';
    135.         //здесь читаем из базы (сейчас пробка)
    136.         ?><p>val1=<? print( $v1 ); ?></p>
    137.         <p>val2=<? print( $v2 ); ?></p><?
    138.     }
    139. }
    140.  
    141. //include "/page/news/view.php";
    142. // содержание "/page/news/view.php" ниже
    143. if($SITE[1]=='view'){
    144.     empty_session_and_post();
    145.     print "view news here";
    146. }
    147.  
    148. ?>
    Люди добрые, посмотрите, если есть время, нет ли здесь подводных камней или дурного стиля.
    Критика приветствуется![/code]
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тяжко =)

    ты чего хотел-то сделать-то?