Помогите советом. Как лучше обрабатывать $_POST? Интересны разные пути реализации, чтобы вабрать лучший. Раньше я использовал два варианта. Первый это когда при submit на определенную страницу (http://host/news/add.php) я обрабатывал $_POST и там же отрисовывал содержимое страницы (скажем preview). Второй это когда я submit передавал на одну страницу (http://host/news/upl.php) , на ней обрабатывал, заносил в базу, а потом делал релинк на страницу где отрисовывал содержимое (http://host/news/preview.php) Первый способ удобен тем, что можно обработать ошибки и подсветить обратно на форме. Второй, тем, что Refresh страницы перестает работать. Что же из этого лучше? Может есть более красивое решение. А после того, как я попробовал ЧПУ, добавил в .htaccess Код (Text): RewriteEngine On RewriteRule ^([^.]+)$ index.php $_POST-ы перестали работать. Работают только когда submit на корень (http://host). Как быть в этом случае?
есть еще web2.0 подход, также известный под названием ajax. слыхал про такое? в классическом виде я лично предпочитаю твой второй вариант. если при сабмите и обработке возникают ошибки, отрисовывешь их и оставляешь юзера на той же странице. если все ок - редиректишь куда-нить и предотвращаешь повторый сабмит.
У меня в системе сначала отрабатывает main class - который инициализирует юзверя и т.п.; потом контроллер модуля, который, собственно и отслеживает действия юзверя, и, только потом уже идет подключение модуля. Я лично делаю редирект после исполнения метода контроллера - если он вызван.
vanatomas, у первого способа обновление можно запретить (сделав редирект на саму страницу при успешной проверке). Я всегда использую именно его - первый способ. Хотя бы потому что удобнее пользователю.
Вот и мне первый способ как то ближе. Но вот беда, попробовал ЧПУ и больше не могу им пользоваться. Я что-то делаю не так? Или с ЧПУ только второй и третий (AJAX) способ можно использовать?
Эээх... я то так делаю, то так, никак определиться не могу. Вот если бы Гуру сделал за меня выбор и сказал делай так, а так лучше не надо. Я бы принял это как аксиому, и было бы мне счастье...
да $_POST не передается если линк типа http://host/news/qqq/www/eee только если в корень http://host я их получаю
Ты хочешь сказать, что должно работать? Я правильно включаю ЧПУ? Может в этом причина? Можешь показать свой вариант?
могу но раз у тебя в корне работает - то и хорошо. значит все ок. у меня просто все на сайте подключается через include в одном единственном основном index.php, а в нем уже я ковыряю запрошеный урл и от этого пляшу. Код (Text): <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !=/favicon.ico RewriteRule ^(.*)$ index.php?$1 [L,QSA] </IfModule> а дальше отталкивайся от $_SERVER['REQUEST_URI'] подгружай и т.п. я не знаю как работает твой и какова у тебя струтура, поэтому не знаю, в чем беда, но у меня все пашет так, как я описал.
вот на коленках накидал, вроде работает... теперь весь сайт переделывать.. тоже все через index.php Код (Text): <? /* file index.php */ //session session_id("test-session"); session_start(); //defines define( 'HOST', 'http:/'.'/'.$_SERVER['HTTP_HOST'] ); //разбираем URL $SITE = explode('/', trim($_SERVER['REQUEST_URI'],'/')); if((isset($_SESSION['_url_from']))&&($_SESSION['_url_from']==$_SERVER['REQUEST_URI'])) { if((isset($_SESSION['_url_force_to']))&&(!empty($_SESSION['_url_force_to']))) { header('Location: '.$_SESSION['_url_force_to']); exit; } } //если есть submit if((isset($_POST['cmd']))&&($_POST['cmd']=='submit')) { $_SESSION['_post_keys']=''; foreach($_POST as $key=>$value) { $_SESSION['_post_keys'] .= $key.';'; $_SESSION['_post>'.$key] = $value; } if(is_uploaded_file($_FILES['file']['tmp_name'])) { move_uploaded_file($_FILES['file']['tmp_name'], "uploads/".$_FILES['file']['name']); $_SESSION['_files_name'] = $value; } if((isset($_POST['from']))&&(!empty($_POST['from']))) { header('Location: '.$_POST['from']); exit; } } //если нет submit else { if((isset($_SESSION['_post_keys']))&&($_SESSION['_post_keys']!='')) { $post_keys=explode(';', $_SESSION['_post_keys']); foreach($post_keys as $value) { if(isset($_SESSION['_post>'.$value])) { $_POST[$value]=$_SESSION['_post>'.$value]; } } } } function empty_session_and_post() { if((isset($_SESSION['_post_keys']))&&($_SESSION['_post_keys']!='')) { $post_keys=explode(';', $_SESSION['_post_keys']); foreach($post_keys as $value) { if(isset($_SESSION['_post>'.$value])) { unset($_SESSION['_post>'.$value]); unset($_POST[$value]); } } unset($_SESSION['_post_keys']); } if(isset($_SESSION['_url_from'])) unset($_SESSION['_url_from']); if(isset($_SESSION['_url_force_to'])) unset($_SESSION['_url_force_to']); } //include "/page/news/add.php"; // содержание "/page/news/add.php" ниже if($SITE[1]=='from'){ if((isset($_POST['cmd']))&&($_POST['cmd']=='submit')) { if((isset($_POST['val1']))&&(empty($_POST['val1']))) $error['val1']=true; if((isset($_POST['val2']))&&(empty($_POST['val2']))) $error['val2']=true; if(isset($error)) { $status='NOK'; } else { //=== SAVE TO DB HERE === //и здесь обрабатываем загруженный файл //(пробка сейчас) $v1=$_POST['val1']; $v2=$_POST['val2']; //если нормально возвращаем $status='OK'; //----------------------- } } else { $status='NOK'; } if($status!='OK') { ?><form action="<? print(HOST); ?>" method ="POST" ENCTYPE="multipart/form-data"> <input type="hidden" name="cmd" value="submit"> <input type="hidden" name="from" value="<? print($_SERVER['REQUEST_URI']); ?>"> <label>val1: </label><input type="text" class="<? print( isset($error['val1']) ? 'err' : '' ); ?>" name="val1" value="<? print( isset($_POST['val1']) ? $_POST['val1'] : '' ); ?>"><br> <label>val2: </label><textarea name="val2" class="<? print( isset($error['val2']) ? 'err' : '' ); ?>" ><? print( isset($_POST['val2']) ? $_POST['val2'] : '' ); ?></textarea><br> <label>file: </label><input type="file" name="file"> <input type="hidden" name="MAX_FILE_SIZE" value="1000000"><br> <input type="submit" value="Отправить"> </form><? } else { empty_session_and_post(); $_SESSION['_url_from']=$_SERVER['REQUEST_URI']; $_SESSION['_url_force_to']='/url/view'; //здесь читаем из базы (сейчас пробка) ?><p>val1=<? print( $v1 ); ?></p> <p>val2=<? print( $v2 ); ?></p><? } } //include "/page/news/view.php"; // содержание "/page/news/view.php" ниже if($SITE[1]=='view'){ empty_session_and_post(); print "view news here"; } ?> Люди добрые, посмотрите, если есть время, нет ли здесь подводных камней или дурного стиля. Критика приветствуется![/code]