国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【PDO擴展】lastInsertId函數返回0的原因

wudengzan / 808人閱讀

摘要:但是,最近在使用的過程中發現有時候函數返回的是。返回最后插入行的或序列值。結果主鍵是字段,不使用自增約束。結果查看源碼可以看到,有些例子返回,有些例子返回最新的。因此,在沒有使用約束的表中,或者是自己生成的唯一,函數返回的都是。

原文地址 : http://www.hoohack.me/2016/01/19/the-reason-why-lastInsertId-return-0/

問題

在使用PHP的PDO擴展插入數據的時候,有時候需要獲取到最后插入記錄的ID作為返回信息。要怎么才能實現這個需求呢?

lastInsertId函數

使用PDO的lastInsertId函數。

但是,最近在使用的過程中發現有時候lastInsertId函數返回的是0。為什么會這樣呢?

先來看看lastInsertId函數在PHP手冊上的說明。

返回最后插入行的ID或序列值。

再來看看下面的幾個例子。

測試例子 主鍵是ID字段,使用自增約束。

getMessage();
    }

    for( $i = 0; $i < 10; $i++){
            $sql = "INSERT INTO `tbl_test` (id, name) VALUE (:id, :name)";
            $data = array(
                    ":id" => "",
                    ":name" => "user_$i"
            );
            $sth = $dbh->prepare($sql);
            $sth->execute($data);
    }

    $sql = "INSERT INTO `tbl_test` (id, name) VALUE (:id, :name)";
    $new_data = array(
            ":id" => "",
            ":name" => "user_new"
    );
    $sth = $dbh->prepare($sql);
    $sth->execute($new_data);
    $last_id = $dbh->lastInsertId();
    echo "last id: " . $last_id;

結果

last id: 11

主鍵是ID字段,不使用自增約束。

getMessage();
    }

    for( $i = 0; $i < 10; $i++){
            $sql = "INSERT INTO `tbl_test` (id, name) VALUE (:id, :name)";
            $data = array(
                    ":id" => $i,
                    ":name" => "user_$i"
            );
            $sth = $dbh->prepare($sql);
            $sth->execute($data);
    }

    $sql = "INSERT INTO `tbl_test` (id, name) VALUE (:id, :name)";
    $new_data = array(
            ":id" => "",
            ":name" => "user_new"
    );
    $sth = $dbh->prepare($sql);
    $sth->execute($new_data);
    $last_id = $dbh->lastInsertId();
    echo "last id: " . $last_id;

結果

last id: 0

主鍵不是ID字段,主鍵使用自增約束。

getMessage();
    }

    for( $i = 0; $i < 10; $i++){
            $sql = "INSERT INTO `tbl_test` (tbl_id, name) VALUE (:tbl_id, :name)";
            $data = array(
                    ":tbl_id" => $i,
                    ":name" => "user_$i"
            );
            $sth = $dbh->prepare($sql);
            $sth->execute($data);
    }

    $sql = "INSERT INTO `tbl_test` (tbl_id, name) VALUE (:tbl_id, :name)";
    $new_data = array(
            ":tbl_id" => "",
            ":name" => "user_new"
    );
    $sth = $dbh->prepare($sql);
    $sth->execute($new_data);
    $last_id = $dbh->lastInsertId();
    echo "last id: " . $last_id;

結果

last id: 11

主鍵不是ID字段,不使用自增約束。

getMessage();
    }

    for( $i = 0; $i < 10; $i++){
            $sql = "INSERT INTO `tbl_test` (tbl_id, name) VALUE (:tbl_id, :name)";
            $data = array(
                    ":tbl_id" => uniqid(),
                    ":name" => "user_$i"
            );
            $sth = $dbh->prepare($sql);
            $sth->execute($data);
    }

    $sql = "INSERT INTO `tbl_test` (tbl_id, name) VALUE (:tbl_id, :name)";
    $new_data = array(
            ":tbl_id" => uniqid(),
            ":name" => "user_new"
    );
    $sth = $dbh->prepare($sql);
    $sth->execute($new_data);
    $last_id = $dbh->lastInsertId();
    echo "last id: " . $last_id;

