PHP丢失了两个变量的数据

时间:2009-11-24 22:55:16

标签: php session variables get

我正在处理两个脚本。第一个通过GET接收$ agentID(以及通过其他GET变量的其他一些数据),然后通过$ agentID在数据库中查找$ firstName和$ lastName。完成后,它会在屏幕上显示$ firstName,$ lastName和$ agentID,作为表单中的文本(不在表单输入中)。提交表单后,$ agentID和表单数据将作为新记录的一部分写入数据库,然后$ agentID,$ firstName,$ lastName和表单数据存储在SESSION变量中,因此数据可以是显示在确认页面上。我遇到的麻烦是$ agentID,$ firstName,$ lastName没有写入数据库,SESSION变量,它甚至不会将值放在电子邮件中!这两个脚本首先启动会话。我一遍又一遍地检查了第一个脚本,以确保变量没有被覆盖,未设置或任何内容。

这是一些代码,我希望有人能看到我显然不是。这是第一个脚本:

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;

我最初把从数据库返回的数据放入一个数组并返回数组,但是当事情不能正常工作时,我将其更改为只连接两个部分之间的时间间隔使用explode(作为代码当前一样)。最后,第一个脚本以这种方式封装(在写入数据库之后):

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

第二个脚本的开头如下:

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

第二个脚本通过SESSION从第一个脚本接收其他几个变量。 $ agentID和$ agentName是我遇到问题的唯一两个变量。我试过更改变量的名称,包括SESSION键的名称。如果我硬编码$ agentID的值,而不是通过GET接收它,一切正常。对我来说,为什么第一个脚本显示通过GET和数据库查询接收的数据,但不会将它们传递到任何地方。任何帮助表示赞赏。如果我需要发布更多代码,我会这样做。谢谢!

2 个答案:

答案 0 :(得分:1)

您是否尝试从函数内部引用全局变量而不声明它们global

答案 1 :(得分:0)

脚本位于同一个域中。变量范围不是问题,因为我存储和显示通过GET或从函数SurveyAgent()返回的数据。我为遗漏实际执行选择查询的代码而道歉。我不认为这很重要,因为我知道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的输出: string(7)“Clement”string(5)“Smith”string(13)“Clement Smith”string(6)“000002”string(13)“Clement.Smith”array(2){[0] =&gt; string(7)“Clement”[1] =&gt; string(5)“Smith”}

提交表单前var_dump#2的输出: string(6)“Norrin”string(4)“Radd”string(19)“1234 S. Shepherd Rd”string(9)“City Name”string(5)“12345”string(2)“WI”string(10) )“1234567890”字符串(24)“emailaddress@charter.net”

提交表单后var_dump#1,#3和#5的输出: string(0)“”string(0)“”string(1)“”NULL string(1)“。” array(2){[0] =&gt; string(0)“”[1] =&gt; string(0)“”}

提交表单后var_dump#2和#4的输出: NULL NULL NULL NULL NULL NULL NULL NULL

提交表单后var_dump#6的输出: string(6)“Norrin”string(4)“Radd”string(19)“1234 S. Shepherd Rd”string(9)“City Name”string(5)“12345”string(2)“WI”string(10) )“1234567890”字符串(24)“emailaddress@charter.net”

我发现有趣的是,在提交表单之后,偶数编号的var_dump调用中的变量会丢失其数据,直到我从POST重新导入数据之后。另一个有趣的事实是,如果我使用这个注释掉的行“// $ agentID =”000001“;” (并在其上方注释掉GET行),然后奇数编号var_dump中的变量调用从不丢失其数据。另外,我不确定为什么有些变量会被报告为“string(0)”而其他变量被报告为“NULL”,但我不认为这非常重要。也许是,如果是的话,请告知。

我将尝试添加表单输入,我可以在提交表单后重新获取代理的信息,看看是否有所作为。我会回复结果。

编辑

我添加了一对隐藏的表单输入,我可以从POST重新获取代理的数据,这是有效的!感谢您建议使用var_dump来跟踪问题,因为这对于解决问题至关重要。