2015-05-04 41 views
5

我是PHP新手,因此这可能是一个简单的答案。我希望我的格式正确和正确的SO标准(仍然是新的网站。)

我正在处理两套非常类似的代码提交表单数据和使用htmlspecialchars停止XSS攻击在我非常基本的开始PHP书通过SitePoint。很简单,对。

当使用代码设置1,我有一次我改变了形式的行动从

<form action="formpost.php" method="post"> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 

我搜索SO,发现我需要检查了未定义指数的错误如果$_REQUEST为空或者不是为了没有未定义的索引并且摆脱那个错误。如果有人能够向我解释这一部分,我会非常感激。确实需要的东西是什么周长回落下,以念Wo成为Index?thiking,请不要取笑我了,我知道我可能听起来很蠢 - >它是一个 Index因为$_REQUEST是一个$_POST$_GET$_COOKIE是一个数组,数组内的数据是indexed,0,1,2,3,etc。?

我理解,因为没有$_REQUEST已取得$_REQUEST可能是可能是空的(我想是不是?),但是,是没有剧本已经通过将数据输入到表格激活,为什么会被预期的数据已经在$_REQUEST

代码集1(thows错误[未定义指数]除非脚本检查$_REQUEST为空): 在这段代码中,我只是让最终用户通过表单字段或通过张贴他们的名字一个字符串手动添加到URL并打印。

<?php 
if(!empty($_REQUEST)) 
{ 
    $firstname = $_REQUEST['firstname']; 
    $lastname = $_REQUEST['lastname']; 
    echo 'Welcome to our web site, ' . 
     htmlspecialchars($firstname, ENT_QUOTES, 'utf-8') . ' ' . 
     htmlspecialchars($lastname, ENT_QUOTES, 'utf-8') . '!'; 
} 
?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title>Query String Link Example</title> 
    </head> 

    <body> 
     <p> 
      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
       <div><label for="firstname">First name: 
       <input type="text" name="firstname" id="firstname"></label> 
       </div> 
       <div><label for="lastname">Last name: 
       <input type="text" name="lastname" id="lastname"></label></div> 
       <div><input type="submit" value="GO"></div> 
      </form> 
     </p> 
    </body> 
</html> 

代码集2(如果$_REQUEST被选中与否并不介意): 在这段代码,我做同样的事情,只是如果它正好是我的确切名称,有它打印出一条特殊消息。

<?php 
    $firstname = $_REQUEST['firstname']; 
    $lastname = $_REQUEST['lastname']; 
     if ($firstname == 'Tommy' && $lastname='Loza') 
     { 
      echo 'Welcome to our web site web master!'; 
     } 
     else 
     { 
      echo 'Welcome to our web site, ' . 
       htmlspecialchars($firstname, ENT_QUOTES, 'utf-8') . ' ' . 
       htmlspecialchars($lastname, ENT_QUOTES, 'utf-8') . '!'; 
     } 
?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title>Conditional Query String Link Example</title> 
    </head> 

    <body> 
     <p> 
      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
       <div><label for="firstname">First name: 
       <input type="text" name="firstname" id="firstname"></label> 
       </div> 
       <div><label for="lastname">Last name: 
       <input type="text" name="lastname" id="lastname"></label></div> 
       <div><input type="submit" value="GO"></div> 
      </form> 
     </p> 
    </body> 
</html> 

希望我没有问太多愚蠢的问题和这个职位格式正确无误。非常感谢SO社区。

汤米

+0

我觉得我在这里#failed一点点。我的小Q在开始之后的主要问题是,为什么代码集1需要检查$ _REQUEST为空而代码集2没有?一些如何添加条件语句改变了事情。 – tommydevs

+1

为了防止XSS攻击,应该是'<?php echo $ _SERVER ['PHP_SELF']; ?>'this'<?php echo htmlspecialchars($ _ SERVER ['PHP_SELF']); ?> – Pushkar

+0

我认为你的问题为什么一切顺利,但在第一个问题中,首先出现一些错误,然后当你在表单中放入某些东西并点击按钮时没有错。我对吗? –

回答

4

基本上你不能访问一个REQUEST索引,除非它存在。

如果你不使用if语句,它试图访问索引,不管它是否存在。因此,如果$ _REQUEST ['firstname']不存在,而是仅仅默认为null,它将会给出未定义的索引错误,因为$ _REQUEST是一个数组。

如果您尝试使用未定义的变量,它会说“Undefined Variable”而不是“index”。

['firstname'] < - 这是索引。如果这不存在,则会出错。

检查它是否为空也不一定是唯一的东西。我也可以检查,看看是否名字和姓氏的设置,就像这样:

if(!empty($_REQUEST) && isset($_REQUEST['firstname']) && isset($_REQUEST['lastname'])){ 
    //Code here 
} 

当然,你可以然后逐个检查他们扔取决于缺少哪一个单独的错误的能力。

- 编辑

此外,您还可以执行以下操作:

if($_SERVER['REQUEST_METHOD'] == "POST"){ 
    //code 
} 

因为默认情况下,它被设置为 “GET”。

+0

真棒的答案。没有if语句,是否试图自动定位索引,因为代码基本上是“运行”的,没有任何检查/余额?在if语句正在检查代码的时候说:“首先,检查这是否为真,然后继续”,并且因为它没有立即为该索引寻找值?如果我掌握了这个权利,我会感觉很棒,因为我完全理解你的答案。关于$ SERVER ['REQUEST_MEATHOD']的信息也非常棒。我发现了一篇很棒的SO文章,更详细地解释了这一点。良好的曝光。 – tommydevs

+1

我现在开始感到困惑,哈哈!至于为什么第二个人在工作,我不确定。如果使用第二种方法并刷新页面而不输入任何表单数据,则该表单不应该起作用,因为表单尚未提交,因此获取$ _REQUEST索引应该抛出一个错误。第一个删除IF语句时停止工作的原因是因为它在显示表单之前正在运行。所以如果表单没有被提交,它需要检查已经提交的值,然后才能使用它们。这有意义吗? –

+1

基本上,因为PHP是服务器端的,所以它在HTML之前运行。所以它试图在显示表单之前使用表单中的数据。如果没有数据,它会给你一个错误,然后显然该表单不会显示在页面上。如果你在if语句中检查数据是否被设置,那么如果表单没有被提交,那么if语句将是false,因此不会运行大括号内的内容。看到这种现象的一种方式是,在if语句之后,添加一个else {}并将该表单粘贴到该表单中。然后表格只会显示,如果尚未发送。 –

1

先给提交按钮的名称,并检查是否点击与否,如果你给同一个页面的形式作用,从而没有必要给行动让它空白表下面的代码

<?php 
if(isset($_POST['submit'])) 
{ 
    $firstname = $_REQUEST['firstname']; 
    $lastname = $_REQUEST['lastname']; 
    echo 'Welcome to our web site, ' . 
     htmlspecialchars($firstname, ENT_QUOTES, 'utf-8') . ' ' . 
     htmlspecialchars($lastname, ENT_QUOTES, 'utf-8') . '!'; 
} 
?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title>Query String Link Example</title> 
    </head> 

    <body> 
     <p> 
      <form action="" method="post"> 
       <div><label for="firstname">First name: 
       <input type="text" name="firstname" id="firstname"></label> 
       </div> 
       <div><label for="lastname">Last name: 
       <input type="text" name="lastname" id="lastname"></label></div> 
       <div><input type="submit" value="GO" name="submit"></div> 
      </form> 
     </p> 
    </body> 
</html> 
+0

谢谢你。很酷。因此,如果我有多个表单,我可以通过为每个表单提供一个唯一的提交名称并检查isset($ _ POST ['submit-name'])来执行不同的操作。是对的吗?再次感谢。 – tommydevs

+1

@tommydevs是的它是正确的多个表单提交按钮的,但与按钮的唯一名称 –

1

按照你的问题。有很多情况下我们需要检查空请求。 1.如果我们有多个提交按钮的表单。在这种情况下,如果我们不验证请求,则无法区分哪个表单已提交。

  1. 复选框和单选框只在您选择时提交。因此有必要检查是否选中了复选框/单选框。

3如果您使用表单,请始终使用post方法并使用$ _POST进行验证,以防止XSS攻击,因为$ _REQUEST对$ _POST和$ _GET均有效。

  1. 您的第二套代码可以工作,因为文本字段在提交表单时总是发送值,而不管它们是否保留空白。

我希望这将有助于你

+0

关于1-3的优秀建议,谢谢!我不太理解第4个答案,因为这两组代码都提供了相同的文本字段?只是澄清,错误是'onload'而不是'onsubmit'。再次感谢! – tommydevs

相关问题