2013-04-20 3 views
0

У меня есть две формы для регистрации. С первого шага я подбираю адрес электронной почты и имя пользователя, и со второго шага хочу забрать первое имя и фамилию и добавить его в БД. Но проблема в том, что переменные, которые у меня есть с первой формы POST, а точнее, $bridge_username, не доступны в инструкции IF ниже (первый снизу). Дело в том, что они видны где угодно, но не внутри этого конкретного заявления IF. Я пробовал все, включая сеансы. Я могу ясно видеть, что переменная все еще существует (с использованием vardump или просто echo), везде, но не там, где мне это нужно ... Буду рад услышать ваши советы.PHP-переменная не видна внутри оператора IF

$bridge_email = $_POST['email']; 
$bridge_username = $_POST['username']; 
$bridge_pass = $_POST['password']; 
$bridge_pass_conf = $_POST['passconf']; 
$bridge_terms = $_POST['terms']; 
$bridge_pass_counted = strlen($bridge_pass); 
$bridge_username_counted = strlen($bridge_username); 
if (isset ($_POST['email']) AND isset ($_POST['password']) AND isset ($_POST['passconf']) AND isset ($_POST['username'])) { 

if ($bridge_email != '' AND $bridge_pass != '' AND $bridge_pass_conf != '' AND $bridge_username != '' AND $bridge_terms != '') { 

if ($bridge_pass == $bridge_pass_conf) { 

if ($bridge_pass_counted >= 33 OR $bridge_pass_counted <= 5) { 
} else { 

if ($bridge_username_counted >= 65 OR $bridge_username_counted <= 3) { 
} else { 

if (is_numeric(substr($bridge_username, 0, 1))) { 
       } else { 
//CHECK IF USERNAME OR EMAIL ALREADY EXIST 
$checkreguser = $mysqli->query("SELECT username FROM `engine_users` WHERE username = '$bridge_username' OR email = '$bridge_email' LIMIT 0, 1 "); 
$checkreguser = $checkreguser->fetch_assoc(); 
if ($checkreguser == '') { 
//CREATING A NEW USER 
$mysqli->query("INSERT INTO `users` (`id`, `username`, `password`, `email`, `fname`, `lname`, `company`, `address`, `city`, `state`, `zip`, `country`, `currency`, `phone`, `vat`, `userlevel`, `created`, `notes`, `lastlogin`, `lastip`, `active`) VALUES\n" 
    . "(NULL, '$bridge_username', '1411678a0b9e25ee2f7c8b2f7ac92b6a74b3f9c5', '$bridge_email', '', '', NULL, '', '', '', '', '', '', '', NULL, 5, '2011-05-01 18:10:14', '', '2013-04-19 22:25:11', '127.0.0.1', 'y')"); 
}}}}}}} 

$bridge_fname = $_POST['1_1_3']; 
$bridge_lname = $_POST['1_1_4']; 
if (isset ($_POST['1_1_3']) AND isset ($_POST['1_1_4'])) { 
$mysqli->query("UPDATE `users` SET `fname` = '$bridge_fname',`lname` = '$bridge_lname' WHERE `users`.`username` = '$bridge_username'"); 
} 
+0

Возможно, это не ваша проблема, но вы обращаетесь к некоторым переменным '_POST', прежде чем вы обнаружите, что они существуют. Почему бы не изменить порядок? И что заставляет вас говорить «не видно»? Не могли бы вы показать результат vardump непосредственно перед и сразу после операторов if? – Floris

+1

Значения внутри одинарных кавычек не расширяются ... У вас есть '' $ bridge_username '' в одинарных кавычках, что делает его строкой, а не переменной, если я не ошибаюсь. – Floris

+0

