2011-10-16 5 views
0

私は、テーブルの名前またはフィールドの数が何であれ、データベースにデータを追加するaddItという関数を持っています。foreach closeのbindParam

この関数は、テーブルの名前、およびフィールド名を取得し、コマンドの文字列を構築し、それは、フォームからのPOST変数をスキャンします。

実行する前にステートメントを使用してbindParamsする必要があります。

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

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

$データは、すべての$ _POST変数を含むテーブルです。 $ resultはすべてのフィールド名を含むテーブルです

タイトルがテーブルフィールドの名前の場合は ':'、結果は[:title]、$ vとバインドされます== $ _ POST [ 'タイトル'])

例えば、$ vは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

私は確信していませんが、私は問題が0としてgetFieldsの開始インデックス$ iの使用に起因すると思います。 しかし問題のあるループ$ iは1から始まっています。また、getFieldsメソッド$ iのインクリメントはifブロック内になければなりません。

+0

フィールド0を追加する必要がないため、1から$ iを開始しました。通常、通常このフィールドは自動インクリメントする必要があるテーブルIDです。 – SmootQ

+0

$ stmt-> bindParamの代わりにechoを使用すると、は正しく表示されますが、bindParamを使用するとすべてが変更されます。 – SmootQ

+1

次に、$ r [0]!= 'views' && $ r [0]!= 'votes'が第1または第2のインデックスにある場合、getFieldsメソッドで外部から$ i ++を使用するとこの問題が発生する可能性があると思います。 print_rを使用して$ resultをデバッグすると、この疑いが解消されます。それはケースだ場合は$ stmt->実行()の行を、コメントやエコーの代わりに$ stmtは、bindParam そうすることで使用している場合 – while1