PDO:使用foreach和$ _POST定义参数

我正在尝试创建一个页面,允许用户使用PDO在sql数据库中更改其信息。 我是新手,我遇到了一个错误。 我正在使用它作为来源: http : //forums.devshed.com/php-faqs-stickies-167/program-basic-secure-login-system-using-php-mysql-891201.html

我不确定我是否包含太多代码。 我希望有人能指出我犯了错误的地方。

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

Common运行此代码:

  '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):

 

Gebruikersnaam:

<input autocomplete="off" type="text" name="email" id="email" value="">
<input type="text" name="info1" id="info1" placeholder="">
<textarea type="text" name="info2" id="info2" placeholder=""> <input type="text" name="info3" id="info3" placeholder=""> <input type="text" name="info4" id="info4" placeholder="">

我收到此错误:SQLSTATE [HY093]:参数号无效:参数未定义。

我已经简化了代码来说明如何创建动态UPDATE查询。 这使用“懒惰”绑定和常规占位符?

文本输入设置为值的常规数组(即非关联)。

 "; print_r($query_params); // Execute the query $stmt = $db->prepare($query); $result = $stmt->execute($query_params); } } ?> 

典型的结果

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