POST/GET-request ?

В yii часто выполняются проверки типа запроса, пришедшего от браузера.

Вот, например, здесь:


	public function actionApprove()

	{

		if(Yii::app()->request->isPostRequest)

		{

			$comment=$this->loadModel();

			$comment->approve();

			$this->redirect(array('index'));

		}

		else

			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

	}



В данном примере мы попадаем на этот метод, когда браузер посылает на сайт такой вот запрос:

http://127.0.0.1/blog/index.php?r=Comment/index#

Причем это вот условие

if(Yii::app()->request->isPostRequest)

истинно, и выполняются операторы в скобках.

[color="#FF0000"]1-ый вопрос:

откуда браузер знает, что надо формировать именно POST-запрос ???[/color]

Далее.

В скобках мы видим такой оператор - $comment=$this->loadModel();

Смотрим

$this->loadModel():


	public function loadModel()

	{

		if($this->_model===null)

		{

			if(isset($_GET['id']))

				$this->_model=Comment::model()->findbyPk($_GET['id']);

			if($this->_model===null)

				throw new CHttpException(404,'The requested page does not exist.');

		}

		return $this->_model;

	}



[color="#FF0000"]2-ой вопрос:

откуда здесь берется значение переменной $_GET[‘id’], коль скоро мы ее на сайт и не передавали ?[/color]


Понимаю, конечно, что такие вопросы могут показаться детскими, но таков уж мой уровень.

Если у кого есть время, разъясните, пожалуйста.


	

  <form action="index.php?id=2" method="post">

     <input name="post_var" type="text" value="blabla" />

     <input type="submit" />

  </form>



И того получим в

$_GET[‘id’] = 2;

$_POST[‘post_var’] = blabla;

А то что вы рассматриваете, там запрос через js отправляеться.

P.S. Может вместо форума стоит почитать книгу по PHP?

PHP конечно стоит почитать и не только PHP.

Я разумеется читаю/изучаю согласно своего плана, который включает не только PHP,

а много чего и другого, поскольку совсем недавно я начал вообще с нуля.

Из-за такого широкого фронта продвижение происходит довольно медленно, и

[b]почему бы не ускорить свое самообразование, воспользовавшись советами и наставлениями опытных

товарищей по борьбе, присутствующих на этом форуме ???[/b] Думаю у кого есть настроение и время

всегда готовы помочь. Ну а на нет, как говорится, и суда нет.


Вот и вы дали мне хороший толчок, спасибо.

Т.е., если я вас правильно понял, получается так:

По нажатию кнопки ‘submit’ браузер

  1. устанавливает соединение с сайтом

  2. формирует и посылает на сайт POST-запрос, в котором передает на сервер

    значение переменной доступной через $_POST[‘post_var’];

  3. формирует и посылает на сайт GET-запрос, в котором указывается требуемый ресурс index.php

    и значение переменной доступной через $_GET[‘id’];

  4. сервер видит, что запрошенный ресурс является PHP-программой, вызывает PHP-интерпретатор,

    программа index.php выполняется, формирует/или_нет и передает/не_передает страницу на браузер:

  5. сервер разрывает соединение с браузером.


А что касается передачи информации на сервер через js, то действительно,

посмотрев HTML-код страницы я это увидел.

Но в данном случае смотреть надо было не на сгенерированный js-скрипт, поскольку рассматривать

все сгенерированные js-скрипты жизни не хватит, а вот сюда в представление:


		<?php if($data->status==Comment::STATUS_PENDING): ?>

			<span class="pending">Pending approval</span> |

			<?php echo CHtml::linkButton('Approve', array(

				'submit'=>array('comment/approve','id'=>$data->id),

			)); ?> |

		<?php endif; ?>



Вот здесь

CHtml::linkButton(‘Approve’, array(‘submit’=>array(‘comment/approve’,‘id’=>$data->id))),

ясно видно, что “настоящий URL” содержит таки информацию для $_GET[‘id’].


[b]Но вот почему для вызова действия ‘comment/approve’, требующего значения ‘id’=>$data->id,

