Php foreach close中的bindParam

Php foreach close中的bindParam,php,sql,Php,Sql,我有一个函数addIt,它将数据添加到数据库中,不管表的名称或字段数是多少 此函数获取表名和字段名,并生成命令字符串,然后扫描来自表单的POST变量 然后,它需要在执行之前使用语句绑定参数 foreach($data as $k=>$v){ $stmt->bindParam(':'.$result[$i],$v); $i++; } $data是包含所有$\u POST变量的表。 $result是包含所有字段名称的表 如果title是表字段的名称,那么“:”。结果[$i

我有一个函数addIt,它将数据添加到数据库中,不管表的名称或字段数是多少

此函数获取表名和字段名,并生成命令字符串,然后扫描来自表单的POST变量

然后,它需要在执行之前使用语句绑定参数

foreach($data as $k=>$v){

   $stmt->bindParam(':'.$result[$i],$v);
   $i++;
}
$data是包含所有$\u POST变量的表。 $result是包含所有字段名称的表

如果title是表字段的名称,那么“:”。结果[$i]将是“:title”,与$v绑定(例如$v=$\u POST['title'])

foreach用于对所有变量重复相同的过程

但我有个问题,表中的字段得到最后一个POST变量的值

因此,如果表单发送这些变量:$\u POST['title']、$\u POST['TEXTE']和title=“hello”、TEXTE=“world”

表中的字段将采用这些值:title=“world”,texte=“world”

如果要查看类代码的完整版本,请执行以下操作:

<?php
class add{

/*******************FUNCTION GET FIELDS**********************/
private function getFields($tbl){
try{
require 'global/connection.inc.php';
$cmd='DESCRIBE '.$tbl;
$fields=array();
$i=0;
foreach($pdo->query($cmd) as $r){
if ($r[0]!='views' && $r[0]!='votes'){
$fields[$i]=$r[0];
}
$i++;
}
return $fields;
}
catch(PDOException $e){}
}

/***********************FUNCTION GETDATA************************/

private function getData(){

$data=array();
$i=0;
foreach($_POST as $k){
$data[$i]=$k;
$i++;
}


return $data;
}


/**************************FUNCTION ADDIT************************/
function addIt($tbl){
require 'global/connection.inc.php';
try{

/*********create object add and get Fields names and POST data*****************/
$object=new add();
$result=$object->getFields($tbl);
$data=$object->getData();

/***************Build the sql command*****************************************/
$fields='';
$cmd='INSERT INTO '.$tbl;

$i=0;
foreach($result as $k=>$v){
     if ($i<count($result)-1 && $i!=0){
        $fields.=$v.',';
     }
     if ($i==count($result)-1){
       $fields.=$v;
     }
     $i++;
}

$values='';
$i=0;
foreach($result as $k=>$v){
      if ($i<count($result)-1 && $i!=0){
        $values.=':'.$v.',';
     }
     if ($i==count($result)-1){
       $values.=':'.$v;
     }
     $i++;
}

$cmd=$cmd.'('.$fields.')VALUES('.$values.')';

echo $cmd.'<br/>';

/**************************bind params and execute command******************************/
$stmt=$pdo->prepare($cmd);

$i=1;
foreach($data as $k=>$v){
    $n=$v.'';
   $stmt->bindParam(':'.$result[$i],$n);   //The problem is here
   $i++;
}

$stmt->execute();


}
catch(PDOException $e){echo $e->getMessage();}
}



}

我不确定,但我想问题是由于在getFields中使用了起始索引$I作为0;

但在你有问题的循环中,$i是从1开始的。也可能在getFields方法中,$i increment必须在if块中。

我从1开始$i,因为我不需要添加字段0,通常该字段是必须自动递增的表ID注意,当使用echo而不是$stmt->bindParam时,数据会正确显示,但使用bindParam时,一切都已更改。然后我认为在getFields方法中,如果$r[0]!='视图“&&$r[0]!=”“选票”在第一或第二个索引中。使用print_r调试$result可以消除这个疑问。但是如果是这样的话,那么在注释$stmt->execute()行时将显示相同的结果,并且在这样做时使用echo而不是$stmt bindParam,问题似乎只是bindParam向数组中添加一个元素而已:$data[]=$k;增量是自动的。