2016-01-05 2 views
0

У меня есть инструкция вставки PDO, которая обновляет таблицу базы данных из представления формы. Есть много полей. Я намеренно использовал те же имена столбцов, что и имена ввода html. Есть ли более простой способ изложения этого кода? В настоящее время у меня есть 30 + $_POST переменных и предпочитаю более чистое решение через петлю какого-то типа.PDO insert на основе ключей массива в виде имен столбцов

Это моя текущая реализация, я включил, например, несколько полей.

$stmt = $dbh->prepare("INSERT INTO myTable SET Col1 = ?, ColABC = ?, Col123 = ?, ColFoo = ?, ColDEF = ?"); 
$stmt->execute(
    array($_POST['Col1'], $_POST['ColABC'], $_POST['Col123'], $_POST['ColFoo'], $_POST['ColDEF']) 
); 

ответ

1

Попробуйте что-то вроде следующих

$postarr = array('Col1', 'ColABC', 'Col123', 'ColFoo', 'ColDEF'); //<---- defined all the form elements you like to get from post 
$sql = ''; $param = array(); 
foreach($postarr as $k){ 
    $sql .= $k.'=:'.$k.','; // setting up placeholders for columns we are goign to update or get value from $_POST data 
    $param[$k] = $_POST[$k]; // setting up param array argument for execute() function 
} 
$sql = substr($sql,0,-1); // <--- remove last , 
$stmt = $dbh->prepare("INSERT INTO myTable SET " . $sql); 
$stmt->execute($param); 
+1

Это не избежать почтовой переменных, так что может покинуть базу данных, открытую для инъекции SQL –

+0

Побольше объяснения было бы полезно для ОПА –

+0

@steve Я не присвоенное значения непосредственно в 'insert' заявлении , тогда как заполнители используются, а фактические значения передаются как массив в 'execute'. Надеюсь, что он содержит SQL-инъекцию. – Lepanto

0

Следующая не проверено, но вы могли бы, возможно, попробовать что-то вроде этого.

<form id='sqlpost' method='post' action='/test/target.php'> 
    <h1>SQL Post</h1>  
    <input type='text' name='user' value='fred'/> 
    <input type='text' name='name' value='frederick'/> 
    <input type='text' name='email' value='[email protected]k.com'/> 

    <input type='text' name='age' value='21'/> 
    <input type='text' name='sex' value='male'/> 

    <input type="submit" name="subform" value="Submit"/> 
</form> 


/* 
target.php 
---------- 
*/ 

if($_SERVER['REQUEST_METHOD']=='POST'){ 

    $known=array('user','email','name'); 
    $postdata=array(); 


    foreach($_POST as $field => $value){ 
     if(in_array($field, $known)) $postdata[ $field ]=$value; 
    } 

    $keys=array_keys($postdata); 
    $values=array_values($postdata);    

    $sql='insert into myTable (`'.implode('`,`',$keys).'`) values (:'.implode(':',$keys).')'; 
    echo $sql; 
} 
+0

Может ли это быть потенциально ошибкой, если столбец не существует? –

+0

yep - лучшим вариантом было бы иметь массив известных имен полей и использовать что-то вроде 'array_intersect' в массиве POST, чтобы гарантировать существование полей – RamRaider

+0

Спасибо, это сработает. Защищает ли это решение от SQL-инъекции, поскольку метод привязки не используется? –

0

получить все значение в массив $ input. и используйте список().

$InputArray['cal1'] = $_POST['cal1']; 
$InputArray['collabc'] = $_POST['collabc']; 
$InputArray['col123'] = $_POST['col123']; 
$InputArray['clofoo'] = $_POST['clofoo']; 
$InputArray['coldef'] = $_POST['coldef']; 

if (count($inputArray) > 0) { 
     while (list($key, $val) = each($inputArray)) { 
      if(!empty($val)){ 
       $fields.= $key . ','; 
       $valset.= "'". $val ."',"; 
      } 
     } 
    } 

    $fields = trim($fields, ','); 
    $valset = trim($valset, ','); 
    $sql = "INSERT INTO $tableName ($fields) VALUES ($valset)"; 

    $stmt = $this->dbCon->prepare($sql); 
    $stmt->execute($inputArray); 
Смежные вопросы