【问题标题】:PHP: How to grab a variable from _POST in an other php file (using slim)PHP:如何在另一个 php 文件中从 _POST 中获取变量(使用 slim)
【发布时间】:2018-09-29 00:16:52
【问题描述】:

我正在尝试学习如何使用 slim 框架为网站创建注册和身份验证。我的目标是为 POST 制作一个处理程序,并在经过适当身份验证后,网站将保存用户名和名称。这样当用户下次访问该页面时,网站会通过说出他们的名字来问候他们。我将通过两个单独的 PHP 文件执行此操作,但我相信问题出在这个 PHP 文件中。

这是我目前拥有的:

$app->post('/users', function (Request $request, Response $response, array $args) {
       $user = array('username'=> $_POST['username'], 'password' => $_POST['password'], 'name' => $_POST['name']);
       $res = saveUser($user);
       if($result === true) { return $response->withRedirect('login.html', 302); }
       return $response->withRedirect('registration.html#',$result,302); });    


$app->post('/auth', function (Request $request, Response $response, array $args) {
   if(isset($_POST['username']) {
       return $response->withRedirect('welcome.php', 302); 
   }

   if(authUser($_POST['username'], $_POST['password']) === true) {
       $_SESSION["username"] = $_POST['username']; 
       $_SESSION["name"] = $_POST['name'];

       return $response->withRedirect('welcome.php', 302);
   }
   else { //authentication doesn't work, destroy session and go to login page
       session_destroy();
       return $response->withRedirect('login.html',302);      
   }

据我了解,用户名、密码和用户的真实姓名应该保存在_POST 中。但是,当我使用时:

var_dump($_POST);

密码和用户名是唯一在被调用时显示的。这让我相信这就是为什么我的“welcome.php”不欢迎用户。

这里是我的welcome.php的内容:

<?php session_start(); ?>
!DOCTYPE html
<title> Welcome! </title>
<h1> Welcome Page </h1>
<section> 
<p>
<?php
if(isset($_SESSION['name'])) { echo "Grettings " . $_SESSION['name']. "! ";} 
?> Click <a href="login.html">here to login</a> OR <a href="registration.html"> here for registration</a>.
 </p>
</section>

我认为我的错误一定是我尝试调用它的方式或在 isset 函数中,但同样,我不知道为什么名称没有正确保存。

【问题讨论】:

    标签: php authentication post slim


    【解决方案1】:

    以这种方式访问​​全局变量通常被认为是不好的形式。当您运行苗条时,他们有一个请求对象可供您使用,您已经传入:

    $myArgs = $request->getQueryParams();
    foreach($myArgs as $key => $value){
        echo $key . '=>' . $value . PHP_EOL;
    }
    

    也就是说,你的问题的原因是这样的:

    $response->withRedirect(..)
    

    这会向浏览器返回一个 http 302 重定向到一个新的 url。这是第二次打击。第一个命中是对 /auth 的 POST,第二个命中是对 /welcome.php 的 GET 请求

    让我印象深刻的另一件事是您在 /auth 上的逻辑路径。如果在 $_POST 中设置了“用户名”,那么您首先将它们发送到 welcome.php,其他代码(如对 authUser(..) 函数的调用)永远不会被执行。由于您从未将 $_SESSION['username'] 设置为任何内容,因此它仍然是空白的。

    我要说的最后一件事只是一个风格点;我个人尝试尽可能对字符串使用单引号(')并避免使用双引号(“),因为双引号告诉 PHP 字符串中可能包含可能需要解析的特殊标记。如果您不解析标记,只需使用单引号。除此之外,欢迎使用 PHP,我很高兴看到你所做的!

    【讨论】:

    • 感谢您的更正。但是,错误仍然发生。删除 if(isset) 时(更改了重定向),它重定向到 welcome.php。在有问题的 php 文件中通过“$name=request->getParam('name')”获取和回显变量会将自身重定向到空白页面。我相信这是因为名称中的空值。另外,我出于测试目的删除了 if(isset) 并省略了 $name=request->...,它会重定向到空白页面。
    • 我为双重评论道歉,但我相信我应该提到我已将我的 if(isset) 语句更改为 if(isset($_SESSION['username'])) { header("位置:index.php", true); } 来自 $_POST['username'] 的更正。
    • header("location: index.php", true); 仍在进行重定向,我在第一段中所说的仍然适用,在 /auth 上也是您不应该拥有该会话检查代码的地方,因为未经身份验证的其他情况登录?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多