Проблема со скриптом

Статус
Закрыто для дальнейших ответов.

Fliand

Well-Known Member
Регистрация
16.09.2007
Сообщения
81
Вот возникла проблема. У меня был код, который добавлял сообшения в файл. В нем сразу же проверялись поля формы.
вот код файла add_message.php
Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<?php
	 if(isset($_POST['submit'])) {
		  $name = $_POST['nick_name'];
		  $email = $_POST['e_mail'];
		  $text = $_POST['text'];
	 
		  $status = false;
		  if(preg_match('/\S/', $name) == false || (strlen($name)) > 20) {			   
			   $status = true;
			   $text_er[] = 'Неверно поле Nick';
		  }
		  if(preg_match('/\w{2,}@\w{2,}\.\w{2,}/', $email) == false || (strlen($email)) > 30) {
			   $status = true;
			   $text_er[] = 'Неверно поле e-mail';
		  }
		  if(preg_match('/\S/', $text) == false || (strlen($text)) > 500) {
			   $status = true;
			   $text_er[] = 'Неверно введен текст сообщения';
		  }
		  
		  if(!$status) {
			   $name = htmlspecialchars(stripslashes($name));
			   $email = htmlspecialchars(stripslashes($email));
			   $text = htmlspecialchars(stripslashes($text));

			   $result_text = bb_code($text);

			   $fr = fopen($file,'a');
			   if(fputs($fr, $name."<|>".$email."<|>".trim($result_text)."<|>".date("d.m.Y, H:i")."\r\n") != false) {
					echo "<meta http-equiv='Refresh' content='3; url=index.php'>";
					$text_show = "Ваше сообщение успешно добавлено. <br> Если ваш браузер не поддерживает автоматическую переадресацию то перейдите по ссылке. <a href=\"index.php\">index.php</a>";
					$title = 'Сообщение успешно добавленно';
					fclose($fr);
			   } else {
					$text_show = "Произошла ошибка при добовления сообщения. Поробуйте позже. <br> <a href=\"java script:window.history.back();\">Назад</a>";
					$title = 'Произошла ошибка при добовление сообщения';
					fclose($fr);
			   }
		  }

	 } else {
		  $text_show = "Вы не заполнили поля";
	 }
?>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title><?=$title;?></title>
<link rel="stylesheet" type="text/css" href="styles/style.css">
</head>

<body>
<div id="all" style="vertical-align:middle;">
<div id="main">
<?=$text_show;?>
<p>
<ul>
<?php
	 if($status) {
		  foreach($text_er as $val) {
?>
		  <li><?=$val;?></li>
<?php
		  }
		  echo "<a href=\"java script:window.history.back();\">Назад</a>";
		  unset($text_er);
	 }
?>
</ul>
</div>
</div>
</body>
</html>
Но потом возникла потребность в разделение кода.

И я решил добавить проверку форм в спомогательный файл functions.php
Код:
<?php
	// Файлу с сообщениями
	$file = 'message/messages.txt';
	// Временный файл с сообщениями
	$file_tmp = 'message/message_tmp.txt';
	//Сообщений на странице.
	$posts = 5;
	
	// Проверка полей форм
	function check_form() {
		global $text_er;
		
		$status = false;
		if(preg_match('/\S/', $name) == false || (strlen($name)) > 20) {			
			$status = true;
			$text_er[] = 'Неверно поле Nick';
		}
		if(preg_match('/\w{2,}@\w{2,}\.\w{2,}/', $email) == false || (strlen($email)) > 30) {
			$status = true;
			$text_er[] = 'Неверно поле e-mail';
		}
		if(preg_match('/\S/', $text) == false || (strlen($text)) > 500) {
			$status = true;
			$text_er[] = 'Неверно введен текст сообщения';
		}
		return $status;
		
	}
	// Замена bb-code на теги
	function bb_code($text_bb) {
			$text = str_replace('[b]','<b>',$text_bb);
			$text = str_replace('[/b]','</b>',$text);
			$text = str_replace('[i]','<i>',$text);
			$text = str_replace('[/i]','</i>',$text);
			$text = str_replace('[u]','<u>',$text);
			$text = str_replace('[/u]','</u>',$text);
			$text = str_replace('[s]','<s>',$text);
			$text = str_replace('[/s]','</s>',$text);
			$text = preg_replace('/(\[url=)(.+)(\])(.+)(\[\/url\])/', "<a href=\"$2\">$4</a>", $text);
			$text = preg_replace('/(\[img\])(.+)(\[\/img\])/', "<img src=\"$2\">", $text);
			$text = str_replace("\r\n", "<br>", $text);
			$text = str_replace("\r", "<br>", $text);
			$text = str_replace("\n", "<br>", $text);
		
			return $text;
		}		
?>
При этом код add_message.php стал таким

