2012-05-08 7 views
8

में काम नहीं करता है, मैं पोस्टग्रेस्क्ल का उपयोग कर रहा हूं, जब मैं नवीनतम प्रविष्टि आईडी पुनर्प्राप्त करने के लिए पीडीओ का उपयोग करना चाहता हूं, तो मुझे कोई समस्या मिली। यहाँ मेरी कोड है:lastInsertId Postgresql

$db->lastInsertId('columnName'); 

त्रुटि संदेश दर्शाता है

SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "columnName" does not exist 

मैं मैं के बारे में "अनुक्रम वस्तु" पीएचपी मैनुअल में कहा गया है कुछ गलतफहमी है लगता है।

Note: 

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. 

वर्तमान में, "कॉलमनाम" उस ऑटो-वृद्धि वाले विशेषता की स्ट्रिंग है। क्या कोई यह बता सकता है कि मैं गलत कहां गया? धन्यवाद।

+1

संभावित डुप्लिकेट [पीडीओ के साथ तैयार डालने के बाद अंतिम डालने आईडी प्राप्त करें] (http://stackoverflow.com/questions/5057954/get-last-insert-id-after-a-prepared-insert-with-pdo) –

उत्तर

15

PostgreSQL sequences का उपयोग करता serial कॉलम और serial स्तंभों के लिए मान रहे हैं उत्पन्न करने के लिए आम तौर पर क्या "स्वत: incrementing" PostgreSQL में स्तंभों के लिए प्रयोग किया जाता है। अनुक्रमों के नाम होते हैं और सामान्य रूप से, किसी भी विशेष तालिका से स्वतंत्र होते हैं, इसलिए आपके पास कई अलग-अलग तालिकाओं के लिए अद्वितीय आईडी उत्पन्न करने वाला एक अनुक्रम हो सकता है;

उदाहरण के लिए, PDO_PGSQL()नाम पैरामीटर के लिए एक दृश्य वस्तु का नाम निर्दिष्ट करने की आवश्यकता है: अनुक्रम नाम क्या lastInsertId अपने तर्क के रूप में चाहता है।

अनुक्रम PostgreSQL द्वारा बनाई गई वस्तु स्वचालित रूप से [table]_[column]_seq नाम पर है, तो:

$id = $db->lastInsertId('tableName_columnName_seq'); 
+5

इस तरह से काम नहीं करता है। अनुक्रम वस्तु को इंगित करने के लिए PGSQL "पैरामीटर" की आवश्यकता है। यदि आप इसे खाली छोड़ देते हैं, तो कुछ भी वापस नहीं किया जाता है। – Michael

+3

@ माइकल: फिर आपको अनुक्रम का नाम जानना होगा। डिफ़ॉल्ट 't_c_seq' होगा जहां 't' तालिका का नाम है और' c' स्तंभ नाम है। यद्यपि यह आवश्यकता हालांकि विचित्र है। मेरे पास सभी PHP/PostgreSQL सेट एटीएम नहीं है इसलिए मैं इनमें से कोई भी सत्यापित नहीं कर सकता। –

+0

table_column_seq, यह है! धन्यवाद! – Michael

-1

उपयोग अनुक्रम नाम के बजाय स्तंभ नाम

$db->lastInsertId('columnName'); 
3

मैं आज इस मुद्दे में भाग, lastInsertId() था केवल झूठी वापसी। जवाब यह है कि एक अलग धागे पर मेरी समस्या हल हो जाती मिला: https://stackoverflow.com/a/31638196/1477123

CREATE TABLE ingredients (
    id   SERIAL PRIMARY KEY, 
    name  varchar(255) NOT NULL, 
); 

तो अनुक्रम नाम ingredients_id_seq

$db->lastInsertId('ingredients_id_seq'); 
1

हो जाएगा तो अनुक्रम नामingredients_id_seq हो जाएगा,

$db->lastInsertId('ingredients_id_seq'); 

इस प्रारूप ने वास्तव में मेरे मुद्दों को हल किया !!!

+0

आप $ db-> अगलीवाल() का भी उपयोग कर सकते हैं; –