-
PHP PDO獲取lastInsertId
PHP手冊對於PDO::lastInsertId 函數的註解是string PDO::lastInsertId ([ string $name = NULL ] )
Returns the ID of the last inserted row, or the last value from a sequence object, depending on the underlying driver. For example, PDO_PGSQL() requires you to specify the name of a sequence object for the name parameter就是說對於pgsql必須指定sequence值,比如
$val = $dbh->lastInserId('table_id_seq');
如果不指定seq值則得不到正確值。解決辦法是使用pgsql對'insert'擴展的語法
第一條sql返回的是整個插入行,第二條返回是最後插入的整行,第三條返回指定的字段$sql = "insert into test1 (id, s) values (default, 'a') RETURNING *"; $sql2 = "insert into test1 (id, s) values (default, 'a'), (default, 'b') RETURNING * "; $sql3 = "insert into test1 (s) values ('a'), ('b') RETURNING id "; $stmt = $dbh->query($sql); // 注意是query而不是exec // do錯誤檢查 var_export($stmt->fetch(PDO::FETCH_ASSOC));
-
直接對PDOStatement結果進行迭代
一般情況我們對query出來的結果需要先fetchAll然後再迭代,比如$sql = 'SELECT * FROM users'; $stmt = $dbh->query($sql, PDO::FETCH_ASSOC); // .. do err check $res = $stmt->fetchAll(); if ($res) { foreach ($res as $row ) { // .. do something $uid = $row['userid']; } }
PHP5的foreach可以對Object進行迭代處理,於是可以這樣:
並且不用額外判斷$stmt的值真,多麼的方便$sql = 'SELECT * FROM users'; $stmt = $dbh->query($sql, PDO::FETCH_ASSOC); // .. do err check foreach ($stmt as $row ) { // 注意是$stmt 而不是 $stmt->fetchAll() // .. do something $uid = $row['userid']; }
-
PEAR::MDB2 對 PGSQL BOOL字段兼容性
mdb2 v1.x版本對於pgsql bool類型字段有兼容問題,獲取的值居然是字符串'f'/'t'而不是期望的bool值或者數值0/1。 並且PHP自帶的pgsql函數(pg_query())也有同樣的問題。
解決辦法就是使用PHP的PDO驅動。PDO_PGSQL可以正確處理bool字段值。 -
多列主鍵索引
多列主鍵順序與創建 Primary key (col1, col2) 時順序有關。對col2單獨搜索時“=”將會使用主鍵索引,其他比較操作符將無法使用主鍵索引;如果同時也對col1進行條件搜索,則對col2使用同樣策略無論col1的比較符是什麼。所以建表使用多列主鍵時需要考慮搜索環境來設定主鍵順序,以及根據搜索col2的頻率考慮是否在col2上建立單獨索引。
.