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

Форум PHP

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

 

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

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

тема: Проблема с передачей данных методом POST и с помощью сессий.
 
 автор: Костян   (18.09.2008 в 00:13)   письмо автору
 
 

На странице 2 формы, обе передают на ту же страницу методом post некоторые данные. Причем работать эти формы должны последовательно: сначала отрабатывает одна, потом загружается другая. Первая форма работает нормально, вторая не передает ничего. На локалке все работало, на сервере не работает. Хостинг на st-host.ru. Насколько я знаю, он работает под Unix. Может у Unix есть какие-то особенности по передаче данных методом POST? Кстати, сессии тоже работать перестали. Никто с такими проблемами не встречался?

  Ответить  
 
 автор: Trianon   (18.09.2008 в 00:20)   письмо автору
 
   для: Костян   (18.09.2008 в 00:13)
 

У Вас поразительная манера задавать вопрос и ждать ответа, не приводя никакого кода.
Или Вы ожидаете ответы именно от техподдержки st-hosting? Так они предпочитают, чтобы к ним по е-мэйлу обращались.

  Ответить  
 
 автор: Костян   (18.09.2008 в 06:40)   письмо автору
 
   для: Trianon   (18.09.2008 в 00:20)
 

Действительно, чего это я? Вот код:

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta name="keywords" content="работа, найти работу, вакансии , поиск работы">
<meta name="description" content="На данной странице вы найдете информацию по поиску и предложению работы ">
<title>Напоминание пароля</title>
<link href="style.css" rel="stylesheet" type="text/css">
<script language="javascript" type="text/javascript"> 
<!-- 
function step_back() 

 window.history.back(1); 

//--> 
</script>
</head>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<table width="690" border="0" align="center" bgcolor="#FFFFFF" class="main_border">
 <?php @session_start();  require_once("blocks/header1.php");  ?>
 <tr> 
 <td width="80" height="481" valign="top" class="left">
<table width="689" height="164" border="0" cellpadding="1" cellspacing="1">
<tr> 
 <td width="164" rowspan="4">&nbsp;</td>
 <td width="356" align="center" ><img src="img/vho_d.gif" width="250" height="50"></td>
 <td width="159">&nbsp;</td>
 </tr>
<tr> 
<td><br>Забыли пароль? Не страшно. Введите свое имя и ответ на контрольный вопрос. </td>
 <td>&nbsp; </td>
 </tr>
 <tr> 
 <td> 
 <p class="forma1">&nbsp;</p>
<form method=post>
 <p class="forma">Имя : </p>
 <input type=text name=name 
 value='<?= $_SESSION['fuck']; ?>'>
 <br>
 <input type=submit value="Запрос контрольного вопроса">
</form>
 <? 