結果

last id: 0

查看PHP源碼

可以看到,有些例子返回0,有些例子返回最新的ID。那么lastInsertId什么情況下會返回0呢?在網上搜了很多資料,并沒有發現想要的答案,翻開PHP源碼,發現函數last_insert_id的實現源碼是這樣的:

可以看到,函數返回的id的值是調用mysql api中的mysql_insert_id函數返回的值。

查看mysql手冊

翻開mysql手冊,在這里找到這一段:

mysql_insert_id() returns the value stored into an AUTO_INCREMENT column, whether that value is automatically generated by storing NULL or 0 or was specified as an explicit value. LAST_INSERT_ID() returns only automatically generated AUTO_INCREMENT values. If you store an explicit value other than NULL or 0, it does not affect the value returned by LAST_INSERT_ID().

結論

從手冊的描述可以知道,mysql_insert_id函數返回的是儲存在有AUTO_INCREMENT約束的字段的值,如果表中的字段不使用AUTO_INCREMENT約束或者使用自己生成的唯一值插入,那么該函數不會返回你所存儲的值,而是返回NULL或0。因此,在沒有使用AUTO_INCREMENT約束的表中,或者ID是自己生成的唯一ID,lastInsertId函數返回的都是0。

解決方案

那么,有沒有另一種方法可以幫助我們判斷程序執行插入是否成功呢?答案是有的。在PDO執行了excecute之后,調用PDO實例的rowCount函數可以得到執行之后的影響行數,如果結果非0,那么說明數據庫插入操作執行成功了。下面這個解決方案的一小段demo:

$sql = "INSERT INTO `tbl_test` (tbl_id, name) VALUE (:tbl_id, :name)";
$new_data = array(
        ":tbl_id" => uniqid(),
        ":name" => "user_another"
);
$sth = $dbh->prepare($sql);
$sth->execute($new_data);
$row_count = $sth->rowCount();
if( $row_count ){
    echo "execute success";
} else{
    echo "execute failed";
}

本文探討一個問題出現的原因和一個解決方案,由于個人水平有限,如有更好的方法或者其他建議和批評,歡迎指出。

注:本文使用的是PHP5.4.15,MySQL5.5.41。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30296.html

相關文章

  • 寫一個“特殊”查詢構造器 - (七、DML 語句、事務)

    摘要:同樣的,添加屬性,修改函數構造語句的方法基類中添加方法檢測有沒有設置子句構建語句參數綁定返回影響的行數更新數據示例相比,語句更為簡單,只需子句即可。 查詢語句 (DQL) 的構造功能開發完畢,我們再給查詢構造器增加一些對 DML (Data Manipulation Language) 語句的支持,如簡單的 insert、update、delete 操作。 insert 我們先回顧下 ...

    lookSomeone 評論0 收藏0
  • PDO學習筆記

    摘要:二對象利用的構造函數連接特定的數據庫,創建一個對象。連接數據庫連接數據庫有三種方式通過參數形式連接推薦構造函數還有一個參數,它是一個數組,用于配置運行中的數據庫,如是否開啟自動提交設置結果集的返回方式等。 一、PDO簡介 PDO是PHP Data Object的簡稱,用于定義數據庫訪問的抽象層,統一各種數據庫的訪問接口。PDO有如下特性: 編碼一致性:PDO支持多種數據庫擴展,并為...

    AWang 評論0 收藏0
  • PHP 數據庫操作

    摘要:操作數據庫的種形式使用擴展類庫推薦使用擴展類庫這是類庫的升級版,但已經不推薦使用擴展包含哪三個類與區別可以支持多種數據庫,而且操作方法一致只支持數據庫如何使用連接數據庫什么是如何關閉連接通過來連接數據庫,其中必須傳入數據源名稱數據源名稱是 PHP操作數據庫的2種形式 使用 PDO 擴展類庫(推薦) 使用 Mysqli 擴展類庫(這是Mysql類庫的升級版,但已經不推薦使用) PDO...

    Jingbin_ 評論0 收藏0

發表評論

0條評論

wudengzan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<