Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果已提交密钥(表单中的复选框),则添加值_Php_Mysql - Fatal编程技术网

Php 如果已提交密钥(表单中的复选框),则添加值

Php 如果已提交密钥(表单中的复选框),则添加值,php,mysql,Php,Mysql,我有个奇怪的问题。我有一个用于多种表单的PHP脚本。它接收所有请求,然后将数据放入数据库中相应的表中。就目前情况而言,它看起来是这样的: $fields = ""; $values = ""; foreach ($_REQUEST as $key=>$value) { $key = str_replace(":","",$key); $fields .= "$key,"; $values .= "'$value ',"; }

我有个奇怪的问题。我有一个用于多种表单的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());

但我得到了同样的结果$钥匙检查似乎从来都不有效。任何帮助都将不胜感激。这里的某个人有一个ASP版本,可以做类似的事情,但它通过电子邮件发送数据,而不是将数据保存在数据库中。

如果您使用的是$\u 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"]));
试试这个:

$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);
    }
}
如果数据从浏览器中保留并在逻辑上消除(当作为数组访问时,仅保留同一关联键的最后一个元素,否则将保留数据),则应构建从同一表单生成的
表单选择
选项的数组而不是按程序淘汰


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

PHP使用规则将请求字符串(查询字符串或x-www-form-urlencoded)解析为$\u GET、$\u POST和$\u请求数组,即当同一个键多次出现时,以后的键值将覆盖以前的键值。因此,如果不能像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'];
}

请注意,如果发送使用
多部分/表单数据编码的表单,PHP将不允许您访问原始请求(甚至
php://input
将不起作用),因此在这种情况下无法重新处理表单变量。对不起

SQLInjection漏洞从不获取用户数据,如$\u GET$\u POST$\u请求,并在sql查询中使用它,除非它已被转义或在准备好的查询中使用。将
[]
附加到表单控件的名称中,它们将神奇地变成数组……我建议您忘记
$\u REQUEST
,始终只使用
$\u POST
$\u GET
——这取决于需要立即执行的操作(您可以在同一脚本中使用
$\u POST
$\u GET
,但请确保
$\u POST
数据不能替换为
$\u GET
中的数据)-这是一个安全漏洞…还可以使用
mysql\u real\u escape\u字符串()
method当与MySQL一起使用时,或者通过其他方法转义用户输入…是的,我会在脚本运行时转义数据。现在,我只是在修补它。当这一部分运行时,我会使用escapes和sprintf。如果您无法调整HTML,您将处于非常艰难的境地。您正在寻找一种避免行为的方法你已经有效地编程了。你知道OP不能更改HTML吗?你是使用POST还是进入表单?@Wiseguy是的,我知道,但出于某种原因,我不能对这个问题发表评论。这是一个POST方法。我更改了它以进入测试,这样我就可以看到查询字符串,但最终结果必须使用POST。有一个小机会,t你可以在不改变HTML的情况下提取你想要的数据。我会发布一些东西。