PDO: определение параметров с использованием foreach и $ _POST

Я пытаюсь создать страницу, которая позволяет пользователям изменять свою информацию в базе данных sql, используя PDO. Я новичок в этом, и у меня ошибка. Я использую это как источник: http://forums.devshed.com/php-faqs-stickies-167/program-basic-secure-login-system-using-php-mysql-891201.html

Я не уверен, включил ли я слишком много кода. Я надеюсь, кто-то может указать, где я совершил ошибку.

<?php require("common.php"); 

Common запускает этот код:

 <?php $username = ""; $password = ""; $host = ""; $dbname = ""; $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); try { $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); } catch(PDOException $ex) { die("Failed to connect to the database: " . $ex->getMessage()); } $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); header('Content-Type: text/html; charset=utf-8'); session_start(); 

Теперь я создаю исходный запрос и параметры:

 //initial query and params $query = " UPDATE users SET "; $query_params = array(); $query_params[':user_id'] = $_SESSION['user']['id']; 

Теперь я хочу определить параметры с помощью массива параметров (полей)

  $params = array(info1,info2,info3); foreach($params as $param): if(!empty($_POST[$param])){ $query_params[':$param'] = $_POST[$param]; $query .= "$param = :$param,"; } endforeach; 

Затем я завершаю запрос и запускаю его:

  //trim last comma $query = rtrim($query, ','); $query .= " WHERE id = :user_id "; try { // Execute the query $stmt = $db->prepare($query); $result = $stmt->execute($query_params); } catch(PDOException $ex) { die("Failed to run main query: " . $ex->getMessage() . "\n" . $query ); } 

Это HTML (с jquery), который я использовал:

 <form method="post" action="edit_account.php" data-ajax="false"> <div class="ui-field-contain"> <p>Gebruikersnaam: <b><?php echo htmlentities($_SESSION['user']['username'], ENT_QUOTES, 'UTF-8'); ?></b></p> <label for="email">E-mail:</label> <input autocomplete="off" type="text" name="email" id="email" value="<?php echo htmlentities($_SESSION['user']['email'], ENT_QUOTES, 'UTF-8'); ?>"> <label for="password">Wachtwoord:</label> <input autocomplete="off" type="password" name="password" id="password" placeholder="(alleen als je deze wijzigt)"> </div> <div class="ui-field-contain"> <label for="info1">info1:</label> <input type="text" name="info1" id="info1" placeholder="<?php echo htmlentities($_SESSION['user']['info1'], ENT_QUOTES, 'UTF-8'); ?>"> </div> <div class="ui-field-contain"> <label for="info2">info2:</label> <textarea type="text" name="info2" id="info2" placeholder="<?php echo htmlentities($_SESSION['user']['info2'], ENT_QUOTES, 'UTF-8'); ?>"></textarea> <label for="info3">info3:</label> <input type="text" name="info3" id="info3" placeholder="<?php echo htmlentities($_SESSION['user']['info3'], ENT_QUOTES, 'UTF-8'); ?>"> <label for="info4">info4:</label> <input type="text" name="info4" id="info4" placeholder="<?php echo htmlentities($_SESSION['user']['info4'], ENT_QUOTES, 'UTF-8'); ?>"> </div> </form> 

Я получаю эту ошибку: SQLSTATE [HY093]: Недопустимый номер параметра: параметр не определен.

Я упростил код, чтобы проиллюстрировать, как создать динамический запрос UPDATE. Это использует «ленивые» привязки и регулярные заполнители ? ,

Текстовые входы устанавливаются как обычный массив (т. Е. Не ассоциативный) значений.

 <?php if(isset($_POST['submit'])){ if (isset($_POST["info"]) && !empty($_POST["user_id"])) { $query = "UPDATE `users` SET "; $query_params = array(); $i =1; foreach ($_POST['info'] as $value) { // push array with each valid info entry ... if ($value) { $query .= "`info".$i. "` = ?,"; array_push($query_params,$value); } $i++; } $query = rtrim($query, ',');//remove trailing , // $query .= " WHERE `id` = ?"; array_push($query_params,$_POST['user_id']); //Show query and parameter array Remove after testing echo $query; echo "<br>"; print_r($query_params); // Execute the query $stmt = $db->prepare($query); $result = $stmt->execute($query_params); } } ?> <form method="POST" action="#"> <input type="text" name="info[]" id="info" value=""> <input type="text" name="info[]" id="info" value=""> <input type="text" name="info[]" id="info" value=""> <input type="text" name="info[]" id="info" value=""> <input type="text" name="user_id" id="user_id" value=""> <input type="submit" name="submit" value="Submit"> 

Типичный результат

 UPDATE `users` SET `info1` = ?,`info2` = ? WHERE `id` = ? Array ( [0] => john [1] => smith [2] => johnsmith )