Ваш скрипт может быть уязвим для SQL-инъекций. Обязательно проверьте и [правильно обработайте предоставленные пользователем параметры] (http://stackoverflow.com/q/60174/53114). – Gumbo

ответ

0

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

..." username = '$bridge_username' " 

это приведет к строке, как вы видите его
(это хорошо отладки для печати запросов, перед их выполнением) вы должны изменить его на:

." username = '".$bridge_username."' " 

а переменная будет заменена ее значением.

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

$bridge_email = (isset($_POST['email']) ? $_POST['email'] : null); 
$bridge_username = (isset($_POST['username']) ? $_POST['username'] : null); 
$bridge_pass = (isset($_POST['password']) ? $_POST['password'] : null); 
$bridge_pass_conf = (isset($_POST['passconf']) ? $_POST['passconf'] : null); 
$bridge_terms = (isset($_POST['terms']) ? $_POST['terms'] : null); 
//$bridge_pass_counted = strlen($bridge_pass); 
//$bridge_username_counted = strlen($bridge_username); 

//return early and stay back from chained IFs 
if (!$bridge_email || !$bridge_username || !$bridge_pass || !$bridge_pass_conf) { 
    return; 
} 

if ($bridge_pass != $bridge_pass_conf) { 
    return; 
} 

if ($bridge_pass AND strlen($bridge_pass) > 5 AND strlen($bridge_pass) < 33) { 
    return; 
} 

if ($bridge_username AND strlen($bridge_username) > 5 AND strlen($bridge_username) < 33) { 
    return; 
} 

if (is_numeric(substr($bridge_username, 0, 1))) { 
    return; 
} 

$result = $mysqli->query("SELECT username FROM `engine_users` WHERE username = '" . $bridge_username . "' OR email = '" . $bridge_email . "' LIMIT 0, 1 "); 
$checkreguser = $result->fetch_assoc(); // returns associative array of strings or NULL if there are no more rows 
//if ($checkreguser == '') { 

if ($checkreguser === null) { 
//CREATING A NEW USER 
    $mysqli->query("INSERT INTO `users` (`id`, `username`, `password`, `email`, `fname`, `lname`, `company`, `address`, `city`, `state`, `zip`, `country`, `currency`, `phone`, `vat`, `userlevel`, `created`, `notes`, `lastlogin`, `lastip`, `active`) VALUES\n" 
      . "(NULL, '" . $bridge_username . "', '1411678a0b9e25ee2f7c8b2f7ac92b6a74b3f9c5', '" . $bridge_email . "', '', '', NULL, '', '', '', '', '', '', '', NULL, 5, '2011-05-01 18:10:14', '', '2013-04-19 22:25:11', '127.0.0.1', 'y')"); 
} 

$bridge_fname = (isset($_POST['1_1_3']) ? $_POST['1_1_3'] : null); 
$bridge_lname = (isset($_POST['1_1_4']) ? $_POST['1_1_4'] : null); 
if ($bridge_fname AND $bridge_lname) { 
    $mysqli->query("UPDATE `users` SET `fname` = '" . $bridge_fname . "',`lname` = '" . $bridge_lname . "' WHERE `users`.`username` = '" . $bridge_username . "'"); 
} 

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

0

Использование

if(isset($_POST['bridge_username'])) 

Чтобы увидеть, если она существует.

Вы также можете использовать ternary operator:

$email = isset($_POST['bridge_username']) ? $_POST['bridge_username'] = false; 

и вы .. «$ bridge_username быть точным, не имеется в заявлении, если она ниже.»

Покажите нам точную ошибку, если вы хотите получить более подробный ответ :)

+0

Вот почему я здесь, это не дает мне никаких ошибок, поэтому я как бы застрял. Я попытался сделать так, как вы сказали, и понял, что '$ bridge_username' и все остальные переменные из первой POST доступны через весь php-файл, но ТОЛЬКО, если вы не используете их в инструкциях IF. –

+0

Что значит «ошибка»? В чем же проблема? Разве это не просто идет к части ELSE и концу истории? – Jonast92

+0

Я имею в виду никаких сообщений об ошибках. когда вы используете этот var не внутри IF-операторов, он работает просто отлично, в противном случае 'echo' показывает его как простой текст' $ bridge_username' Я просто предположил, что это просто недостаток знаний теории, и для этого есть простое объяснение ... –

0

http://php.net/manual/en/function.isset.php

Я бы попытаться сломать ваш код вниз до простых нескольких строк и проверить, если заявление. Лучше определить, где он ломается. Может быть, добавить несколько эхо-заявлений на разных этапах или комментариев и пройти через код. Пример ниже.

$bridge_email = $_POST['email']; 
$bridge_pass = $_POST['password']; 

if (isset($_POST['email']) AND isset($_POST['password']){ 
    // EXECUTE AN ALERT 
echo"email and pass are set"; 
}else { 
echo"not passing"; 
} 
+0

Я попробую, но дело в том, что все операторы IF, включая последний, работают хорошо, они просто не читают предыдущие данные POST, даже если они были переданы в vars или даже сессия. С другой стороны, с любыми другими варами внутри (которые не происходят из старых данных POST) все в порядке. Я просто не могу найти здесь никакой логики ... –

0

Вы проверяете, был ли сеанс запущен. Я вижу, что вы продолжаете упоминать, что данные были переданы на сеанс. Может захотеть установить это, чтобы убедиться, что он обрабатывается.

Попробуйте проверить, была ли создана переменная сеанса, а если не перенаправлена ​​на страницу регистрации/входа.

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

session_start(); 
if(!session_is_registered(myusername)){ 
header("location:main_login.php"); 

Вы можете дополнительно протестировать сеанс, повторив содержимое на isset в сеансе, чтобы продолжить тестирование. Опять же, я бы разбил ваш код на самую основную форму, чтобы узнать, что происходит. Также может потребоваться увидеть предыдущий код страницы, чтобы увидеть, что происходит.

нашел еще один пример онлайн, который может помочь вам. http://www.phpeasystep.com/phptu/6.html

Смежные вопросы