那天paperen在工作时修改别人写的代码,在看到添加文本时使用的新浪那个编辑器时,才接触到extract这个函数,终于解决了一直以来对接收表单数据的麻烦问题,也许是我以前没充分看php的函数吧……

想想以前自己是怎样接收表单的数据的,一个表单的html结构

<form action="test.php" method="post">
<P><label for="name">名字:</label><input type="text" name="name" id="name" /></p>
<P><label for="email">email:</label><input type="text" name="email" id="email" /></p>
<P><label for="phone">电话:</label><input type="text" name="phone" id="phone" /></p>
<P><label for="qq">QQ:</label><input type="text" name="qq" id="qq" /></p>
<P><input type="submit" name="submit" id="submit" value="提交" /></p>
</from>

当我们一点击提交时,整个表单就会提交到 action指定的文件处理,这里会将form的数据提交到test.php页面进行处理,但你当然可以提交给本页处理,那么你可以不用写action这个属性,不过要确保这个文件也是一个php文件才行。(稍微说下method这个定义数据以什么形式发送,一般有GET与POST两种方法,这里就不具体说这两种方法的区别了,自己可以(Google)

我以前接收数据都是这样处理的(可能是asp养成的习惯)

方法一:

if(isset($_POST[′submit′]))
{
$name=$_POST[′name′];
$email=$_POST[′email′];
$phone=$_POST[′phone′];
$qq=$_POST[′qq′];
}

之后再组合sql语句?

$sql="insert into table (name,email,phone,qq) values (′$name′,′$email′,′$phone′,′$qq′)";?

或者你会想为什么不直接将$_POST[′name′]这些直接放在$sql中?

$sql="insert into table (name,email,phone,qq) values (′$_POST[′name′]′,′$_POST[′email′]′,′$_POST[′phone′]′,′$_POST[′qq′]′)";?

但是你可以试试,这样php是认不出这里的变量值的,它只把values (′$_POST[′name′]′,′$_POST[′email′]′,′$_POST[′phone′]′,′$_POST[′qq′]′)";当成了一些字符串而不是指接收到的数据。

当然放到一个变量里也是有利于进行一些过滤处理的,因为直接将$_POST[′name′]这些数据直接送入数据库进行处理是不安全的,不建议这样做。

将话题转回这种接收数据的方法本身,可以想象得到的如果表单的数据很多,那么岂不是要写很多这些$name=$_POST[′name′];并定义了一系列变量,那多麻烦。

所以之后我又尝试了其他方法,在php中支持在表单端用数组装入数据。

方法二:

<form action="test.php" method="post">
<P><label for="name">名字:</label><input type="text" name="data[name]" id="name" /></p>
<P><label for="email">email:</label><input type="text" name="data[email]" id="email" /></p>
<P><label for="phone">电话:</label><input type="text" name="date[phone]" id="phone" /></p>
<P><label for="qq">QQ:</label><input type="text" name="data[qq]" id="qq" /></p>
<P><input type="submit" name="submit" id="submit" value="提交" /></p>
</from>

将name写成数组形式,那么在接收时可以使用foreach进行数据的分割与处理了。

foreach($data as $key=>$value){echo $key."=".$value."
";}试试看能不能得到我想得到的数据。这里除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串

然后我们构造sql语句。先想象一下我们应该构造的sql语句:insert into table (name,email,phone,qq) values (′$name′,′$email′,′$phone′,′$qq′);很明显我们要构造两个字符串,一是(name,email,phone,qq),二是(′$name′,′$email′,′$phone′,′$qq′)?

if(isset($_POST[′submit′]))
{
?$txt0=$txt1="";
?foreach($data as $key=>$value)
?{
? $txt0.=",".$key;
? $txt1.=",′".$value."′";
?}
}


//去掉前面多余的逗号
$txt0=substr($txt0,1);
$txt1=substr($txt1,1);
//组合字符串
$sql="insert into ($txt0) values ($txt1)";

最后总结一下这种接收数据的方法,不需要手动定义一个与post数据相关的变量了,我们接收端的程序不需要去记住数据的name是什么,但是必须确保表单处的name与构造的数据表中的字段是一样的,处理主要专注于字符串处理部分,使用了foreach与substr函数进行处理,组成我们想要的sql语句。很明显比第一种方法更好。

最方便的方法,extract 方法三:

超级方便的方法,表单的结构与方法一的一样。

<form action="test.php" method="post">
<P><label for="name">名字:</label><input type="text" name="name" id="name" /></p>
<P><label for="email">email:</label><input type="text" name="email" id="email" /></p>
<P><label for="phone">电话:</label><input type="text" name="phone" id="phone" /></p>
<P><label for="qq">QQ:</label><input type="text" name="qq" id="qq" /></p>
<P><input type="submit" name="submit" id="submit" value="提交" /></p>
</from>

在接收时

if(isset($_POST[′submit′]))
{
?extract($_POST);
?$sql="insert into table (name,email,phone,qq) values (′$name′,′$email′,′$phone′,′$qq′)";
?//这就OVER了,是不是觉得有点太神奇
}

下面贴一下extract函数的在php手册中解析extract ― Import variables into the current symbol table from an array

详细可以看这里:http://docs.php.net/manual/en/function.extract.php

将数组中的变量转化为当前变量(自己翻译的……应该不是很准,paperen我英语只过了四级……)extract($_POST)将POST中的数据转化为现在当前变量,其实$_POST也是一个数组,不信的话,大家可以用print_r($_POST)看看结果。

当使用完这个函数后我们就可以直接使用键值为相应的变量了$name,$email,$phone,$qq,$submit。

怎样php强大吧,不知不觉又想到以前用asp时候处理这种大表单时的痛苦……asp中不支持第二种方法也没有extract这个函数……只能乖乖地用第一种方法吧,或者有其他方法吧,也许是paperen我见识看少了点吧,如果某位大侠知道还有其他简单的方法,也给大家分享分享吧。

以上所有函数大家可以到http://docs.php.net/manual/zh/manual.php查询