2011-10-16 3 views
0

У меня есть функция addIt, которая добавляет данные в базу данных независимо от имени или количества полей таблицы.bindParam in foreach close

Эта функция получает имя таблицы и имена полей и строит строку команды, затем она сканирует переменные POST, поступающие из формы.

тогда ему необходимо связатьParams с помощью инструкции перед выполнением.

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

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

$ data - это таблица, содержащая все переменные $ _POST. $ result - это таблица, которая содержит все имена полей

Если название - это имя поля таблицы, то ':'. Result [$ i], будет ': title', для связи с $ v (для например $ v == $ _ POST ['title'])

foreach используется для повторения одного и того же процесса для всех переменных.

, но у меня есть проблема, это то, что поля в таблицах получают значения последней переменной POST.

так, если форма отправляет эти переменные: $ _POST [ 'название'], $ _POST [ '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

Чтобы добавить элемент в массив все, что вам нужно сделать, это: $ данных [] = $ к; приращение выполняется автоматически. – John

ответ

2

Я не уверен, но я думаю, проблема связана с использованием начального индекса $ i в getFields как 0; , но в вашем проблемном цикле $ i начинается с 1. Также, возможно, в методе getFields $ i increment должен находиться в if block.

+0

Я начал $ i из 1, потому что мне не нужно добавлять поле 0, обычно это поле является идентификатором таблицы, который обычно должен быть автоматически сгенерирован – SmootQ

+0

Обратите внимание, что при использовании эха вместо $ stmt-> bindParam данные отображаются правильно, но при использовании bindParam все изменяется. – SmootQ

+1

Тогда я думаю, что в методе getFields использование $ i ++ снаружи может вызвать эту проблему, если $ r [0]! = 'Views' && $ r [0]! = 'Votes' находятся в первом или втором индексе. Использование print_r для отладки $ result может устранить это сомнение. – while1