如果已经提交了一个键(表单中的复选框),则附加一个值

时间:2012-05-04 13:40:36

标签: php mysql

我有一个奇怪的问题。我有一个用于多个表单的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版本做类似的事情,但它通过电子邮件发送数据,而不是将其保存在数据库中。

3 个答案:

答案 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也无效),因此在这种情况下无法重新处理表单变量。遗憾!