我有一个奇怪的问题。我有一个用于多个表单的PHP脚本。它接收所有请求,然后将数据放入数据库中的相应表中。就目前而言,它看起来像这样:
$fields = "";
$values = "";
foreach ($_REQUEST as $key=>$value)
{
$key = str_replace(":","",$key);
$fields .= "$key,";
$values .= "'$value ',";
}
//remove the ending comma from $fields and $values
$fields = substr($fields, 0, -1);
$values = substr($values, 0, -1);
$sql = "INSERT INTO " . $survey . " ($fields) VALUES ($values)";
mysql_query($sql)
or die(mysql_error());
这很有效。问题是,有一些带有复选框的表单(即一个人可以选择多个选项)。如果我使用get方法,查询字符串将如下所示:
www.somesite.php V9 = 1&安培; V9 = 2及V9 = 4
使用当前脚本,只有4个,因为它是最后一个值。
现在,我知道发生这种情况的原因是因为在表单中定义了复选框的名称。它说name =“V9”而不是name =“V9 []”但是,我无法更改表格。它们是由软件生成的,其想法是任何用户都可以创建HTML表单,将其指向脚本,并将其信息记录在表中。因此,改变HTML不是我的选择。
因此,我需要一种方法来检测是否已提交密钥,如果是,则附加值。我试过这个:
$fields = "";
$values = "";
foreach ($_REQUEST as $key=>$value)
{
//check to see if the key has already been used for multi-choice questions
$key_check = strpos($fields, "$key,");
if($key_check !== false){
$values = substr($values, 0, -2);
$values .= "\;$value ',";
}else{
$key = str_replace(":","",$key);
$fields .= "$key,";
$values .= "'$value ',";
}
}
//remove the ending comma from $fields and $values
$fields = substr($fields, 0, -1);
$values = substr($values, 0, -1);
$sql = "INSERT INTO " . $survey . " ($fields) VALUES ($values)";
mysql_query($sql)
or die(mysql_error());
但我得到了同样的结果。 $ key_check似乎永远不会有效。任何帮助,将不胜感激。这里的某个人有一个工作的ASP版本做类似的事情,但它通过电子邮件发送数据,而不是将其保存在数据库中。
答案 0 :(得分:1)
如果你使用$ _GET:
,你可以试试这个function convertInput($qs=""){
$rtn = "";
$holdingArray = array();
if(trim($qs)!=""){
$vars = explode("&", $qs);
foreach($vars as $val){
$kv = explode("=", $val);
if(count($kv)==2){
if(isset($holdingArray[$kv[0]])){
$holdingArray[$kv[0]] .= "," . $kv[1];
}else{
$holdingArray[$kv[0]] = $kv[1];
}
}
}
$rtn = $holdingArray;
}
return $rtn;
}
print_r(convertInput($_SERVER["QUERY_STRING"]));
答案 1 :(得分:0)
试试这个:
$keys = array();
$values = array();
foreach ($_POST as $key=>$value){ //So, it will loop through the form data
if (!array_search($key, $keys)){ //Checking to see if the key has been used yet
$keys[] = $key;
} else {
$values[$key][] = array($key=>$value);
}
}
这应该构建一个由同一表单构建的FORM SELECT
选项数组,前提是数据从浏览器中保留并在逻辑上被删除(作为数组访问时,只有相同关联的最后一个元素)密钥被保留,但数据是有的)而不是程序上消除。
我不知道这是否有效,因为这是建立在理论之上,而不是来自任何文档或代码专业知识。
答案 2 :(得分:0)
PHP使用以下规则将请求字符串(查询字符串或x-www-form-urlencoded)解析为$ _GET,$ _POST和$ _REQUEST数组,当多次出现相同的键时,以后的键值会覆盖以前的键值。因此,如果您不能像PHP期望的那样更改表单上的键名称以附加[]
,则必须访问原始查询字符串并手动解析它。
请注意,重复不带[]
的键名会产生关于查询字符串键是标量还是数组的歧义。您将不得不决定如何解决这个问题。例如,您可以使用服务器定义的带有数组值的硬编码名称列表。
这是您可以将查询字符串处理为值列表的方法:
function paramlist($querystring, $raw=false) {
$plist = array();
$decoder = ($raw) ? 'rawurldecode' : 'urldecode';
$pairs = explode('&', $querystring);
foreach ($pairs as $pair) {
$plist[] = array_map($decoder, explode('=', $pair, 2));
}
return $plist;
}
如果您有a=1&b=2&a=3
之类的查询字符串,此函数将返回array(array('a','1'),array('b','2'),array('a','3'))
。然后,您可以使用任何所需的逻辑将其转换为关联数组。
但是,您需要首先获取查询或表单字符串:
if ($_SERVER['REQUEST_METHOD']==='POST'
and $_SERVER['CONTENT_TYPE']==='application/x-www-form-urlencoded') {
// form body
$qs = trim(file_get_contents('php://input'));
} else {
// url query string
$qs = $_SERVER['QUERY_STRING'];
}
请注意,如果您发送使用multipart/form-data
编码的表单,则PHP 将无法访问原始请求(即使php://input
也无效),因此在这种情况下无法重新处理表单变量。遗憾!