PDO mysql: कैसे पता लगाएं कि इंसर्ट सफल हुआ या नहीं


96

मैं एक रिकॉर्ड डालने के लिए पीडीओ का उपयोग कर रहा हूँ (mysql और php)

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();

क्या यह जानने का कोई तरीका है कि क्या यह सफलतापूर्वक डाला गया है, उदाहरण के लिए यदि रिकॉर्ड डाला नहीं गया था क्योंकि यह एक डुप्लिकेट था?

संपादित करें: बेशक मैं डेटाबेस को देख सकता हूं, लेकिन मेरा मतलब प्रोग्रामेटिक फीडबैक है।

जवाबों:


140

PDOStatement->execute()सफलता पर सच्चा रिटर्न। वहाँ भी है PDOStatement->errorCode()जो आप त्रुटियों के लिए जाँच कर सकते हैं।


1
आप निष्पादन () मूल्य को कैसे देखते हैं?
मल्लो

29
इससे अधिक नहीं, $ मूल्य = $ stmt-> निष्पादित (); if ($ मूल्य) {// true} और {// false}
Walafur Waage

23
या आप बस कर सकते हैंif ($stmt->execute()) { //true }
गैविन

2
है PDOStatement->execute()और PDOStatement->errorCode()पूरी तरह से एक दूसरे के अनुरूप है? क्या कोई ऐसी परिस्थिति होती PDOStatement->errorCode()है जब कुछ होता है लेकिन PDOStatement->execute()वापस लौटता है? या जब PDOStatement->execute()झूठे लौटते हैं लेकिन PDOStatement->errorCode()कुछ नहीं होता?
datasn.io

1
लेकिन अगर कोई नया रिकॉर्ड नहीं डाला गया, तो INSERT IGNORE भी सही साबित होगा
कोफ़ीहौस

24

यह देखते हुए कि पीडीओ के लिए सबसे अनुशंसित त्रुटि मोड है ERRMODE_EXCEPTION, कोई प्रत्यक्ष execute()परिणाम सत्यापन कभी भी काम नहीं करेगा । जैसा कि कोड निष्पादन अन्य उत्तरों में दी गई शर्त तक नहीं पहुंचेगा।

तो, पीडीओ में क्वेरी निष्पादन परिणाम को संभालने के लिए तीन संभावित परिदृश्य हैं:

  1. सफलता बताने के लिए किसी सत्यापन की जरूरत नहीं है। बस अपने कार्यक्रम के प्रवाह के साथ रखें।
  2. अप्रत्याशित त्रुटि को संभालने के लिए, उसी के साथ रखें - तत्काल हैंडलिंग कोड की आवश्यकता नहीं है। डेटाबेस त्रुटि के मामले में एक अपवाद को फेंक दिया जाएगा, और यह साइट-वाइड त्रुटि हैंडलर को बुलबुला देगा जो अंततः एक सामान्य 500 त्रुटि पृष्ठ पर परिणाम देगा।
  3. डुप्लिकेट प्राथमिक कुंजी की तरह अपेक्षित त्रुटि को संभालने के लिए, और यदि आपके पास इस विशेष त्रुटि को संभालने के लिए एक निश्चित परिदृश्य है, तो एक try..catchऑपरेटर का उपयोग करें ।

एक नियमित PHP उपयोगकर्ता के लिए यह थोड़ा अलग लगता है - यह कैसे, ऑपरेशन के प्रत्यक्ष परिणाम को सत्यापित करने के लिए नहीं? - लेकिन यह वास्तव में अपवाद कैसे काम करता है - आप कहीं और त्रुटि की जांच करते हैं। सभी के लिए एक बार। बेहद सुविधाजनक है।

तो, संक्षेप में: एक नियमित कोड में आपको किसी भी त्रुटि से निपटने की आवश्यकता नहीं है। बस अपना कोड इस प्रकार रखें:

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
echo "Success!"; // whatever

सफलता पर यह आपको बताएगा, त्रुटि पर यह आपको नियमित त्रुटि पृष्ठ दिखाएगा कि आपका आवेदन ऐसे अवसर के लिए दिखा रहा है।

केवल मामले में जब आपके पास त्रुटि रिपोर्ट करने के अलावा एक हैंडलिंग परिदृश्य होता है, तो अपने सम्मिलित विवरण को try..catchऑपरेटर में डालें , जांचें कि क्या यह वह त्रुटि थी जो आप अपेक्षित थे और इसे संभाल लें; या - यदि त्रुटि कोई भिन्न थी - अपवाद को फिर से फेंकें , जिससे साइट-वाइड त्रुटि सामान्य तरीके से नियंत्रित किया जा सके। नीचे पीडीओ के साथ त्रुटि से निपटने के मेरे लेख का उदाहरण कोड है :

try {
     $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data);
} catch (PDOException $e) {
    if ($e->getCode() == 1062) {
        // Take some action if there is a key constraint violation, i.e. duplicate name
    } else {
        throw $e;
    }
}
echo "Success!";

ऊपर दिए गए कोड में हम कुछ कार्रवाई करने के लिए विशेष त्रुटि की जांच कर रहे हैं और किसी अन्य त्रुटि (उदाहरण के लिए ऐसी कोई तालिका नहीं) के अपवाद को फिर से फेंक रहे हैं जो एक प्रोग्रामर को सूचित किया जाएगा।

जबकि फिर से - बस एक उपयोगकर्ता को कुछ बताने के लिए जैसे "आपका इंसर्ट सफल रहा" कभी भी किसी शर्त की आवश्यकता नहीं होती है।


"सफलता" का अर्थ क्या है? इसका मतलब है कि एक नई पंक्ति सम्मिलित की गई है, या इसका मतलब है कि कोई त्रुटि नहीं है?
मार्टिन एजे

INSERT क्वेरी के लिए यह बहुत अधिक है।
आपका कॉमन सेंस

आप सही हैं .. कृपया आप मुझे बताएं कि query()फ़ंक्शन के बारे में क्या होगा ? क्या मैं query()इसके बजाय ट्राइ-कैच का उपयोग कर सकता हूं prepared()->execute()?
मार्टिन एजे

3
पहली बार में आवेषण के लिए आपको कभी भी क्वेरी () का उपयोग नहीं करना चाहिए। इंसर्ट का मतलब है कि इनपुट है और अयोग्य मतलब है कि इसे तैयार किया जाना चाहिए।
आपका कॉमन सेंस

1
MySQL का उपयोग करते हुए, मुझे यह जांचना था कि $ e-> errorInfo [1] == 1062 यह सत्यापित करने के लिए कि इन्सर्ट फेल हो गया है, क्योंकि $ e-> getCode () हमेशा
23000 है।


9

अगर ऐसा है तो वर्तमान डेटाबेस रिकॉर्ड से मेल मूल्यों के साथ एक अद्यतन क्वेरी निष्पादित $stmt->rowCount()वापस आ जाएगी 0यदि कोई भी पंक्ति के लिए प्रभावित थे। यदि आपके पास if( rowCount() == 1 )सफलता के लिए परीक्षण करने के लिए है तो आप सोचेंगे कि अपडेट विफल हो गया जब यह विफल नहीं हुआ, लेकिन मूल्य डेटाबेस में पहले से ही थे इसलिए कुछ भी नहीं बदलता है।

$stmt->execute();
if( $stmt ) return "success";

यह मेरे लिए काम नहीं किया जब मैंने एक अद्वितीय कुंजी फ़ील्ड के साथ रिकॉर्ड को अपडेट करने का प्रयास किया, जिसका उल्लंघन किया गया था। क्वेरी ने सफलता लौटा दी लेकिन एक अन्य क्वेरी पुराने फ़ील्ड मान को लौटा देती है।


3
यदि आपको रिकॉर्ड डालने की आवश्यकता है, तो सबसे अच्छा तरीका इस तरह की जांच करना है ............................. ..... .................. if($stmt->execute() && ($stmt->rowCount()>0))
jave.web

4

आप उपद्रवी का परीक्षण कर सकते हैं

    $sqlStatement->execute( ...);
    if ($sqlStatement->rowCount() > 0)
    {
        return true;
    }

डॉक्स के लिए एक संदर्भ हमेशा @YourCommonSense सहायक होता है। इसमें कहा गया है, "यह व्यवहार सभी डेटाबेस के लिए गारंटी नहीं है और पोर्टेबल अनुप्रयोगों के लिए इस पर निर्भर नहीं होना चाहिए।" लेकिन सबसे पहले चयन करने के लिए सीमित है, और दूसरी तरह से mysql के लिए समर्थित है, जो इस पोस्ट का विषय है।
crafter

अपने ब्राउज़र के एड्रेस बार में बस "pdo rowcount" टाइप करें और पहले लिंक पर क्लिक करें। यह एक टिप्पणी से कम टाइपिंग लेता है
आपका कॉमन सेंस

1
@ इसके बाद सही। यह कहता है कि rowCount () SELECTप्रश्नों के लिए अप्राप्य हो सकता है (और वहां भी, डॉक्स कई प्रश्नों के बारे में बोलता है )। यह इस बारे में कुछ नहीं कहता है DELETE, INSERTया UPDATE, जो काम करने के लिए ठीक लगता है (प्रश्न एक INSERTप्रश्न के बारे में था )। हालांकि, मैं पीडीओ के लिए नया हूं और अगर मैं गलत हूं और किसी और के संदर्भ हैं, तो कृपया उन्हें यहां लिखें। मुझे यह देखने में दिलचस्पी है कि ऊपर दिए गए 3 आदेशों के लिए वास्तविक नुकसान हैं या नहीं।
स्टेनो

1

ऑटो वेतन वृद्धि के साथ प्राथमिक कुंजी के रूप में आईडी का उपयोग करें

$stmt->execute();
$insertid = $conn->lastInsertId();

वृद्धिशील आईडी हमेशा पहले रिकॉर्ड पर भी शून्य से बड़ा होता है, इसका मतलब है कि यह हमेशा के लिए आईडी कोज के लिए एक सही मूल्य लौटाएगा शून्य से बड़ा मतलब है PHP में सच

if ($insertid)
   echo "record inserted successfully";
else
   echo "record insertion failed";

क्या होगा यदि मुझे अपनी तालिका में एक ऑटो वेतन वृद्धि क्षेत्र की आवश्यकता नहीं है?
आपका कॉमन सेंस

कौन डू? आप? RESTFul API के साथ जो इतने व्यापक रूप से ऑटो इंक्रीमेंट आईडी का उपयोग किया जा रहा है, अनिवार्य है।
जम्पर आरबीके

किसी के पास प्राथमिक और ऑटो वेतन वृद्धि या कोई अन्य अनुक्रम कॉलम क्यों नहीं होगा? यदि सत्यापन विधि की आवश्यकता है, तो कोई अनुक्रमिक कॉलम जोड़ें। यदि यह समाधान आपके लिए नहीं है, तो इसे न जोड़ें। यह मेरे लिए एक ठीक है, मैं हमेशा कुछ अनुक्रमिक और ऑटो-इंक्रीमेंट कॉलम का उपयोग करता हूं, इसलिए मेरे पास हमेशा यह परीक्षण करने का एक तरीका होता है कि क्या मेरी क्वेरी सफल रही।
शमूएल रमजान

0

PDOStatement-> निष्पादित () एक अपवाद फेंक सकते हैं

तो आप क्या कर सकते हैं

try
{
PDOStatement->execute();
//record inserted
}
catch(Exception $e)
{
//Some error occured. (i.e. violation of constraints)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.