2011-10-16 45 views
0

我有一個函數addIt,它將數據添加到數據庫無論是名稱或表的字段數。bindParam在foreach關閉

該函數獲取表名和字段名,並構建該命令的字符串,然後掃描來自表單的POST變量。

那麼它需要在執行前使用語句bindParams。

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

    $stmt->bindParam(':'.$result[$i],$v); 
    $i++; 
} 

$ data是包含所有$ _POST變量的表。 $ result是包含所有字段名稱的表

如果title是表字段的名稱,那麼':'。result [$ i]將是':title',將被綁定到$ v(for例如$ v == $ _ POST ['title'])

foreach用於對所有變量重複相同的過程。

但我有問題,這是表中的字段獲取最後一個POST變量的值。

所以如果形式發送這些變量:$ _ POST [ '標題'],$ _ POST [ 'TEXTE'],和標題= 「你好」,texte = 「世界」

在表中的字段將採取這些值:標題=「世界」,texte =「世界」,如果你想看到完整版的類代碼

<?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();} 
} 



} 

預先感謝您。

+1

將元素添加到陣列中的所有你需要做的是:$數據[] = $ K表;增量是自動的。 – John

回答

2

我不知道,但我想問題是由於使用起始索引$我在getFields爲0; 但在你的有問題的循環$ i從1開始。也可能在getFields方法$ i增量必須在if塊中。

+0

我從1開始$ i,因爲我不需要添加字段0,通常這個字段是通常必須自動遞增的表ID – SmootQ

+0

請注意,當您使用echo而不是$ stmt-> bindParam時,數據顯示正確,但使用bindParam時,所有內容都會更改。 – SmootQ

+1

然後我認爲在getFields方法中,如果$ r [0]!='views'&& $ r [0]!='votes'在第一或第二索引中,外部使用$ i ++可能會導致此問題。使用print_r調試$結果可以清除這個疑問。 – while1