我將如何使用MySQL的NOW()
在PDO準備語句,或者我會怎麼解決辦法使用它,同時牢記可能Apache服務器和數據庫服務器可能有兩種稍微當前時間不匹配(幾秒鐘),或者在極少數情況下可能與時區分開?PDO使用MySQL的NOW()
我在我的代碼如下功能:
try {
$dbh->insert("users", array(
"email" => $email,
"password" => $password,
"salt" => $salt,
"ingame" => $ingame,
"kiosk" => $kiosk
));
} catch (PDOException $ex) {
error($ex);
}
的呼叫:
/**
* Inserts data into a table. Data must be given in key-value pairs.
*
* Example: $dbh->insert("table", array(
* "data1" => $data1,
* "data2" => $data2
* );
*
* @param type $table The table to insert to
* @param type $keyvaluepairs The key-value pairs.
* @return type The statement that this query produced.
*/
public function insert($table, $keyvaluepairs) {
$sql = "INSERT INTO `{$table}` (";
$values_sql = ") VALUES(";
$values = array();
foreach ($keyvaluepairs as $key => $value) {
$sql .= "`${key}`, ";
$values_sql .= "?, ";
$values[] = $value;
}
$query = substr($sql, 0, -2).substr($values_sql, 0, -2).")";
return $this->query($query, $values);
}
的呼叫:
//TODO update documentation to show it also handles associative arrays with bindvalue
/**
* Can be called to create a query. Use either unnamed or named placeholders for the prepared statements.
*
* Example: $dbh->query("INSERT INTO table (data1, data2) VALUES(?, ?)", array($data1, $data2));
*
* @param type $query The input query, including unnamed or named placeholders
* @param type $values The input values. If it's not an array, then it will be an one-element array
* @return type The statement constructed by this query
*/
public function query($query, $values = array()) {
if (!is_array($values)) {
$values = array($values);
}
$statement = $this->dbh->prepare($query);
$statement->setFetchMode(PDO::FETCH_OBJ);
$i = 1;
if (is_assoc($values)) {
foreach ($values as $key => $value) {
$statement->bindValue($key, $value);
}
}
else {
foreach ($values as $value) {
$statement->bindValue($i++, $value);
}
}
$statement->execute();
return $statement;
}
在那裏我有以下功能:
function is_assoc($array) {
return (bool)count(array_filter(array_keys($array), 'is_string'));
}
所以這裏的交易是,我不能使用自定義MySQL
查詢的刀片,因爲我已經封裝那些easyness的緣故,但我仍然希望能夠插入NOW()
不利用的TIMESTAMP
/CURRENT_TIMESTAMP()
。
我希望你明白,這個問題需要解釋的答案,因爲我已經閱讀了「正常」的答案,並表示他們不會滿足我的需求。
更新:我已經加入const SQL_NOW = 1;
我DBH
類,但現在我想修改insert
到這樣的事情:
public function insert($table, $keyvaluepairs) {
$sql = "INSERT INTO `{$table}` (";
$values_sql = ") VALUES(";
$values = array();
foreach ($keyvaluepairs as $key => $value) {
if ($value == SELF::SQL_NOW) {
$sql .= "NOW(), ";
}
else {
$sql .= "`${key}`, ";
$values_sql .= "?, ";
$values[] = $value;
}
}
$query = substr($sql, 0, -2).substr($values_sql, 0, -2).")";
return $this->query($query, $values);
}
這可能是一個合適的解決方案,然而我不能使用1
作爲SQL_NOW
的值,因爲如果我想要插入整數1
,它會失敗。如果我使用這個解決方案,那麼SQL_NOW
會有什麼價值?是否有可能給它沒有價值?
@Downvoter:護理解釋? – skiwi