DLE: Как передать значение question_answer в ?do=register с главной страницы ?

123
MJ
На сайте с 29.12.2009
Offline
44
#11
Array ( [do] => register [name] => ololo => ololo@ololo.ru [password1] => 123123 [password2] => 123123 [question_answer] => 5 [submit] => Зарегистрироваться [submit_reg] => submit_reg )

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

---------- Добавлено 03.12.2014 в 15:17 ----------

Нашел еще одну строчку, в register.php, отвечающую за контрольный вопрос:

if( !$reg_error AND !$stopregistration ) {

$stronghash = sha1(DBHOST . DBNAME . SECURE_AUTH_KEY);

if( $config['registration_type'] ) {

много разного текста не касающегося question...

$_SESSION['question'] = false;

много разного текста не касающегося question...

}

}
Mad_Man
На сайте с 10.11.2008
Offline
162
#12

MusicJam, залейте register.php целиком на пастебин.

MJ
На сайте с 29.12.2009
Offline
44
#13
Mad_Man
На сайте с 10.11.2008
Offline
162
#14

"Неверный ответ на контрольный вопрос" соответствует "reg_err_25", который относится к куску кода


if( $config['reg_question'] ) {

if ( intval($_SESSION['question']) ) {

$answer = $db->super_query("SELECT id, answer FROM " . PREFIX . "_question WHERE id='".intval($_SESSION['question'])."'");

$answers = explode( "\n", $answer['answer'] );

$pass_answer = false;

if( function_exists('mb_strtolower') ) {
$question_answer = trim(mb_strtolower($_POST['question_answer'], $config['charset']));
} else {
$question_answer = trim(strtolower($_POST['question_answer']));
}

if( count($answers) AND $question_answer ) {
foreach( $answers as $answer ){

if( function_exists('mb_strtolower') ) {
$answer = trim(mb_strtolower($answer, $config['charset']));
} else {
$answer = trim(strtolower($answer));
}

if( $answer AND $answer == $question_answer ) {
$pass_answer = true;
break;
}
}
}

if( !$pass_answer ) $reg_error .= $lang['reg_err_25'];

} else $reg_error .= $lang['reg_err_25'];

}

Перед строкой "if ( intval($_SESSION['question']) ) {" вставьте "$reg_error .= 'question value = ' . print_r($_SESSION['question'], true);", после чего сюда скиньте результат, повторив процедуру регистрации.

LovelAss
На сайте с 05.06.2009
Offline
96
#15

Откройте файл /index.php, найдите в нём строку


$tpl->set ( '{AJAX}', $ajax );

сразу перед ней вставьте следующий код


if( $config['reg_question'] ) {

$tpl->set( '[question]', "" );
$tpl->set( '[/question]', "" );

$question = $db->super_query("SELECT id, question FROM " . PREFIX . "_question ORDER BY RAND() LIMIT 1");
$tpl->set( '{question}', htmlspecialchars( stripslashes( $question['question'] ), ENT_QUOTES, $config['charset'] ) );

$_SESSION['question'] = $question['id'];

} else {

$tpl->set_block( "'\\[question\\](.*?)\\[/question\\]'si", "" );
$tpl->set( '{question}', "" );

}

используйте тег {question} в шаблоне main.tpl

MJ
На сайте с 29.12.2009
Offline
44
#16

Mad_Man, сейчас сделаю, но перед этим использовал способ LovelAss, он работает, данные передаются, более того, можно еще использовать тег {question}, но (!) как видим он делает 1 запрос к базе, если логически подумать, 1 запрос на 1 странице, это ж сколько запросов повалит, очень будет нагружать базу.

По идее, мне не нужно вывод {question}, т.е. запрос надо делать после отправки формы, а не постоянно.

Mad_Man
На сайте с 10.11.2008
Offline
162
#17
MusicJam:
Mad_Man, сейчас сделаю

Нет необходимости, в ответе LovelAss'а указан отсутствующий кусок логики из-за которого валидация "if ( intval($_SESSION['question']) ) {" не проходит. Избавиться от SQL запроса для всплывашки, которая и так планируется на каждой странице, вы сможете либо хардкодом (как вам советовали здесь, но сие есть неправильно) с указанием id вопроса руками, либо через AJAX запросы при вызове формы через .php-прослойку.

MJ
На сайте с 29.12.2009
Offline
44
#18
Mad_Man:
Нет необходимости, в ответе LovelAss'а указан отсутствующий кусок логики из-за которого валидация "if ( intval($_SESSION['question']) ) {" не проходит. Избавиться от подгруза вопроса для всплывашки вы сможете либо хардкодом, либо через AJAX запросы при вызове формы через .php-прослойку.

ой... для меня это дебри... придётся наверное убрать и вовсе этот вопрос-ответ

---------- Добавлено 03.12.2014 в 16:38 ----------

Спасибо Вам большое, что уделили мне своё время и помогли !

Mad_Man
На сайте с 10.11.2008
Offline
162
#19
MusicJam:
ой... для меня это дебри... придётся наверное убрать и вовсе этот вопрос-ответ

Зачем? Один дополнительный SQL запрос к таблице с вопросами не даст заметной нагрузки.

MJ
На сайте с 29.12.2009
Offline
44
#20
Mad_Man:
Зачем? Один дополнительный SQL запрос к таблице с вопросами не даст заметной нагрузки.

У меня всплывающая форма регистрации на всех страницах, а теперь представьте если будет одновременно 300 человек находиться на сайте, и на каждой странице будет SQL запрос...

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий