Php 如何使用extract()获取表单的值?

Php 如何使用extract()获取表单的值?,php,forms,validation,Php,Forms,Validation,我只是在学习PHP,我正在学习一个教程。现在,我们来检查服务器端表单验证,本教程使用request\u import\u variables获取值并验证它们。但是这种方法现在已经被弃用了。如何从存储在数组中的表单中获取值?我尝试过使用extract,但我对语法不太熟悉,也没有得到我想要的结果。这是代码 <?php //In this example I'm going to get the values of the form //and validate them on the ser

我只是在学习PHP,我正在学习一个教程。现在,我们来检查服务器端表单验证,本教程使用
request\u import\u variables
获取值并验证它们。但是这种方法现在已经被弃用了。如何从存储在数组中的表单中获取值?我尝试过使用extract,但我对语法不太熟悉,也没有得到我想要的结果。这是代码

<?php
//In this example I'm going to get the values of the form 
//and validate them on the server.
if(isset($_POST['Form'])) {
    //import_request_variables isn't supported anymore by php
    //import_request_variables("p", "z");
    extract($_POST['Form'], EXTR_PREFIX_ALL, "z");
    $missingFields = array();
    $required = array("FName"=>"First Name", "LName"=>"Last Name");

    while(list($var, $val) = each($required)){
        if(isset($zForm[$var]) && $zForm[$var] != ''){
            if(is_string($zForm[$var]))
                print "Everything ok <br />";
            else
                print "You have to provide a valid first and last name <br />";
        }
        else {
            $missingFields[$var] = $val;
        }
    }

    if(count($missingFields)){
        print "You missed out one or more fields:<br />";

        while(list($var, $val) = each($missingFields)){
            print $val . "<br />";
        }
    }
    else {
        print "Form passed!<br />";
        var_dump($zForm['Languages']);
        exit;
    }
}
?>

<form method="post" action="formValidation.php">
First Name: <input type="text" name="Form[FName]" /> (required)<br />
Last Name: <input type="text" name="Form[LName]" /> (required) <br />
Age: <input type="text" name="Form[Age]" /><br /><br />
Languages known:<br />
<input type="checkbox" name="Form[Languages][]" value="PHP" checked="checked"> PHP</input>
<input type="checkbox" name="Form[Languages][]" value="CPP"> C++</input>
<input type="checkbox" name="Form[Languages][]" value="Delphi"> Delphi</input>
<input type="checkbox" name="Form[Languages][]" value="Java"> Java</input>
<input type="submit" />

名字:(必选)
姓氏:(必填)
年龄:

已知语言:
PHP C++ 德尔菲 JAVA

因此,我发现
您遗漏了一个或多个字段
名字
姓氏


避免提取变量您应该直接使用数组来代替它。关于这个糟糕的
摘录
实践的讨论正在进行中


至于你的代码,你犯了一个小错误:

提取
将从
$\u POST['Form']
数组中生成变量,例如
$z\u FName
$z\u LName
$z\u Age

教程中的代码:

这个
import\u request\u variables
将从
$\u POST
数组中生成变量,因此它只是
$z\u表单

所以你需要改变

extract($_POST['Form'],EXTR_PREFIX_ALL,“z”)

extract($\u POST,EXTR\u PREFIX\u ALL,“z”)

并将
$zForm
更改为
$z_Form


如果要调试这种情况,可以查看
get\u defined\u vars
函数

首先没有必要提取它。您可以根据
$form=$\u请求[“form”]对输入数组进行本地化
以更方便地访问字段。(从本质上讲,
extract()
没有问题。但是你真的应该在全局范围内避免它——这就是这篇摘录的样子。)它与你给我的提示有点类似。但当我把一个数字作为一个名字的时候,表格还是通过了。值是否转换为字符串并放入数组?例如,我可以将1234作为一个名称,我将得到结果“Form passed”,即您在每个while循环(
list($var,$val)=each($required)
)中进行赋值,它应该是
list($var,$val)==each($required)
。不应该是
=
,因为这是您遍历列表的方式。如果你把
==
放进去,你会得到一个错误。@captain Yes。所有请求变量都会被视为字符串或字符串/数组的数组(如果它们是嵌套的,或者您有多个输入元素具有相同的
name
属性)。对于数字,您可以使用
is_numeric
ctype_digit
检查值是否为数字,然后如果需要严格控制,您可以将其强制转换为所需的数字类型,并根据更具体的规则对其进行验证。或者你可以转换它,然后检查它。取决于您试图验证的内容。我会将有关提取的警告移到您答案的开头,并将其加粗。然后跟进。
extract($_POST['Form'], EXTR_PREFIX_ALL, "z");
import_request_variables("p", "z");