使用PDO插入/更新輔助函數我有一個非常簡單的輔助函數來為傳統的普通mysql驅動程序用法生成SET語句:function dbSet($fields) {
$set='';
foreach ($fields as $field) {
if (isset($_POST[$field])) {
$set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
}
}
return substr($set, 0, -2); }像這樣用過$id = intval($_POST['id']);$fields = explode(" ","name surname lastname address zip fax phone");$_POST['date'] = $_POST['y']."-".$_POST['m']."-".$_POST['d'];$query = "UPDATE $table SET ".dbSet($fields)." stamp=NOW() WHERE id=$id";它使代碼非常干燥,同時也很靈活。我要問是否有人愿意分享類似的功能,利用PDO預備語句功能?我仍然懷疑,如何做到這一點。是否有一種直接而簡單的方法來使用PDO預處理語句來插入數據?應該是什么形式?查詢構建器助手?還是插入查詢助手?它應該采取什么參數?我希望它可以很容易被用作SO的答案。因為在每個主題中我們都可以看到預備語句的使用建議,但是沒有一個好的例子。真實的例子,我的意思是。鍵入bind_param()20次并不是一個好的編程風格我相信。甚至還有20個問號。
3 回答

慕萊塢森
TA貢獻1810條經驗 獲得超4個贊
我通常有一個擴展PDO的類,但我的課程非常習慣。如果我將其清理干凈并進行測試,我會在以后發布。但是,這是您系統的解決方案。
function dbSet($fields, &$values) { $set = ''; $values = array(); foreach ($fields as $field) { if (isset($_POST[$field])) { $set .= "`$field` = ?,"; $values[] = $_POST[$field]; } } return rtrim($set, ',');}$fields = explode(" ","name surname lastname address zip fax phone date");$_POST['date'] = $_POST['y']."-".$_POST['m']."-"$_POST['d'];$query = "UPDATE $table SET ".dbSet($fields, $values).", stamp=NOW() WHERE id=?";$values[] = $id;$dbh->prepare($query);$dbh->execute($values);
這可能不完美,可以使用調整。它考慮了$dbh
使用PDO連接設置。等待我做的任何小的語法問題,這應該工作。
編輯
真的,我想我會選擇Doctrine ORM(或其他ORM)。在設置模型并在那里添加所有驗證時,它就像下面這樣簡單:
$table = new Table();$table->fromArray($_POST);$table->save();
這應該很容易填充內容。這當然是與ORM,如Doctrine。
更新
做了一些小的調整,第一個代碼,如把isset
背部和使用rtrim
過substr
。開始提供PDO擴展類的模擬只需要布局方式來完成它并進行一些單元測試以確保它有效。

慕斯王
TA貢獻1864條經驗 獲得超2個贊
每個答案都有幫助,我希望我能分開賞金。
最后,令我驚訝的是,基于已接受的答案,我能夠像以前一樣制作它
$fields = array("login","password");$_POST['password'] = MD5($_POST['login'].$_POST['password']);$stmt = $dbh->prepare("UPDATE users SET ".pdoSet($fields,$values)." WHERE id = :id");$values["id"] = $_POST['id'];$stmt->execute($values);
它可以包裝成輔助函數,但我懷疑是否有必要。它只會將代碼縮短一行。
pdoSet代碼:
function pdoSet($fields, &$values, $source = array()) { $set = ''; $values = array(); if (!$source) $source = &$_POST; foreach ($fields as $field) { if (isset($source[$field])) { $set.="`$field`=:$field, "; $values[$field] = $source[$field]; } } return substr($set, 0, -2); }

慕神8447489
TA貢獻1780條經驗 獲得超1個贊
我會擴展Core PDO Class和一個像這樣的方法:
class Database extends PDO{ public function QueryFromPost($Query,$items) { $params = array(); $Query .= ' WHERE '; foreach($items as $key => $default) { $Query .= ' :' . $key. ' = ' . $key; if(isset($_POST[$key])) { $params[':' . $key] = $_POST[$key]; }else { $params[':' . $key] = $default; } } $s = $this->prepare($Query); return $s->execute($params); }}
然后像這樣使用
$db = new Database(/*..Default PDO Params*/);$statement = $db->QueryFromPost('SELECT * FROM employees',array('type' => 'plc'));foreach($preparedStatement->fetchAll() as $row){ //...}
但是,正如已經說過的那樣,你應該非常厭倦你想要做的事情,你需要驗證你的數據,它已被消毒但你沒有經過驗證。
添加回答
舉報
0/150
提交
取消