выбран такой "причудливый" через POST-запрос путь остается , лично мне, непонятно.

Можно было без хитростей вот так через GET-запрос:

CHtml::link(‘Approve’,array(‘comment/approve’,‘id’=>$data->id)) и не надо генерить js-скрипты.

Тут же рядом вызывается ‘comment/update’ через обычный GET-запрос -comment/update&id=17…[/b]

Учиться… Учиться? Учиться!

Не совсем так.

Запрос будет всего один.

У нас есть форма, у которой есть атрибут method, который и указывает каким способом передать значения из формы POST или GET.

GET запрос от POST запроса отличается, лишь несколькими различиями в HTTP заголовке.

Подробнее тут. Найдно в гугле по запросу "POST запрос".

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

А вот теперь представим ситуацию.

У вас есть блог на yii. Вы пишите пост какой нибудь.

Появляется нехороший человек , который знает какой контроллер отвечает за crud постов, и в коментах постит ссылку (название ссылки сами придумаете, но такое что бы сразу хотелось нажать) , ведущую на index.php?r=post/delete&id={id неугодного ему поста}.

Вы под действием алкоголя/жары/или чего потяжелее клацаете по ссылке не посмотрев куда она ведет, а так как вы еще залогинены, вы сразу удаляете свой пост.

А текущий вариант, во-первых позволяет избежать такой ситуации, во-вторых еще требует подтверждения , не замечали что при удалении у вас спрашивают "точно ли удалить?" , опять же мало ли промазали.

Большое вам спасибо.

Это вот замечание:

[b]Хочу отметить еще один важный момент, ничто не мешает, одновременно с набором параметров в Entity-Body, помещать параметры с другими именами в Request-URI, например:

POST http://www.site.ru/news.html?type=user HTTP/1.0\r\n

\r\n

login=Petya%20Vasechkin&password=qq[/b]

из приведенной вами ссылки окончательно все прояснило.

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

А эта ссылка Учиться !.. , безусловна, хороша, но, как и всегда, не все так просто. Бывает убиваешь несколько дней на абсолютную чепуху !

Эм, как бы GET данные только через QUERY_STRING передаются.

А та секция как раз POST данные.


\r\n

login=Petya%20Vasechkin&password=qq

Ладно, вот я пишу такую форму:


 <form action="action.php?p1=1&p2=2" method="post">

 <p>Your name: <input type="text" name="name" /></p>

 <p>Your age: <input type="text" name="age" /></p>

 <p><input type="submit" /></p>

</form>

В этом же каталоге программа action.php:


<?php date_default_timezone_set('Europe/Kiev');   ?>

Hi <?php echo $_POST['name']; ?>.

You are <?php echo (int)$_POST['age']; ?> years old.  

<?php echo '<br>'.$_GET['p1'].'<br>'; ?>

<?php echo '<br>'.$_GET['p2'].'<br>'; ?>

В ответ получаю нечто вроде:

Привет, Вася.

Тебе 20 лет

1

2


Какой же тогда запрос был послан на сервер ? GET или POST ?

Думаю все же, что POST потому как, если в форме задается метод GET, то name и age доступны через GET,

а p1 и p2 вообще пропадают…


Разумеется, если надоел, можете не отвечать.

Для меня, пока что, важно было понять возможность одновременного доступа к GET и POST-переменным,

которые передаются на сервер единым запросом то ли POST, то ли GET …

Внутреннюю кухню оставлю на потом.


Был отослан POST запрос. GET параметры получены из QUERY_STRING.

Вообще есть такое расширение для FF "Tamper Data" , оно занимается перехватом запросов.

Полезно кстати для отладки ajax.

Иначе говоря, хотя запрос был POST, сервер, видимо, позаботился о переброске

в $_GET[…] -переменные содержимого из $_SERVER[‘QUERY_STRING’]. Ладно, прекрасно ! На этом,

пожалуй, и остановимся, и пойдем дальше, иначе прогресса мне не достичь…


Большое спасибо !