【问题标题】:To find a reason of missing GET variables in PHP查找 PHP 中缺少 GET 变量的原因
【发布时间】:2009-08-12 00:02:04
【问题描述】:

如何在 PHP 中获取 URL 中的变量到下一页?

用户在该网址

 http://localhost/codes/index.php?ask_question&email=masi@gmail.com&passhash_md5=202cb962ac59075b964b07152d234b70

他发送了一个问题,然后转到以下网址,其中变量由于某种未知原因而丢失了它们的值。

http://localhost/codes/index.php?question_sent&email=&passhash_md5=

以下代码为代码handle_a_new_question.php

 $result = pg_prepare($dbconn, "query77", "INSERT INTO questions
     (body, title, users_user_id)
     VALUES ($1, $2, $3);");
 $result = pg_execute($dbconn, "query77", array($body, $title, $user_id));

 if(isset($result)) {
     $header = ("Location: /codes/index.php?"                                                                                                                                                           
         . "question_sent"
         . "&"
         . "email="
         . $_GET['email']             // this seems to be correct to me
         . "&"
         . "passhash_md5="
         . $_GET['passhash_md5']      // this seems to be correct to me too
         );
     header($header);
  }

您发现代码中有任何错误吗?

【问题讨论】:

    标签: php url get


    【解决方案1】:

    表单代码是什么样的?问题出在将您引导至 question_sent 页面的页面上,而不是在 question_sent 页面本身上。

    您是在隐藏字段中还是在表单的操作中传递这些变量,例如

    <form method="post" action="index.php?question_sent&email=<?php echo $_GET['email']?>&passhash_md5=<?php echo $_GET['passhash_md5']?>">
    

    或者你是否使用隐藏变量

    <form method="post" action="index.php?question_sent">
       <input type="hidden" name="email" value="<?php echo $_GET['email']?>" />
       <input type="hidden" name="passhash_md5" value="<?php echo $_GET['passhashmd5']?>" />
       ...
    </form>
    

    因为其中任何一个都应该起作用,所以首先您可以从 $_GET 中检索您的变量,然后您可以从 $_POST 中检索它们。

    同样对于用户会话,您可能应该将他们的登录信息存储在 cookie 中,有机会时看看这个

    http://www.tizag.com/phpT/phpcookies.php

    【讨论】:

    • 这是表单代码:github.com/vilsu/codes/blob/…
    • 我不使用隐藏变量。
    • 您可能应该使用隐藏变量。您必须使用这三种方法之一将 email 和 passhash_md5 变量传递到下一个脚本,以正确顺序:1.使用 cookie 2.在表单中使用隐藏变量 3.在表单本身的 action 属性中
    • 另外,为了测试这样的东西,您应该将 if(isset($result)) 块中的 $_GET 替换为 $_REQUEST。这将在 $_POST、$_GET 和 $_COOKIE 中查找变量。但就像我说的,如果你没有从这些数组之一的表单中传递变量,你将无法访问数据
    • @Neil:如何访问表单中的隐藏变量?
    【解决方案2】:

    尝试使用会话处理程序代替 GET 变量。在我看来,它确实为您的代码添加了一些击键,但可以为您省去很多麻烦。

    【讨论】:

    • 如果我使用 SESSION 处理程序,我不需要在 $_GET 中清理我的数据。嗯 - 我需要研究一下。
    【解决方案3】:

    确保数据是通过 POST 发送的。所以可以这样检索:

    $_POST['email']

    顺便说一句:

    1. 在进行重定向之前不要忘记清理数据(在您的示例中没有这样做)。
    2. 不要忘记“加盐”您的哈希,否则它可能不安全。

    【讨论】:

    • 我不明白第 (1) 点,因为代码使用的是准备好的语句 pg_prepare。这应该清理数据。 - 我是新手,请随时发表评论。 - (2): 我会在我的代码第一次工作时。
    • 在你的 header() 调用中使用 $_GET 变量之前,你需要对它们进行 HTTP/URL 清理
    【解决方案4】:

    在创建标头之前打印您的 $_GET 并检查 vars 是否为空:

    print_r($_GET);
    

    或者试试

    $_REQUEST['email']
    

    而不是

    $_GET['email'] 
    

    哦!并且不要忘记添加

    exit();
    

    之后:

    header($header);
    

    如果你在没有有效$result的情况下做某事,例如:

     if(isset($result)) {
         $header = ("Location: /codes/index.php?"                                                                                                                                                           
             . "question_sent"
             . "&"
             . "email="
             . $_GET['email']             // this seems to be correct to me
             . "&"
             . "passhash_md5="
             . $_GET['passhash_md5']      // this seems to be correct to me too
             );
         header($header);
      }
    
      sendEmailToMe('FAILED!!');
    

    “sendEmailToMe('FAILED!!')”是否可以执行,即使 $result 有效。

    【讨论】:

    • 我之前从未使用过命令exit();。我把它放在我的处理程序的末尾,它使我的页面无法工作。它仅在文件 handle_a_new_question.php 中不会引起任何冲突。
    • 如何让 PHP 向您发送电子邮件?我跑不成功mail(mais@gmail.com, foo, foo foo);
    • 打印 $_REQUEST 数组:print_r($_REQUEST);尝试在 PHP 的第一行打印它,如果你没有得到任何你没有使用 GET 参数请求的东西。
    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多