0

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

4

3 回答 3

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"]));
于 2012-05-04T13:44:46.163 回答
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,前提是从浏览器中保留数据并在逻辑上消除(当作为数组访问时,仅保留相同关联键的最后一个元素,否则数据有没有)而不是程序上消除。

我不知道这是否有效,因为这是建立在理论之上,而不是来自任何类型的文档或代码专业知识。

于 2012-05-04T14:05:28.557 回答
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无法正常工作),因此在这种情况下,无法重新处理表单变量。对不起!

于 2012-05-04T14:17:00.380 回答