// Обработчик формы
//echo "name1=".$_SESSION['fuck']; 
//echo  "name2=".$_POST['name'];
//echo  "name3=".$name;
//if ($_POST['name']) $name= $_POST['name'];
if(!empty($_POST['name']))
{
// Устанавливаем соединение с базой данных
require_once("config.php"); 
// Защищаясь от SQL-инъекции, пропускаем
// полученные пароль и логин через функцию
// mysql_escape_string
if (!get_magic_quotes_gpc())
{
$_POST['name'] = mysql_escape_string($_POST['name']);
}
// Осуществляем запрос, который возвращает
// число записей, удовлетворяющих паролю
// и логину
$query "SELECT COUNT(*) FROM userslist
WHERE name = '
$_POST[name]'";
$usr mysql_query($query);
if(!
$usr) exit("Ошибка в блоке авторизации");
// Получаем число записей
if(mysql_result($usr,0) > 0define("TOTAL"1);
}
// Если число записей больше 0
// заносим данные о пользователе в сессию
if(defined("TOTAL"))
{
$_SESSION['fuck']  = $_POST['name'];  
//$self1=$_SERVER['PHP_SELF']."?";
/* echo "sss=". $_SESSION['fuck']; */
//echo "hhh=".$_SERVER['PHP_SELF'];

// Если посетитель "вошёл" - приветствуем его 
if(isset ($_SESSION['fuck']))
{
// Устанавливаем соединение с базой данных
require_once("config.php"); 
// Выводим приветствие
/* echo "Здравствуйте, ".$_SESSION['name']."!<br>";
echo "Доступ к вашим секретным данным<br>"; */
//$self=$_POST['self']; 
// Выводим данные пользователя
$query "SELECT * FROM userslist WHERE name = '$_SESSION[fuck]'";
//echo "sss=".$_SESSION['name'] ;
$usr mysql_query($query);
if(!
$usr) exit(mysql_error());
$user mysql_fetch_array($usr);
//unset($_SESSION['name']);
echo "Контрольный вопрос: ".$user['contr_q']."?"."<br>";?>
<form method=post>
<input type=text name=contr_a > 
<input type=submit value="Напомнить пароль">
</form>
<?
echo "KV=".$_POST['contr_a'];
echo 
"KV1=".$contr_a;
if(!empty(
$_POST['contr_a']))
{
// Устанавливаем соединение с базой данных
require_once("config.php"); 
// Защищаясь от SQL-инъекции, пропускаем
// полученные пароль и логин через функцию
// mysql_escape_string
if (!get_magic_quotes_gpc())
{
$_POST['contr_a'] = mysql_escape_string($_POST['contr_a']);
}
$_SESSION['contr_a']  = $_POST['contr_a'];  
// Осуществляем запрос, который возвращает
// число записей, удовлетворяющих паролю
// и логину
echo "ssq=".$_SESSION['contr_a'];
echo 
"вопр= ".$user['contr_a']."<br>"
echo 
"пароль= ".$user['pass']."<br>";
$contr_a=$_POST['contr_a'];
echo 
"вопр1= ".$contr_a."<br>";
if (
$_SESSION['contr_a']==$user['contr_a']) 
{echo 
"Пароль - ".$user['pass'];
$_SESSION['name'] = $user['name']; 
$_SESSION['password'] =  $user['pass'];}
}

?>
</td>
<tr> 
<td align="right"><br><a href="index.php"><img src="img/index.gif" width="150" height="30" alt="Назад"  border="0" title="Назад"></a></td>
</table> 
<?php require_once("blocks/footer.php")?>
</table>
</BODY>
</HTML>

  Ответить  
 
 автор: Trianon   (18.09.2008 в 09:30)   письмо автору
 
   для: Костян   (18.09.2008 в 06:40)
 

1. куча ненужного неиспользуемого текста в коментариях никак не способствует пониманию кода.
2. точно так же не способствует этому отсутствие нормальных отступов.
3. зачем-то применяется конструкция define() там, где хватило бы обычного присваивания.
4. функция session_start() вызывается с блокировкой диагностик.
5. диагностика о преждевременном выводе и о том, что функция не сработала из-за этого - теряется.
6. сессии не работают.
Исправляйте.

  Ответить  
 
 автор: Костян   (18.09.2008 в 10:09)   письмо автору
 
   для: Trianon   (18.09.2008 в 09:30)
 

Именно потому что не работают сессии я на Ваш форум и обратился. Не смотря на то, что код кривой, это я признаю, на локальном сервере все это работает. Подскажите, где искать причину, почему выдается ошибка, когда я убираю блокировку диагностик. Дело в том, что за основу этого скрипта взят код из книги по MySQL, на сколько я понимаю, Вашей книги. И где искать причину, почему данные из второй формы не попадают в скрипт. На локальном сервере не нужно было даже использовать переменные $_POST['']. Все работало с обычными переменными вида $var.

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> 
<meta name="keywords" content="работа, найти работу, вакансии , поиск работы"> 
<meta name="description" content="На данной странице вы найдете информацию по поиску и предложению работы "> 
<title>Напоминание пароля</title> 
<link href="style.css" rel="stylesheet" type="text/css"> 
 
</head> 

<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
<table width="690" border="0" align="center" bgcolor="#FFFFFF" class="main_border"> 
 
<?php session_start();  require_once("blocks/header1.php");  ?> 
 
<tr>  
 <td width="80" height="481" valign="top" class="left"> 
<table width="689" height="164" border="0" cellpadding="1" cellspacing="1"> 

<tr>  
 <td width="164" rowspan="4">&nbsp;</td> 
 <td width="356" align="center" ><img src="img/vho_d.gif" width="250" height="50"></td> 
 <td width="159">&nbsp;</td> 
 </tr> 

<tr>  
<td><br>Забыли пароль? Не страшно. Введите свое имя и ответ на контрольный вопрос. </td> 
 <td>&nbsp; </td> 
 </tr> 
 
<tr>  
 <td>  
 <p class="forma1">&nbsp;</p> 
<form method=post> 
 <p class="forma">Имя : </p> 
 <input type=text name=name  
 value='<?= $_SESSION['fuck']; ?>'> 
 <br> 
 <input type=submit value="Запрос контрольного вопроса"> 
</form> 
 
<?  
// Обработчик формы 
if(!empty($_POST['name'])) 

// Устанавливаем соединение с базой данных 
require_once("config.php");  
// Защищаясь от SQL-инъекции, пропускаем 
// полученные пароль и логин через функцию 
// mysql_escape_string 
if (!get_magic_quotes_gpc()) 

$_POST['name'] = mysql_escape_string($_POST['name']); 

// Осуществляем запрос, который возвращает 
// число записей, удовлетворяющих паролю 
// и логину 
$query "SELECT COUNT(*) FROM userslist 
WHERE name = '
$_POST[name]'"
$usr mysql_query($query); 
if(!
$usr) exit("Ошибка в блоке авторизации"); 
// Получаем число записей 
if(mysql_result($usr,0) > 0$total=1

// Если число записей больше 0 
// заносим данные о пользователе в сессию 
if($total==1

$_SESSION['fuck']  = $_POST['name'];   
}  

// Если посетитель "вошёл" - приветствуем его  
if(isset ($_SESSION['fuck'])) 

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

// Выводим приветствие  
$query "SELECT * FROM userslist WHERE name = '$_SESSION[fuck]'"
$usr mysql_query($query); 
if(!
$usr) exit(mysql_error()); 
$user mysql_fetch_array($usr); 

echo 
"Контрольный вопрос: ".$user['contr_q']."?"."<br>";?> 

<form method=post> 
<input type=text name=contr_a >  
<input type=submit value="Напомнить пароль"> 
</form> 

<? 
echo "KV=".$_POST['contr_a']; 
echo 
"KV1=".$contr_a

if(!empty(
$_POST['contr_a'])) 

// Устанавливаем соединение с базой данных 
require_once("config.php");  
// Защищаясь от SQL-инъекции, пропускаем 
// полученные пароль и логин через функцию 
// mysql_escape_string 
if (!get_magic_quotes_gpc()) 

$_POST['contr_a'] = mysql_escape_string($_POST['contr_a']); 

$_SESSION['contr_a']  = $_POST['contr_a'];   
// Осуществляем запрос, который возвращает 
// число записей, удовлетворяющих паролю 
// и логину 
echo "ssq=".$_SESSION['contr_a']; 
echo 
"вопр= ".$user['contr_a']."<br>";  
echo 
"пароль= ".$user['pass']."<br>"
$contr_a=$_POST['contr_a']; 
echo 
"вопр1= ".$contr_a."<br>"
if (
$_SESSION['contr_a']==$user['contr_a'])  
{echo 
"Пароль - ".$user['pass']; 
$_SESSION['name'] = $user['name'];  
$_SESSION['password'] =  $user['pass'];} 

}  
?> 
</td> 

<tr>  
<td align="right"><br><a href="index.php"><img src="img/index.gif" width="150" height="30" alt="Назад"  border="0" title="Назад"></a></td> 
</table>  

<?php require_once("blocks/footer.php")?> 

</table> 
</BODY> 
</HTML> 

  Ответить  
 
 автор: sim5   (18.09.2008 в 10:15)   письмо автору
 
   для: Костян   (18.09.2008 в 10:09)
 

Уважаемый, старт сессии должен объявляться до любого вывода в браузер! А у вас до старта куча целая выводится. Вы что ошибок не получаете?

  Ответить  
 
 автор: Костян   (18.09.2008 в 12:56)   письмо автору
 
   для: sim5   (18.09.2008 в 10:15)
 

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /www/nv-rabotaru/htdocs/rem_pass.php:7) in /www/nv-rabotaru/htdocs/rem_pass.php on line 11

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /www/nv-rabotaru/htdocs/rem_pass.php:7) in /www/nv-rabotaru/htdocs/rem_pass.php on line 11
Такую ошибку выдает броузер. Я убрал блокировку диагностик и поставил вызов сессии перед первым выводом, перед
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">  

Если Вам сложно объяснить, в чем проблема - скажите, где почитать.

  Ответить  
 
 автор: sim5   (18.09.2008 в 13:13)   письмо автору
 
   для: Костян   (18.09.2008 в 12:56)
 

Вы должны стартовать сессию, передавать любые заголовки до любого вывода в браузер! У вас сессия должна стартовать до этого:
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:www.w3.org/TR/html4/loose.dtd">
<html>
.......
И даже перед тегом <?php ничего не должно быть!

  Ответить  
 
 автор: Костян   (18.09.2008 в 13:45)   письмо автору
 
   для: sim5   (18.09.2008 в 13:13)
 

Огромное СПАСИБО! Оказывается, все было так просто! В заблуждение ввели примеры из книги. Там эта команда стоит в самом начале скрипта (хедер опущен по умолчанию), но я просто не думал, что еще выше хедера. А я как только ен изголялся, и параметры сессии методом гет передавал и еще много всякой всячины. Спасибо огромное!

  Ответить  
 
 автор: sim5   (18.09.2008 в 13:49)   письмо автору
 
   для: Костян   (18.09.2008 в 13:45)
 

Ну а зачем изголятся, нужно было просто почитать в мануале РНР, в нем все сказано. Да и в книге должно быть об этом.

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

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