这是一个返回 ID 的不错的插入方法:
/**
* Execute an insert or update in the database.
* @param $table - Table name.
* @param $key_name - Primary key to update. NULL to a insert
* @param $data - Column data array
* @param $call_on_error function name that should called in case of an exception during the
* execution of the statment, the function is expected to take one argument, the exception object
* @return mixed An array containing the key inserted or updated on success, false on failure.
*/
function INSERT($table, $key_name, &$data, $call_on_error = null) {
list($min_cols, $prefix, $suffix, $key_value) = isset($data[$key_name]) ?
array(2, 'UPDATE', " WHERE `$key_name`=:$key_name", $data[$key_name]) :
array(1, 'INSERT', '', null);
if (count($data) < $min_cols) {
return false;
}
$set_clause = '';
foreach ($data as $k => $v) {
if ($k !== $key_name) {
if (($flag_name = strstr($k, "__", true))) {
if (strcmp($k, "{$flag_name}__mask") && isset($data["{$flag_name}__value"]))
$set_clause .= ",`$flag_name`=:{$flag_name}__value | (`$flag_name` & :{$flag_name}__mask)";
} else {
$set_clause .= ",`$k`=:$k";
}
}
}
global $dbo_error_duplicated;
$dbo_error_duplicated = false;
$dbh = DBH();
try {
$sth = $dbh->prepare("$prefix $table SET " . substr($set_clause, 1) . $suffix);
$res = $sth->execute($data);
} catch (PDOException $e) {
$dbo_error_duplicated = $sth->errorCode() === '23000';
echo $e;
if(isset($call_on_error)){
call_user_func($call_on_error, $e);
}
$res = false;
}
if ($res) {
if ($key_value === null && is_numeric($id = $dbh->lastInsertId())) {
$key_value = $id;
}
$res = $key_value === null ? false : array($key_name => $key_value);
}
return $res;
}
还有…… DBH 配置:
/**
* Get Data Base Handler.
* Manual @ http://www.php.net/manual/en/pdostatement.fetch.php
* More info @ http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
*
* @return PDO Data Base Handler
*/
function DBH() {
global $DBH;
global $db_config;
if ($DBH === null) {
// throws PDOException on connection error
$DBH = new PDO("mysql:host=$db_config[host];dbname=$db_config[dbname]", $db_config['user'], $db_config['pass'],
array(PDO::ATTR_PERSISTENT => $db_config['persistent'], PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES '$db_config[encoding]'"));
// ask PDO to throw exceptions for any error
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return $DBH;
}
使用这个 .ini 文件:
[db_config]
persistent = true
host = "localhost"
user = "root"
pass = ""
dbname = "theDbName"
# host = "db.production_host.com"
# user = "prod_root"
# pass = "big4nd5tr0ngp4s5word"
# dbname = "theDbName"
encoding = "UTF8"