2009-11-24 5 views
0

У меня есть два сценария, над которыми я работаю. Первый получает $ agentID через GET (а также некоторые другие данные через другие переменные GET), а затем ищет $ firstName и $ lastName в базе данных по $ agentID. После этого он отображает $ firstName, $ lastName и $ agentID на экране, как текст в форме (не в форме ввода). После того, как форма отправлена, $ agentID и данные формы должны быть записаны в базу данных как часть новой записи, тогда $ agentID, $ firstName, $ lastName и данные формы хранятся в переменных SESSION, поэтому данные могут быть отображается на странице подтверждения. У меня возникла проблема: $ agentID, $ firstName, $ lastName не записываются в базу данных, переменные SESSION, и, даже не будут помещать значения в электронную почту! Оба сценария начинают сеанс как первое. Я проверил первый скрипт много раз, чтобы убедиться, что переменные не переписаны, не установлены или что-то еще.PHP потерял данные для двух переменных

Вот код, и я надеюсь, что кто-то может увидеть, что я, по-видимому, нет. Это от первого сценария:

session_start(); 
$mySQLdb = EstablishConnection("table"); 
$agentID = $_GET['agent']; 
$agentData = SurveyAgent($agentID); 
$agentDataArray = explode(".", $agentData); 
$agentFirstName = $agentDataArray[0]; 
$agentLastName = $agentDataArray[1]; 
$agentFullName = $agentFirstName." ".$agentLastName; 

Вызов SurveyAgent устанавливает свое собственное подключение к базе данных, используя один и тот же код, как в первой строке в предыдущем блоке. SurveyAgent() находится в включенном файле. Вот важные биты из SurveyAgent():

$mySQLselect = "SELECT lname, fname FROM table WHERE id_no='$userID';"; 
$sponsorData = $mySQLrow[1].".".$mySQLrow[0]; 
return $sponsorData; 

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

$_SESSION['agentID'] = $agentID; 
$_SESSION['agentName'] = $agentFullName; 
$body = $agentFullName.", ".$agentID; 
mail("[email protected]", "test", $body, "From: [email protected]"); 
header("Location: http://www.domain.com/path/to/script.php"); 

Второй сценарий начинается так:

session_start(); 
$agentID = $_SESSION['agentID']; 
$agentName = $_SESSION['agentName']; 

Второй сценарий получает несколько других переменных с помощью сеанса от первый скрипт. $ agentID и $ agentName являются единственными двумя переменными, с которыми я столкнулся. Я попытался изменить имена переменных, включая имена ключей SESSION. Если я жестко кодирую значение $ agentID, а не получая его через GET, все работает нормально. Для меня нет никакого смысла, почему первый скрипт отображает данные, полученные через GET и запрос базы данных, но не передаст их нигде. Любая помощь приветствуется. Если мне нужно разместить больше кода, я сделаю это. Благодаря!

+1

Являются ли ваши сценарии в разных доменах? –

+0

Это также может быть хорошей идеей для переменных 'print_r' или' vardump' в середине и сравнить результат с тем, что, по вашему мнению, должно быть там. –

+0

Также полезно показать весь ваш код. Тот же код, который вы используете. Пример '$ sponsorData', как показано, делает то, что вы говорите. Но он не получит данные из базы данных. –

ответ

1

Вы пытаетесь ссылаться на глобальные переменные изнутри функции, не объявляя их global?

0

Сценарии находятся в одном домене. Область переменных не является проблемой, так как я храню и отображаю данные, полученные либо GET, либо возвращенные из функции SurveyAgent(). Приносим извинения за отказ от кода, который фактически выполняет запрос select. Я не считал это важным, потому что знаю, что SurveyAgent() делает то, что он должен делать, иначе первый скрипт не сможет отобразить имя и фамилию агента в браузере. Тем не менее, в соответствии с просьбой, вот полный код из SurveyAgent():

$userID = $userID; // $userID is passed in by the function call. 
$mySQLdatabase = EstablishConnection("database"); 
// EstablishConnection connects to the server and selects the database provided as an argument. This code is known good, as it is used in multiple PHP scripts on the same domain. 
$mySQLselect = "SELECT lname, fname FROM table WHERE id_no='$userID';"; 
$mySQLquery = mysql_query("$mySQLselect") or die ("This user id does not exist."); 
$mySQLrow = mysql_fetch_row($mySQLquery); 
$sponsorData = $mySQLrow[1].".".$mySQLrow[0]; 
return $sponsorData; 

Итак, что тело функции SurveyAgent(). Я использовал var_dump в двух разных местах в моем основном скрипте. В первый раз вызывается var_dump, он отображает данные переменных и информацию о них - и это соответствует ожиданиям. Второй раз, когда он называется, переменные все пустые! Я использую скрытый ввод формы с именем «sent» со значением «true», чтобы указать, была ли форма отправлена ​​или нет.

Вот полный код, так как это прямо сейчас:

$agentID = $_GET['agent']; 
//$agentID = "000001"; 
$ipAddress = $_GET['ip_address']; 
// Uncomment the following line and comment out the line after when a date is passed via GET. 
//$date_generated = $_GET['date_generated']; 
$date_generated = date("n/j/Y"); 
$time_generated = $_GET['time_generated']; 
$first_name = $_GET['first_name']; 
$last_name = $_GET['last_name']; 
$mailing_address = $_GET['address1']; 
$mailing_city = $_GET['city']; 
$mailing_state = $_GET['state']; 
$mailing_postal_code = $_GET['postal_code']; 
$mailing_country = "US"; 
$primary_phone = $_GET['phone_number']; 
$email = $_GET['email']; 

