Php foreach close中的bindParam
我有一个函数addIt,它将数据添加到数据库中,不管表的名称或字段数是多少 此函数获取表名和字段名,并生成命令字符串,然后扫描来自表单的POST变量 然后,它需要在执行之前使用语句绑定参数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
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;增量是自动的。