Код:
<?php
	require_once 'functions.php';
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<?php
	if(isset($_POST['submit'])) {
		$name = $_POST['nick_name'];
		$email = $_POST['e_mail'];
		$text = $_POST['text'];
	
		$status = check_form();
		
		if(!$status) {
			$name = htmlspecialchars(stripslashes($name));
			$email = htmlspecialchars(stripslashes($email));
			$text = htmlspecialchars(stripslashes($text));

			$result_text = bb_code($text);

			$fr = fopen($file,'a');
			if(fputs($fr, $name."<|>".$email."<|>".trim($result_text)."<|>".date("d.m.Y, H:i")."\r\n") != false) {
				echo "<meta http-equiv='Refresh' content='3; url=index.php'>";
				$text_show = "Ваше сообщение успешно добавлено. <br> Если ваш браузер не поддерживает автоматическую переадресацию то перейдите по ссылке. <a href=\"index.php\">index.php</a>";
				$title = 'Сообщение успешно добавленно';
				fclose($fr);
			} else {
				$text_show = "Произошла ошибка при добовления сообщения. Поробуйте позже. <br> <a href=\"java script:window.history.back();\">Назад</a>";
				$title = 'Произошла ошибка при добовление сообщения';
				fclose($fr);
			}
		}

	} else {
		$text_show = "Вы не заполнили поля";
		$title = "Вы не заполнили поля";
	}
?>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title><?=$title;?></title>
<link rel="stylesheet" type="text/css" href="styles/style.css">
</head>

<body>
<div id="all" style="vertical-align:middle;">
<div id="main">
<?=$text_show;?>
<p>
<ul>
<?php
	if($status) {
		foreach($text_er as $val) {
?>
		<li><?=$val;?></li>
<?php
		}
		echo "<a href=\"java script:window.history.back();\">Назад</a>";
	}
?>
</ul>
</div>
</div>
</body>
</html>
Вот в чем проблема, в самом начале, когда был ток один файл все работало, но когда код разделил, при заполнение форм, мне всегда показывает сообщение, что все поля заполнены неверно, даже когда они верны.
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
Посмотрим на код!
Код:
if(isset($_POST['submit'])) {  //Если submit нажата
.....
} else { //Если не нажата
		$text_show = "Вы не заполнили поля";
		$title = "Вы не заполнили поля";
}
Надеюсь одна ошибка понятна! А там может и все отсальные теже!

Посмотрите что возвращает $status и тогда всё будет понятно! учитесь дебагить программы!
 

Fliand

Well-Known Member
Регистрация
16.09.2007
Сообщения
81
Код:
if(isset($_POST['submit'])) {  //Если submit нажата
.....
} else { //Если не нажата
		$text_show = "Вы не заполнили поля";
		$title = "Вы не заполнили поля";
}
Это я сделал, для того чтобы если сразу бы в браузере запросили стр. add_message.php, чтоб было поятно, что они должны сначало заполнить поля.
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
Что возвращает $status? Скажешь, отвечу далее, а то нема...
 

Fliand

Well-Known Member
Регистрация
16.09.2007
Сообщения
81
Смотри. Вот если предположить, что у нас все поля верны кроме поля с текстом и пробежаться глазами по функции.
это условие небудет выполняться поидее, т.к мы преположили, что у нас поле имя верно, следовательно $status остатся false и в глобальный массив $text_er ничего не добовляеся.
Код:
if(preg_match('/\S/', $name) == false || (strlen($name)) > 20) {			
			$status = true;
			$text_er[] = 'Неверно поле Nick';
}
Дальше поле email, с ним все тоже.

Терь поле текст, т.к мы предположили, что поле текст неверно, следовательно условие выполняется. Значит переменная $status становится true и в глобальный массив $text_er добавляется один элемент.

Код:
if(preg_match('/\S/', $text) == false || (strlen($text)) > 500) {
			$status = true;
			$text_er[] = 'Неверно введен текст сообщения';
}
дальше функция возвращает значение true, означающее, что у нас не все поля верны.

А вот тут мы проверяем переменную $status и взависимости от значения выводим список ошибок.

Код:
<?php
echo $status;
	if($status) {
		foreach($text_er as $val) {
?>
		<li><?=$val;?></li>
<?php
			   }
		echo "<a href=\"java script:window.history.back();\">Назад</a>";
	}
?>
Вроде все правильно. Тогда почему он всегда выводит, будто все поля неверны. Можно предположить, что выполняются все условия, но почему.
 

Fliand

Well-Known Member
Регистрация
16.09.2007
Сообщения
81
Все я решил проблему. Надо было объявить переменные $name, $email, $text, тоже глобальными. Ведь я их в функции проверки запрашиваю. Ступил. :unsure: Но у меня вопрос. Почему когда я объявлял их глобальными в add_message.php, то неработало, а когда объявил в функции проверки форм, то заработало.
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
Я на глаз тебе не скажу, либо мне надо самому попробовать, посмотреть что где возвращается!
Пришли мне скрипт по аське!
Раз выводятся ошибки, значит каждый preg_match выполняется...
Да и подобные регулярки мне не нравятся, больше привык к PCRE
Пришли мне скрипт по аське, я разбирусь!
 
Статус
Закрыто для дальнейших ответов.
Верх Низ