亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

【PDO擴(kuò)展】lastInsertId函數(shù)返回0的原因

wudengzan / 856人閱讀

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

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

問(wèn)題

在使用PHP的PDO擴(kuò)展插入數(shù)據(jù)的時(shí)候,有時(shí)候需要獲取到最后插入記錄的ID作為返回信息。要怎么才能實(shí)現(xiàn)這個(gè)需求呢?

lastInsertId函數(shù)

使用PDO的lastInsertId函數(shù)。

但是,最近在使用的過(guò)程中發(fā)現(xiàn)有時(shí)候lastInsertId函數(shù)返回的是0。為什么會(huì)這樣呢?

先來(lái)看看lastInsertId函數(shù)在PHP手冊(cè)上的說(shuō)明。

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

再來(lái)看看下面的幾個(gè)例子。

測(cè)試?yán)?/b> 主鍵是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;

結(jié)果

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;

結(jié)果

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;

結(jié)果

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;

結(jié)果

last id: 0

查看PHP源碼

可以看到,有些例子返回0,有些例子返回最新的ID。那么lastInsertId什么情況下會(huì)返回0呢?在網(wǎng)上搜了很多資料,并沒(méi)有發(fā)現(xiàn)想要的答案,翻開(kāi)PHP源碼,發(fā)現(xiàn)函數(shù)last_insert_id的實(shí)現(xiàn)源碼是這樣的:

可以看到,函數(shù)返回的id的值是調(diào)用mysql api中的mysql_insert_id函數(shù)返回的值。

查看mysql手冊(cè)

翻開(kāi)mysql手冊(cè),在這里找到這一段:

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().

結(jié)論

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

解決方案

那么,有沒(méi)有另一種方法可以幫助我們判斷程序執(zhí)行插入是否成功呢?答案是有的。在PDO執(zhí)行了excecute之后,調(diào)用PDO實(shí)例的rowCount函數(shù)可以得到執(zhí)行之后的影響行數(shù),如果結(jié)果非0,那么說(shuō)明數(shù)據(jù)庫(kù)插入操作執(zhí)行成功了。下面這個(gè)解決方案的一小段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";
}

本文探討一個(gè)問(wèn)題出現(xiàn)的原因和一個(gè)解決方案,由于個(gè)人水平有限,如有更好的方法或者其他建議和批評(píng),歡迎指出。

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/30296.html

相關(guān)文章

  • 寫(xiě)一個(gè)“特殊”查詢(xún)構(gòu)造器 - (七、DML 語(yǔ)句、事務(wù))

    摘要:同樣的,添加屬性,修改函數(shù)構(gòu)造語(yǔ)句的方法基類(lèi)中添加方法檢測(cè)有沒(méi)有設(shè)置子句構(gòu)建語(yǔ)句參數(shù)綁定返回影響的行數(shù)更新數(shù)據(jù)示例相比,語(yǔ)句更為簡(jiǎn)單,只需子句即可。 查詢(xún)語(yǔ)句 (DQL) 的構(gòu)造功能開(kāi)發(fā)完畢,我們?cè)俳o查詢(xún)構(gòu)造器增加一些對(duì) DML (Data Manipulation Language) 語(yǔ)句的支持,如簡(jiǎn)單的 insert、update、delete 操作。 insert 我們先回顧下 ...

    lookSomeone 評(píng)論0 收藏0
  • PDO學(xué)習(xí)筆記

    摘要:二對(duì)象利用的構(gòu)造函數(shù)連接特定的數(shù)據(jù)庫(kù),創(chuàng)建一個(gè)對(duì)象。連接數(shù)據(jù)庫(kù)連接數(shù)據(jù)庫(kù)有三種方式通過(guò)參數(shù)形式連接推薦構(gòu)造函數(shù)還有一個(gè)參數(shù),它是一個(gè)數(shù)組,用于配置運(yùn)行中的數(shù)據(jù)庫(kù),如是否開(kāi)啟自動(dòng)提交設(shè)置結(jié)果集的返回方式等。 一、PDO簡(jiǎn)介 PDO是PHP Data Object的簡(jiǎn)稱(chēng),用于定義數(shù)據(jù)庫(kù)訪問(wèn)的抽象層,統(tǒng)一各種數(shù)據(jù)庫(kù)的訪問(wèn)接口。PDO有如下特性: 編碼一致性:PDO支持多種數(shù)據(jù)庫(kù)擴(kuò)展,并為...

    AWang 評(píng)論0 收藏0
  • PHP 數(shù)據(jù)庫(kù)操作

    摘要:操作數(shù)據(jù)庫(kù)的種形式使用擴(kuò)展類(lèi)庫(kù)推薦使用擴(kuò)展類(lèi)庫(kù)這是類(lèi)庫(kù)的升級(jí)版,但已經(jīng)不推薦使用擴(kuò)展包含哪三個(gè)類(lèi)與區(qū)別可以支持多種數(shù)據(jù)庫(kù),而且操作方法一致只支持?jǐn)?shù)據(jù)庫(kù)如何使用連接數(shù)據(jù)庫(kù)什么是如何關(guān)閉連接通過(guò)來(lái)連接數(shù)據(jù)庫(kù),其中必須傳入數(shù)據(jù)源名稱(chēng)數(shù)據(jù)源名稱(chēng)是 PHP操作數(shù)據(jù)庫(kù)的2種形式 使用 PDO 擴(kuò)展類(lèi)庫(kù)(推薦) 使用 Mysqli 擴(kuò)展類(lèi)庫(kù)(這是Mysql類(lèi)庫(kù)的升級(jí)版,但已經(jīng)不推薦使用) PDO...

    Jingbin_ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<