$dateMassacre = explode("/", $date_generated); 

$dateMassacre[0] = preg_replace("/[^\d]/", "", $dateMassacre[0]); 
$dateMassacre[1] = preg_replace("/[^\d]/", "", $dateMassacre[1]); 
$dateMassacre[2] = preg_replace("/[^\d]/", "", $dateMassacre[2]); 

if ($dateMassacre[0] < 10) 
{ 
    $dateMassacre[0] = "0".$dateMassacre[0]; 
} 

if ($dateMassacre[1] < 10) 
{ 
    $dateMassacre[1] = "0".$dateMassacre[1]; 
} 

$date_generated = $dateMassacre[2]."-".$dateMassacre[0]."-".$dateMassacre[1]; 

$agentData = SurveyAgent($agentID); 
$agentDataArray = explode(".", $agentData); 
$agentFirstName = $agentDataArray[0]; 
$agentLastName = $agentDataArray[1]; 
$agentFullName = $agentFirstName." ".$agentLastName; 

var_dump($agentFirstName, $agentLastName, $agentFullName, $agentID, $agentData, $agentDataArray); // var_dump #1 
var_dump($first_name, $last_name, $mailing_address, $mailing_city, $mailing_postal_code, $mailing_state, $primary_phone, $email); // var_dump #2 

if (isset($_POST['sent'])) 
{ 
    var_dump($agentFirstName, $agentLastName, $agentFullName, $agentID, $agentData, $agentDataArray); // var_dump #3 
    var_dump($first_name, $last_name, $mailing_address, $mailing_city, $mailing_postal_code, $mailing_state, $primary_phone, $email); // var_dump #4 

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

$first_name = $_POST['first_name']; 
$firstNameFlag = ValidateFirstName($first_name, false); 

$last_name = $_POST['last_name']; 
$lastNameFlag = ValidateLastName($last_name, false); 

$mailing_address = $_POST['mailing_address']; 
$mailingAddressFlag = ValidateAddress($mailing_address, false); 

$mailing_city = $_POST['mailing_city']; 
$mailingCityFlag = ValidateCity($mailing_city, false); 

$mailing_state = $_POST['mailing_state']; 
$mailingStateFlag = ValidateState($mailing_state, false); 

$mailing_postal_code = $_POST['mailing_postal_code']; 
$mailingPostalCodeFlag = ValidatePostalCode($mailing_postal_code, false); 

$primary_phone = $_POST['primary_phone']; 
$primaryPhoneFlag = ValidateTelephoneAlternate($primary_phone, false); 

$email = $_POST['email']; 
$validator = new EmailAddressValidator(); 
if ($validator->check_email_address($email)) 
{ 
    $email = strtolower($email); 
    $emailFlag = true; 
} 
else 
{ 
    $emailFlag = false; 
} 

var_dump($agentFirstName, $agentLastName, $agentFullName, $agentID, $agentData, $agentDataArray); // var_dump #5 
var_dump($first_name, $last_name, $mailing_address, $mailing_city, $mailing_postal_code, $mailing_state, $primary_phone, $email); // var_dump #6 

Выход var_dump # 1 перед отправкой формы: строка (7) «Клеман» строка (5) " Смит "(13)" Clement Smith "string (6)" 000002 "string (13)" Clement.Smith "array (2) {[0] => строка (7)" Clement "[1] => строка (5) «Смит»}

Результат var_dump # 2 перед отправкой формы: строка (6) строка «Норрин» (4) строка «Radd» (19) «строка 1234 S. Shepherd Rd» (9)) Строка «Городское имя» (5) «12345» строка (2) строка «WI» (10) «1234567890» строка (24) «[email protected]»

Результат var_dump # 1, # 3 и # 5 после отправки формы: string (0) "" string (0) "" string (1) "" NULL string (1) "." array (0) "" [1] => string (0) ""}

Вывод var_dump # 2 и # NULL, NULL, NULL, NULL, NULL,

выход var_dump # 6 после отправки формы: строку (6) "Норрин" строка (4) "Радд" строка (19) "1234 С. Шеперд Rd" строка (9) Строка «Городское имя» (5) «12345» строка (2) строка «WI» (10) «1234567890» строка (24) «[email protected]ter.net»

Мне интересно, что переменные в четном пронумерованные вызовы var_dump теряют свои данные после отправки формы, пока я не заново импортировал данные из POST. Еще один интересный факт: если я использую эту прокомментированную строку «// $ agentID =« 000001 »; (и закомментируйте строку GET сразу над ней), тогда переменные в нечетных нумерованных вызовах var_dump никогда не теряют свои данные. Кроме того, я не уверен, почему некоторые переменные будут отображаться как «строка (0)», а другие - «NULL», но я не считаю это очень важным. Возможно, это так, и если да, пожалуйста, сообщите.

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

EDIT

Я добавил пару скрытых входных форм, из которых я могу повторно получить данные агента от POST, и это работает! Благодарим вас за предложение использовать var_dump для отслеживания проблемы, поскольку это имеет решающее значение для решения этой проблемы.

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