2013-12-20 31 views
7

最後一個ID,我使用CakePHP中如何獲得CakePHP中

$this->Menu->query("INSERT INTO frd_menus SET menuName= '".$_REQUEST['menuname']."'"); 

查詢如何得到這個查詢CakePHP中的最後一個插入ID?請指教。

+0

什麼frd_menus是什麼?它與菜單表有關嗎? – arilia

+0

複製http://stackoverflow.com/a/11020439/1239506 –

+0

你應該[接受我的答案](http://stackoverflow.com/a/24187920/3197383),因爲大多數upvoted答案是錯誤的解決方案,並可能導致錯誤在您的應用程序中。要接受我的回答,請檢查我答案左側的檢查符號。 –

回答

4
$this->Menu->getLastInsertId(); 

您可以通過此

+0

馬尼什嗨,感謝您的回答,但不顯示最後插入。它只能用save()函數。 –

+0

然後爲了使用find->第():ID => DESC –

+0

使用型號::發現(「第一」)也將不會是一個可接受的解決辦法 - 你永遠不能保證其他人不會被保存後記錄你在尋找電話之前的時間。 實施例:使用所述應用程序在同一時間數千人及兩個人執行接近可能導致檢索錯誤ID相同的動作;這可以根據不同的情況 – jrace

18

獲得最後插入ID如果沒有特殊的原因。

您應該使用

$this->Menu->save($data) 

插入數據。 然後你可以使用

$this->Menu->getLastInsertId(); 

得到最後插入的id。

+2

是的!我不明白爲什麼有那麼多的人在使用「型號::查詢()」,而不是常規的模式方法,如保存,saveAssociated等。 –

+2

$ this-> Menu-> id也包含id,直接保存後,不需要再次訪問數據庫。 –

+0

這種方法不應該用於這種用例,請閱讀我的回覆的小心部分:http://stackoverflow.com/a/24187920/3197383瞭解原因。 –

0
$this->Menu->query("INSERT INTO frd_menus SET menuName= '".$_REQUEST['menuname']."'"); 
$result = $this->Menu->query("SELECT LAST_INSERT_ID()"); 
$last_id = $result[0][0]; 

這應該工作,但我認爲,如果你創建menusfrd_menus之間的關係,並使用save功能CakePHP中

+1

還應該注意,這是一個SQL注入漏洞!永遠不要將用戶輸入注入到這樣的查詢中,對於插入['Model :: query()']中的數據,總是使用'DboSource :: value()'(http://book.cakephp.org/2.0/en/models /retrieving-your-data.html#model-query)! '$ name = $ this-> Menu-> getDataSource() - > value($ _ REQUEST ['menuname']); $ this-> Menu-> query(「INSERT INTO frd_menus SET menuName =」。$ name);'ps。你錯過了一個關閉的圓括號/分號。 – ndm

+1

Downvoted for SQL注入和整體這是錯誤的。如果這是CakePHP應用程序的代碼,我想知道爲什麼你使用Cake。 – burzum

+0

爲什麼?爲什麼?爲什麼你使用PLAIN SQL?請告訴我爲什麼!?此外,「$ _REQUEST」?像@burzum說的,我不明白你爲什麼/如何使用CakePHP。 –

4

使用排序依據遞減選項會更好。

$lastCreated = $this->Menu->find('first', array('order' => array('Menu.filedname' =>'desc'))`); 
3

你可以試試:

$data = array('menuName' => $_REQUEST['menuname']) 
$this->Menu->create(); 
$this->Menu->save($data); 
$id = $this->Menu->getLastInsertId(); 
+0

這種方法不應該用於這種用例,請閱讀我的回覆的注意部分:http://stackoverflow.com/a/24187920/3197383瞭解原因。 –

10

幾乎在情況下,你應該使用模型的方法來查詢數據庫。

Model::query()存在以運行比使用模型方法更復雜的複雜查詢,或在少數情況下當您沒有選擇時。

在你的情況下,這是非常有用的,因爲Model::save()在爲你設置Model::id屬性的框架中運行回調。

所以,這個證你回去馬上得到它:

if ($this->Menu->save($data)) { 
    $lastId = $this->Menu->id; 
} 

BE小心!

在另一邊,並像其他答覆說,有以下方法:

Model::getLastInsertId() 

您必須以這種方法非常小心,YOU SHOULD'NT用它,在這個用例,因爲它插入了LAST,但是不是您在剛纔的代碼語句中插入的最後一個!

如果用戶(在服務器上的其他併發請求)保存save()getLastInsertId()之間的數據就會返回,這第二個用戶!

因此,下面的答案是BAD回答用於該用途的情況下

+0

太棒了。謝謝! – Javi

-1
$this->Menu->id; // For User Model 

您還可以使用型號功能,但下面的代碼將在最後一次返回插入與給定的名稱型號的ID在這個例子中,它將返回菜單模型數據

$this->Menu->getLastInsertId(); 
$this->Menu->getInsertID(); 
-1

下面是選項:

echo $this->Registration->id; 

OR

echo $this->Registration->getInsertID(); 

echo $this->Registration->getLastInsertId(); 

在這裏,您可以用您的型號名稱替換註冊。

注:,如果你手動運行插入查詢

感謝

2

很容易,此功能不起作用。去做就對了。

$this->Menu->save($newMenu); 
$menuId = $this->Menu->id; 
2

試試這個

$this->ModelName->save($this->request->data); 
$insertedId = $this->ModelName->id; 
0

CakePHP的3.X你可以不喜歡它:

$data = $this->model->save($data); 
$data->id; // this will give the inserted id