parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Какая-то адская жесть происходит. Что делается? Помогите, пожалуйста, всё должно быть просто :-(

Василий М. 11.05.2015 12:03

Вот почищенные для наглядности куски кода из auto.p.

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

Это форма отправки вопроса пользователя в базу данных (=на сайт) и сразу мне на почту. Она отлично работала, пока жизнь не заставила наскоряк придумывать и внедрять вот эту капчу:
@capture[]
# генерим два числа: небольшое двузначное и однозначное.
$cx(^math:random(20))
$cx($cx + 10)
$cy(^math:random(9))
$cy($cy+1)
# бросаем монету
$co(^math:random(2))
# и по результату предлагаем либо сложить два числа, либо вычесть маленькое из большого.
^if($co eq 0){Пожалуйста, введите <b>результат сложения $cx и $cy}{Пожалуйста, <b>вычтите $cy из $cx}^:</b>
# считаем должный результат для себя.
^if($co eq 0){$cr($cx+$cy)}{$cr($cx-$cy)}

Сама форма (всего-то текстовое поле, новый вызов капчи и сабмит):
@mainarea[]
<form method="post">
<textarea name="question">^if(def $cookie:ctext){$cookie:ctext}</textarea>
<p>^capture[] <input type="text" size="2" name="cres">.</p>
<input name="go" type="submit" value="Спросить">
</form>
Далее работаем:
#если написано и нажато
^if(def $form:question && def $form:go){
# если введенный результат капчи соответствует нужному
	^if($form:cres eq $cr){
# то отправляем в базу и пишем в почту
		^connect[mysql://login:pass@db.provider.ru/mydb?charset=cp1251]{
			^void:sql{
				INSERT INTO 
				`counter`.`questionaire` (
				`no` ,
				`date` ,
				`question` ,
				`answer`
				)
				VALUES (
				NULL , NULL ,  '$form:question', NULL)^;
		}}
		^mail:send[ 
		$.from[Сайт <site@mydomain.ru>] 
		$.to[Вася <mail@mydomain.ru>] 
		$.subject[Новый вопрос на сайте] 
		$.text[$form:question] 
		]
# ну и стираем кук с вопросом, подставляемым в форму
		$cookie:ctext[]
# обновляем страницу.
		$response:location[http://mydomain.ru/discuss/]
# если же введён ложный результат
	}{
# сохраняем пользовательский текст для него же (после релоуда подставить в текстарею)
		$cookie:ctext[$form:question]
# и пишем мне, чё там произошло. Что надо было сложить-вычесть, что получить и что вместо этого было вбито.
		^mail:send[ 
		$.from[Сайт <site@mydomain.ru>] 
		$.to[Вася <mail@mydomain.ru>] 
		$.subject[Не заданный вопрос на сайте] 
		$.text[Предлагалось ^if($co eq 0){сложить $cx и $cy, введен результат $form:cres вместо $cr}{вычесть $cy из $cx, введен результат $form:cres вместо $cr}^; $form:question] 
		] 
# перезагружаем страницу
		$response:location[http://mydomain.ru/discuss/]
	}
}
В результате.

В результате вопрос не добавляется в базу ни в каком случае, а я получаю в почту письмо о том, что предлагалось... провести не ту операцию, что реально отображалась! А почему-то некую сгенерированную заново! А пользователь ввёл тот результат, что я действительно ввёл, но этот результат не соответствует результату НОВОЙ операции, предложенной в письме!

Блин, когда и как задача между отображением и сабмитом генерится ещё раз, повторно?! :-(

Я попробовал вынести к чёрту переменные, сразу после генерации перенося их в куки, и везде - в своей арифметике и в отображении - используя их же. Ни фига. Результат тот же: отображается одно, а проверяется другое, новое, заново сляпанное.

Чё за?!