[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обновление страницы
nasferatu
Создал код записи данных в БД. После внесения данных в БД, нажимая Обновление страницы, данные повторно заносятся. Можно перед внесением проводить проверку по какой-либо записи, но может есть что-то более практичное????



Спустя 51 минута, 26 секунд (27.02.2009 - 19:49) FatCat написал(а):
Сразу после внесения информации в БД, сразу же делать редирект на другую страницу.

Спустя 41 минута, 12 секунд (27.02.2009 - 20:30) nasferatu написал(а):
А другим способом не как нельзя избежать этого??

Спустя 13 минут, 49 секунд (27.02.2009 - 20:44) kirik написал(а):
Можно. Проверять, есть-ли уже в БД такие данные.
Способ с редиректом самый оптимальный.

Спустя 9 минут, 4 секунды (27.02.2009 - 20:53) nasferatu написал(а):
Это с помощью header организовать??

Спустя 3 минуты, 18 секунд (27.02.2009 - 20:57) kirik написал(а):
nasferatu
Ага.
PHP
header('Location: http://site.com/');

Спустя 37 минут, 49 секунд (27.02.2009 - 21:34) nasferatu написал(а):
что-то у меня не совсем получается.
Через header можно также передавать параметры??

Спустя 37 минут, 25 секунд (27.02.2009 - 22:12) kirik написал(а):
Цитата (nasferatu @ 27.02.2009 - 13:34)
Через header можно также передавать параметры??

Методом GET можно.
PHP
header('Location: http://site.com/index.php?var=val');

Спустя 14 часов, 43 минуты, 11 секунд (28.02.2009 - 12:55) nasferatu написал(а):
Это хорошо, я так и подумал.
А как добиться автоматического перехода через заданное время, например, 5 сек.??

Спустя 2 часа, 7 минут, 9 секунд (28.02.2009 - 15:02) twin написал(а):
PHP
<?
header('Refresh: 5; url=http://site.com/index.php?var=val');

Спустя 4 дня, 4 часа, 1 минута, 34 секунды (2.03.2009 - 19:04) nasferatu написал(а):
twin
пасиб

Спустя 1 день, 19 часов, 28 минут, 54 секунды (4.03.2009 - 14:33) nasferatu написал(а):
столкнулся с такой проблемой.
Не могу сообразить, как написать код.
У меня форма внесения данных (index.php?addcomm). Отправляются данные обработчику (addcomm.php). Там после всех проверок идет перенаправление на (index.php). Но при неправильном вводе данных, надо опять загрузить (index.php?addcomm). Пытался использовать include(index.php?addcomm), не прокатило. Делать автоматическое перенаправление, но надо назад передть слишком много значений. Надеюсь, что понятно я написал свою проблему.
Как тут быть???

Спустя 6 часов, 2 минуты, 29 секунд (4.03.2009 - 20:35) Grey написал(а):
Вот скрипт примерно под задачу. При неправильном заполнении согласно условиям, отсылка данных не происходит, страница возвращается обратно, но данные в полях сохраняются, чтобы не набивать двести раз. При этом если юзер забыл заполнить обязательное поле, рядом с этим полем появляется соответствующее сообщение. Здесь последнее поле, название сайта, является необязательным, поэтому принимается даже пустое. три первых поля требуют обязательного заполнения
PHP
<?php
require 
"config.php";
//проверяем наличие переменных, если они есть, делаем то что делается ниже.
if (isset($_POST['nazv'])&& isset($_POST['adr'])&& isset($_POST['tel'])&& isset($_POST['site'])) 
{
  // Методом пост были присланы все поля формы
 $nazv = $_POST['nazv'];
 $adr = $_POST['adr'];
 $tel = $_POST['tel'];
 $site = $_POST['site'];
  // Массив ошибок
  $errors = array();

  // Проверки переменных
  if(empty($_POST['nazv'])) { $errors['nazv'] = "Не заполнено название"; }
  if(empty($_POST['adr'])) { $errors['adr'] = "Не заполнен адрес"; }
  if(empty($_POST['tel'])) { $errors['tel'] = "Не заполнен телефон"; }
  
  if
(count($errors)) {
    // Если массив ошибок не пуст, заново выводим форму, отсылая в нее сообщения об ошибках
    showform($errors);
  } else 
     
{
     //если ошибок нет, проверяем есть ли уже такое в базе и если нет, втыкаем.
    $exist = mysql_query("SELECT * FROM object WHERE title='$nazv' and adres='$adr' and tel='$tel'" ,$db);
          if(mysql_num_rows($exist)>0)
              {
                echo "Такие данные уже есть!";
                showform($errors);
                
              
}
          else
              
{  
  
 $result_ins_otm 
= mysql_query("INSERT INTO object (title,adres,tel,site) VALUES ('$nazv','$adr','$tel','$site')");
      if  ($result_ins_otm == false)
                      {
                        echo "Данные не записаны";
                         
                      
}
                   else
                      
{
    header('Location: куда_хочешь.рhр');
         }
  }
}
 
}
else {
  showform(); //если переменных нет, просто выводим пустую форму
}

// Содержит отображение формы
function showform(array $errors = array()) {
// Генерация значений по умолчанию, если значение установлено с предыдущего запроса - присваивается оно, иначе NULL
  
  $nazv 
= isset($_POST['nazv'])?$_POST['nazv']:NULL;
  $adr = isset($_POST['adr'])?$_POST['adr']:NULL;
  $tel = isset($_POST['tel'])?$_POST['tel']:NULL;
  
  
// Генерация сообщений об ошибках
  $err1 = isset($errors['nazv'])?$errors['nazv']:NULL;
  $err2 = isset($errors['adr'])?$errors['adr']:NULL;
  $err3 = isset($errors['tel'])?$errors['tel']:NULL;
  
  
  
// Вывод формы
  echo '<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'
.'<title>Добавить новую школу</title>'
.'<link href="styles.css" rel="stylesheet" type="text/css" />'
.'</head>';
  echo '<form action="'.$_SERVER['REQUEST_URI'].'" method="post">';

//поля ввода
echo '<input name="nazv" type="text" value="'.$nazv.'" />'.$err1.'<br />'
       .'<input name="adr" type="text" value="'.$adr.'" />'.$err2.'<br />'
       .'<input name="tel" type="text" value="'.$tel.'" />'.$err3.'<br />'
      .'<input name="site" type="text" value="'.$site.'" /><br />'
      .'<input type="submit" />'
      .'</form>';
}

Спустя 2 часа, 11 минут, 11 секунд (4.03.2009 - 22:46) nasferatu написал(а):
пасиб, но меня это не устраивает, т.к. код формы встроен в главную страницу, где до header, как не крути будут include, поэтому код обработки должен быть отдельно от формы.

Спустя 11 минут, 56 секунд (4.03.2009 - 22:58) Grey написал(а):
Тогда эту часть

PHP
$result_ins_otm mysql_query("INSERT INTO object (title,adres,tel,site) VALUES ('$nazv','$adr','$tel','$site')");
      if  (
$result_ins_otm == false)
                      {
                        echo 
"Данные не записаны";
                         
                      }
                   else
                      {
    
header('Location: куда_хочешь.рhр');



Заменяем на

PHP
header('Location: куда_хочешь.рhр?nazv='.$nazv.'&adr='.$adr.'&tel='.$tel.'');



И в обработчике принимаем

PHP
$nazv $_GET['nazv'];
$adr $_GET['adr']; //и тд
// и далее
$result_ins_otm mysql_query("INSERT INTO object (title,adres,tel,site) VALUES ('$nazv','$adr','$tel','$site')");


Спустя 10 минут, 41 секунда (4.03.2009 - 23:09) nasferatu написал(а):
Grey, но я писал, что передаваемых данных назад может быть много, более 10. Разумно ли это???? Хотя, если другого выхода нет, это только и остаеться

Спустя 9 минут, 30 секунд (4.03.2009 - 23:18) sergeiss написал(а):
Цитата (nasferatu @ 4.03.2009 - 22:46)
пасиб, но меня это не устраивает, т.к. код формы встроен в главную страницу, где до header, как не крути будут include, поэтому код обработки должен быть отдельно от формы.

А в чем проблемы-то с инклудом ты тут видишь? blink.gif

Спустя 6 минут, 42 секунды (4.03.2009 - 23:25) nasferatu написал(а):
так include мешает header, на сколько я разобрался. Или я не прав???

Спустя 15 минут, 27 секунд (4.03.2009 - 23:41) Grey написал(а):
PHP
<?php
require "config.php";
//проверяем наличие переменных, если они есть, делаем то что делается ниже.
if (isset($_POST['nazv'])&& isset($_POST['adr'])&& isset($_POST['tel'])&& isset($_POST['site'])) 
{
  
// Методом пост были присланы все поля формы
 
$nazv $_POST['nazv'];
 
$adr $_POST['adr'];
 
$tel $_POST['tel'];
 
$site $_POST['site'];
  
// Массив ошибок
  
$errors = array();

  
// Проверки переменных
  
if(empty($_POST['nazv'])) { $errors['nazv'] = "Не заполнено название"; }
  if(empty(
$_POST['adr'])) { $errors['adr'] = "Не заполнен адрес"; }
  if(empty(
$_POST['tel'])) { $errors['tel'] = "Не заполнен телефон"; }
  
  if(
count($errors)) {
    
// Если массив ошибок не пуст, заново выводим форму, отсылая в нее сообщения об ошибках
?>

Тут будет отображаться то что загружается после неверного сабмита, над формой. Что угодно, пусть даже html

<?
    showform
($errors);
?>

Тут будет отображаться то что загружается после неверного сабмита, под формой

<?
  
} else 
     {
     
//если ошибок нет, проверяем есть ли уже такое в базе и если нет, втыкаем.
    
$exist mysql_query("SELECT * FROM object WHERE title='$nazv' and adres='$adr' and tel='$tel'" ,$db);
          if(
mysql_num_rows($exist)>0)
              {
                echo 
"Такие данные уже есть!";
                
showform($errors);
                
              }
          else
              {  
  
 
$result_ins_otm mysql_query("INSERT INTO object (title,adres,tel,site) VALUES ('$nazv','$adr','$tel','$site')");
      if  (
$result_ins_otm == false)
                      {
                        echo 
"Данные не записаны";
                         
                      }
                   else
                      {
    
header('Location: куда_хочешь.рhр');
         }
  }

}
else {
?>

Тут будет отображаться то что загружается изначально, до сабмита, выше формы

<?
  showform
(); //если переменных нет, просто выводим пустую форму
?>

до сабмина ниже формы

<?
}

// Содержит отображение формы
function showform(array $errors = array()) {
// Генерация значений по умолчанию, если значение установлено с предыдущего запроса - присваивается оно, иначе NULL
  
  
$nazv = isset($_POST['nazv'])?$_POST['nazv']:NULL;
  
$adr = isset($_POST['adr'])?$_POST['adr']:NULL;
  
$tel = isset($_POST['tel'])?$_POST['tel']:NULL;
  
  
// Генерация сообщений об ошибках
  
$err1 = isset($errors['nazv'])?$errors['nazv']:NULL;
  
$err2 = isset($errors['adr'])?$errors['adr']:NULL;
  
$err3 = isset($errors['tel'])?$errors['tel']:NULL;
  
  
  
// Вывод формы
  
echo '<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'
.'<title>Добавить новую школу</title>'
.'<link href="styles.css" rel="stylesheet" type="text/css" />'
.'</head>';
  echo 
'<form action="'.$_SERVER['REQUEST_URI'].'" method="post">';

//поля ввода
echo '<input name="nazv" type="text" value="'.$nazv.'" />'.$err1.'<br />'
       
.'<input name="adr" type="text" value="'.$adr.'" />'.$err2.'<br />'
       
.'<input name="tel" type="text" value="'.$tel.'" />'.$err3.'<br />'
      
.'<input name="site" type="text" value="'.$site.'" /><br />'
      
.'<input type="submit" />'
      
.'</form>';
}


У меня весь дизайн оформлен именно так, отправке заголовка ни коим образом не мешает. Главное проследить логику размещения кода

Спустя 9 минут, 9 секунд (4.03.2009 - 23:50) sergeiss написал(а):
Цитата
так include мешает header, на сколько я разобрался. Или я не прав???

Нет, не прав.

Проблема с хедером может быть только в одном: если до его вызова в браузер будет передан хотя бы один знак. Если же этого нету, то тогда сколько угодно инклудов делай smile.gif

По сути дела, предложенный ранее Греем алгоритм простой, понятный и правильный. Я попробую выразить эту идею более схеатично, чтобы было понятнее:
файл - обработчик, и он же содержит форму; например, это index.php
Код
<?php // тут начало файла; внутри тегов могут быть любые пробелы, но только не перед тэгом открытия
// в процессе можно делать любые инклуда, о которых я чуть подальше скажу еще

// тут сначала проверка, было ли что-то передано
// если да, и всё корректно, то тогда пишем данные в БД

..... код проверки и вывода в БД

// если данные корректны, то тогда
{
header( "Location: correct_info.php" );
exit ();
}

// а если данные не корректны, то просто продолжаем скрипт

...
// создаем форму ввода
?>
<form ..... >

// для вводимых полей проверяем, было ли что-то передано.
// если да, то это означает одно: ты находишься в режиме редактирования
// выводим эти данные - и так для всех вводимых полей
<input type="text" name="id" <?php if( isset( $_POST['id'] ) ) echo 'value="'.$_POST['id'].'"'; ?> >


// закрываем форму
</form>
<?php

/**/ ?>




файл correct.php

Код
<?php
header( "Refresh: 10, url=index.php" );

// тут можно и стили подгрузить, и таблицу сделать для форматирования - всё, что скрипт успеет сделать за заявленные 10 секунд :) Хотя время можно и больше установить.
echo "Спасибо, ваши данные записаны. Через 10 секунд вы вернетесь обратно";
exit();
?>



Итог: если данные корректны, то производится запись в БД и пользователю показывается страница correct.php. Через 10 секунд (или другое время - как ты сам установишь) произойдет возврат на index.php. Но уже без данных, переданных для записи.
Если же данные неполные (по любым критериям, которые ты сам определишь), то тогда данные не пишутся в БД, но в форме отображается то, что юзер уже ввел. Надо только сказать ему где-то, что он не прав smile.gif и чтобы он скорректировал ввод.

PS. Сорри, забыл сразу написать про include.
Любой подключаемый файл, который будет перед header(), должен начинаться с <?php и заканчиваться ?> - и никаких выводов в браузер!!! Тогда проблем не будет, все данные будут подключены нормально.

Спустя 12 минут, 14 секунд (5.03.2009 - 00:02) nasferatu написал(а):
это все хорошо, но я пытался так делать и у меня выскакивали ошибки, указывало на инклуд. В подключаемом файле ни каких выводов не было в браузер. Я порылся в литературе и нашел, что инклуды нельзя до хеадера, потому и написал.
Но если так, значит будет пробовать еще раз, буду искать свою ошибку.
Спасибо

Спустя 6 минут, 59 секунд (5.03.2009 - 00:09) nasferatu написал(а):
сейчас проэкспериментиров с инклудами, все работает. Потом верь некоторым источник mad.gif
Век живи, век учись.

Спустя 12 часов, 25 минут, 21 секунда (5.03.2009 - 12:34) nasferatu написал(а):
такой вопрос.
У меня есть сайт, где гостевая, фотоальбом и т.д. Я делаю так, чтобы при переходе было не my.com/guestbook/, my.com/foto/, а my.com?guestbook, my.com?foto/, т.е. распределение что отображать выполняется в главном файле (index.php). Не большая ли нагрузка будет на файл???

Спустя 9 часов, 37 минут, 56 секунд (5.03.2009 - 22:12) kirik написал(а):
Цитата (nasferatu @ 5.03.2009 - 04:34)
Не большая ли нагрузка будет на файл???

Неа.

Спустя 3 часа, 6 минут, 42 секунды (6.03.2009 - 01:19) Grey написал(а):
коли уж вопрос зашел о нагрузках, спрошу тут. я использую для редиректа после осуществления операций конструкцию swith
PHP
html>
<
head>
<
meta http-equiv="refresh" content="3; url=<?=$_SERVER['HTTP_REFERER']?>">
<
title>Редактирование отметок</title>
</
head>
<
body>
<?
php
$act
=$_GET['act'];
switch(
$act)
{
    case 
'add_items':
        
        echo 
"предмет добавлен!";
            
        break; 
    case 
'delete_items':
        
        echo 
"предмет удален";
        
        break; 
        case 
'update_items':
        
        echo 
"информация о предмете обновлена";
        
        break; 
       case 
'add_users':
        
        echo 
"юзер добавлен!";
        
        break; 
//'delete'
      
case 'delete_users':
        
        echo 
"юзер удален";
        
        break; 
//'delete'
}
?><

и так далее, куча опций для работы примерно с 10 объектами.
Как это выглядит с точки зрения нагрузки?
и возможно ли этот код уложить во что-то общее, в несколько строк?

Спустя 42 минуты, 48 секунд (6.03.2009 - 02:02) kirik написал(а):
Grey, нагрузки тут нет никакой, а вот заоптимизить скрипт в смысле его размера можно.

PHP
$reports = array(
    
'default' => 'Вы че-то сделали...',
    
'add_items' => 'предмет добавлен!',
    
'delete_items' => 'предмет удален',
    
'update_items' => 'информация о предмете обновлена',
    
'add_users' => 'юзер добавлен!',
    
'delete_users' => 'юзер удален',
);

echo isset(
$reports[$_GET['act']]) ? $reports[$_GET['act']] : $reports['default'];


Скрипт дает безграничный простор для полета мысли! (Можно замутить мультиязычную версию репортов smile.gif )

Спустя 3 дня, 17 часов, 32 минуты, 24 секунды (9.03.2009 - 19:34) nasferatu написал(а):
PHP
header("Refresh: 5, url=index.php?detail=$id");

В Опере работает, а в експлорере нет. В чем может быть причина????

Спустя 3 дня, 20 часов, 32 минуты, 35 секунд (13.03.2009 - 16:07) Guest написал(а):
в експлорере после Refresh: 5, оказывается, нужна не ",", а ";" тогда параметры передаются
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.