【问题标题】:POST var not being passed in PHP whatsoeverPOST var 没有在 PHP 中传递
【发布时间】:2012-08-08 20:29:42
【问题描述】:

PHP 文件:

    <?

print_r($_REQUEST);
$thispage = 'login';
require('db.php');
if($_POST['admin_username'] && $_POST['admin_password']) {
    $query="SELECT * FROM login where name='".mysql_real_escape_string($_POST['admin_username'])."' AND pass = '".mysql_real_escape_string($_POST['admin_password'])."' AND level='admin'";
    echo $query;
    $result = mysql_query($query);
    while ($row = mysql_fetch_array($result)){

    if($row['name'] && $row['pass']) {
        $_SESSION['isAdmin'] = 1;
        $_SESSION['loggedin'] = 1;
        setcookie('isAdmin' , 1, time()+3600, '/', $settings['cookiedomain']);
        setcookie('loggedin' , 1, time()+3600, '/', $settings['cookiedomain']);
        header("Location: index.php");
        exit();}
    else {
        header("Location: login.php?msg=Invalid%20Login");
        exit();
    }
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Admin Area</title>
<link href="style.css" rel='stylesheet' />
<link rel="stylesheet" href="bubble-tooltip.css" media="screen">
<style>
.style1 {color: #171717}
</style>
</head>

<body>
<div id='content' style='width: 500px; border: 1px solid #171717; margin-top: 100px; background-color: #404040;'>
<h1 align="center"><img src="header.jpg" width="333" height="91" /></h1>
<p align="center">Welcome to the Admin Area</p>
<? if($_GET['msg']) { ?>
<center>
<p style='color: #FF9900; font-weight: bold;'><? echo $_GET['msg']; ?></p>
</center>
<? } ?>
<form id="form1" name="form1" method="post" enctype="multipart/form-data" action="">
  <table width="311" border="0" align="center">
    <tr>
      <td width="68"><strong>Username</strong></td>
      <td width="231"><input type="text" name="admin_username" style='background-color: #ffffff; border: 1px solid #1F1F1F; font-size: 11px; color: #1F1F1F; width: 200px;' /></td>
    </tr>
    <tr>
      <td><strong>Password</strong></td>
      <td><input type="password" name="admin_password" style='background-color: #ffffff; border: 1px solid #1F1F1F; font-size: 11px; color: #1F1F1F; width: 200px;'  /></td>
    </tr>
    <tr>
      <td colspan="2"><div align="center">
        <input type="submit" name="button" value="Login" />
      </div></td>
      </tr>
  </table>
</form>
<p align="center">&nbsp;</p>
</div>
<div id='footer'></div>
</body>
</html>

在顶部我有print_r($_REQUEST);,我得到的只是 Array()。当我使用print_r($_POST); 时,结果相同。

Firebug 毫无疑问地显示了正在提交的 POST 变量,并且键名完全匹配。

这是从 Firebug 复制粘贴的数据,在 POST 部分下:

Partsmultipart/form-data
admin_username  jeff
admin_password  51622384
button  Login

根据phpinfo(); 命令将post_max_size 设置为8M。

我可能错过了什么?这是在我们以前的服务器上工作的。迁移后,由于此问题,没有人可以登录。

【问题讨论】:

  • 由于您将表单发布到自己,您应该能够显示所有代码。
  • 您的服务器日志中是否有任何错误?
  • 您可以改用action=""。确保您发布到正确的页面。
  • 没有错误日志,并且 action="" 是原始脚本。为了更具体,我把它说得更明确了。再次删除它,同样的结果。返回 Array(),而不是完整的 $_POST 或 $_REQUEST 数组。
  • 在上述问题中也添加了 Firebug sn-p

标签: apache post php


【解决方案1】:

如果您要发布到同一页面,表单的操作应为 action="&lt;?=$_SERVER['PHP_SELF']; ?&gt;"

【讨论】:

  • 好的,所以我认为问题是您的 php 无法识别超全局变量。打开 php.ini 并将变量顺序设置为 GPCS。 variables_order = "GPCS"
  • 可能在您的 php.ini 中,不会设置 Get Post (GP) 变量。另外,进行任何更改后不要忘记重新启动服务器。
【解决方案2】:

您的表单看起来不错,但我有几个建议:

  1. 我不明白为什么需要 enctype="multipart/form-data"。当您希望表单上传文件时使用它。

  2. 既然您使用的是 method=POST,为什么不查看 $_POST 数组而不是 $_REQUEST 数组?

  3. 您可能需要考虑将 HTMLENTITIES 应用于 $_SERVER['PHP_SELF'] 以避免可能的漏洞利用。 (动作=)

  4. 您的新服务器是否识别 &lt;? 简写(而不是使用 &lt;?php ?&gt;)?

好的,说了这么多,我没有发现您的表单有任何问题,但我建议您考虑我建议的一些更改。

【讨论】:

  • #1 - 删除 enctype 并没有什么不同。 #2 - 尝试了 print_r($_POST) 和 print_r($_REQUEST) 以确保。没什么。 #3 - 我会调查一下,但现在我更关心为什么我的新服务器拒绝我的 POST 变量。 #4 - 绝对。 print_r($_POST) 确实返回 Array() 因此 php 命令运行良好。它只是返回一个完整的空白。
  • 我在回家的路上想到了这个。您没有看到 $_REQUEST 数组,因为您正在执行 HEADER('location 命令。因此,页面重新加载并且您什么也看不到。当您的身份验证失败时,为什么不让页面继续加载并显示错误消息?
  • 那将是天才,除了以前的编码器是这样设置的,而且我正在尽量减少我的努力来实现这一点并完成工作......真的不想处理这家伙乱七八糟的编码。这东西太可怕了,我正在处理!我想念我自己的代码。
【解决方案3】:

我已经测试了你的代码,它工作正常;-

<?php
if(isset($_POST['button']) && !empty($_POST['button']))
{
    echo "<pre>";
    print_r($_REQUEST);
    die;

}
?>
<form id="form1" name="form1" method="post" enctype="multipart/form-data" action="<? echo $_SERVER['PHP_SELF']; ?>">
  <table width="311" border="0" align="center">
    <tr>
      <td width="68"><strong>Username</strong></td>
      <td width="231"><input type="text" name="admin_username" style='background-color: #ffffff; border: 1px solid #1F1F1F; font-size: 11px; color: #1F1F1F; width: 200px;' /></td>
    </tr>
    <tr>
      <td><strong>Password</strong></td>
      <td><input type="password" name="admin_password" style='background-color: #ffffff; border: 1px solid #1F1F1F; font-size: 11px; color: #1F1F1F; width: 200px;'  /></td>
    </tr>
    <tr>
      <td colspan="2"><div align="center">
        <input type="submit" name="button" value="Login" />
      </div></td>
      </tr>
  </table>
</form>

输出:-

Array
(
    [admin_username] => admin
    [admin_password] => Pass@word1
    [button] => Login
)

【讨论】:

    【解决方案4】:

    原来是重定向循环问题!

    Firebug 有点误导,但经过检查,我意识到一行中有两行:

    POST login.php 获取索引.php

    表示它在成功运行后尝试循环到 index.php。为什么它在 print_r() 命令应该吐出结果之后没有忽略 header() 命令,我不确定。通常,标题只能在输出之前传递。

    无论如何,index.php 已经检查了一个 var,如果为 false,它将发送回 login.php:

    $HTTP_COOKIE_VARS['isAdmin']
    

    这是由以前的开发人员编写的,不适用于较新版本的 PHP。

    因此我将其更改为

    $_COOKIE['isAdmin']
    

    希望这会有所帮助。

    PHP 版本更改可能会让人头疼,尤其是在您继承的代码不符合标准的情况下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      相关资源
      最近更新 更多