3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
我通常有一個(gè)擴(kuò)展PDO的類,但我的課程非常習(xí)慣。如果我將其清理干凈并進(jìn)行測(cè)試,我會(huì)在以后發(fā)布。但是,這是您系統(tǒng)的解決方案。
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);
這可能不完美,可以使用調(diào)整。它考慮了$dbh
使用PDO連接設(shè)置。等待我做的任何小的語(yǔ)法問題,這應(yīng)該工作。
編輯
真的,我想我會(huì)選擇Doctrine ORM(或其他ORM)。在設(shè)置模型并在那里添加所有驗(yàn)證時(shí),它就像下面這樣簡(jiǎn)單:
$table = new Table();$table->fromArray($_POST);$table->save();
這應(yīng)該很容易填充內(nèi)容。這當(dāng)然是與ORM,如Doctrine。
更新
做了一些小的調(diào)整,第一個(gè)代碼,如把isset
背部和使用rtrim
過substr
。開始提供PDO擴(kuò)展類的模擬只需要布局方式來(lái)完成它并進(jìn)行一些單元測(cè)試以確保它有效。

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
每個(gè)答案都有幫助,我希望我能分開賞金。
最后,令我驚訝的是,基于已接受的答案,我能夠像以前一樣制作它
$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);
它可以包裝成輔助函數(shù),但我懷疑是否有必要。它只會(huì)將代碼縮短一行。
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); }

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
我會(huì)擴(kuò)展Core PDO Class和一個(gè)像這樣的方法:
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){ //...}
但是,正如已經(jīng)說(shuō)過的那樣,你應(yīng)該非常厭倦你想要做的事情,你需要驗(yàn)證你的數(shù)據(jù),它已被消毒但你沒有經(jīng)過驗(yàn)證。
添加回答
舉報(bào)