2011-11-09 13 views
10

मैं हमेशा mysql_connect का सीधा संबंध, mysql_pconnect किया है:की जगह mysql_ * पीडीओ और तैयार बयान के साथ काम करता है

$db = mysql_pconnect('*host*', '*user*', '*pass*'); 

if (!$db) { 
    echo("<strong>Error:</strong> Could not connect to the database!"); 
    exit; 
} 

mysql_select_db('*database*'); 

हालांकि इस का उपयोग करते हुए मैं हमेशा सरल विधि का उपयोग किया है एक करने से पहले किसी भी डेटा से बचने के लिए क्वेरी, कि INSERT, SELECT, UPDATE या DELETE का उपयोग कर mysql_real_escape_string

$name = $_POST['name']; 

$name = mysql_real_escape_string($name); 

$sql = mysql_query("SELECT * FROM `users` WHERE (`name` = '$name')") or die(mysql_error()); 

अब मैं समझता हूँ यह सुरक्षित है, एक हद तक से होना है कि क्या!

यह खतरनाक पात्रों से बच निकला; हालांकि, यह अभी भी अन्य हमलों के लिए कमजोर है जिसमें सुरक्षित पात्र हो सकते हैं लेकिन डेटा प्रदर्शित करने या कुछ मामलों में, डेटा को दुर्भावनापूर्ण रूप से संशोधित करने या हटाने के लिए हानिकारक हो सकते हैं।

तो, मैंने थोड़ी सी खोज की और पीडीओ, माईएसक्लुली और तैयार बयानों के बारे में पता चला। हां, मुझे खेल के लिए देर हो सकती है लेकिन मैंने वहां कई सारे ट्यूटोरियल (टिजाग, डब्ल्यू 3 सी, ब्लॉग, Google सर्च) पढ़े हैं और एक भी ने इनका उल्लेख नहीं किया है। ऐसा लगता है कि क्यों, उपयोगकर्ता इनपुट से बचने के लिए वास्तव में सुरक्षित नहीं है और कम से कम कहने के लिए अच्छा अभ्यास नहीं है। हां, मुझे पता है कि आप इसे रोकने के लिए रेगेक्स का उपयोग कर सकते हैं, लेकिन फिर भी, मुझे पूरा यकीन है कि पर्याप्त नहीं है?

यह मेरी समझ है कि पीडीओ/तैयार कथन का उपयोग डेटाबेस इनपुट से डेटा को स्टोर और पुनर्प्राप्त करने का एक अधिक सुरक्षित तरीका है जब उपयोगकर्ता इनपुट द्वारा चर दिए जाते हैं। एकमात्र मुसीबत है, स्विच (विशेष रूप से मेरे कोडिंग/पिछले कोडिंग की आदतों में फंसने के बाद) थोड़ा मुश्किल है।

अभी मैं समझता हूँ कि पीडीओ उपयोग करते हुए मेरे डेटाबेस से कनेक्ट करने के लिए मैं अब

$hostname = '*host*'; 
$username = '*user*'; 
$password = '*pass*'; 
$database = '*database*' 

$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 

if ($dbh) { 
    echo 'Connected to database'; 
} else { 
    echo 'Could not connect to database'; 
} 

का प्रयोग करेंगे, समारोह नाम अलग तो नहीं रह गया है मेरी mysql_query, mysql_fetch_array, mysql_num_rows आदि काम करेगा कर रहे हैं। तो मुझे नए लोगों के भार को पढ़ने/याद रखना है, लेकिन यह वह जगह है जहां मैं भ्रमित हो रहा हूं।

यदि मैं साइन अप/पंजीकरण फॉर्म कहने से डेटा सम्मिलित करना चाहता हूं, तो मैं इसे करने के बारे में कैसे जाउंगा, लेकिन मुख्य रूप से मैं इसके बारे में सुरक्षित तरीके से कैसे जाऊं? मुझे लगता है कि यह वह जगह है जहां तैयार बयान आते हैं, लेकिन इनका उपयोग करके यह mysql_real_escape_string जैसे कुछ उपयोग करने की आवश्यकता को खत्म करता है? मुझे पता है कि mysql_real_escape_string आपको mysql_connect/mysql_pconnect के माध्यम से किसी डेटाबेस से कनेक्ट होने की आवश्यकता है, इसलिए अब हम इसका उपयोग नहीं कर रहे हैं या नहीं, यह फ़ंक्शन केवल एक त्रुटि उत्पन्न करेगा?

मैंने पीडीओ विधि से संपर्क करने के विभिन्न तरीकों को भी देखा है, उदाहरण के लिए, मैंने :variable और ? देखा है जो मुझे लगता है कि प्लेसहोल्डर के रूप में जाना जाता है (क्षमा करें यदि यह गलत है)।

लेकिन मुझे लगता है यह मोटे तौर पर क्या एक डेटाबेस से उपयोगकर्ता को लाने के लिए

$user_id = $_GET['id']; // For example from a URL query string 

$stmt = $dbh->prepare("SELECT * FROM `users` WHERE `id` = :user_id"); 

$stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT); 

किया जाना चाहिए का विचार है लेकिन तब मैं कुछ चीज़ें पर अटक कर रहा हूँ, अगर चर एक नंबर नहीं था और पाठ की एक स्ट्रिंग थी, अगर मुझे गलत नहीं लगता है तो आपको PDO:PARAM_STR के बाद लंबाई दी जानी चाहिए। लेकिन यदि आप उपयोगकर्ता द्वारा दिए गए डेटा से दिए गए मान पर निश्चित नहीं हैं, तो आप एक निर्धारित लंबाई कैसे दे सकते हैं, यह हर बार भिन्न हो सकता है? किसी भी तरह से, जहां तक ​​मुझे डेटा प्रदर्शित करने के बारे में पता है, तो

$stmt->execute(); 

$result = $stmt->fetchAll(); 

// Either 

foreach($result as $row) { 
    echo $row['user_id'].'<br />'; 
    echo $row['user_name'].'<br />'; 
    echo $row['user_email']; 
} 

// Or 

foreach($result as $row) { 
    $user_id = $row['user_id']; 
    $user_name = $row['user_name']; 
    $user_email = $row['user_email']; 
} 

echo("".$user_id."<br />".$user_name."<br />".$user_email.""); 

अब, क्या यह सब सुरक्षित है?

अगर मैं सही हूँ, डालने डेटा उदाहरण के लिए ही होगा:,

$username = $_POST['username']; 
$email = $_POST['email']; 

$stmt = $dbh->prepare("INSERT INTO `users` (username, email) 
         VALUES (:username, :email)"); 

$stmt->bindParam(':username, $username, PDO::PARAM_STR, ?_LENGTH_?); 
$stmt->bindParam(':email, $email, PDO::PARAM_STR, ?_LENGTH_?); 

$stmt->execute(); 
चाहेंगे

है कि काम और वह भी सुरक्षित है? यदि यह सही है तो मैंने ?_LENGTH_? के लिए क्या मूल्य डाला होगा? क्या मुझे यह सब पूरी तरह से गलत मिला है?

अद्यतन

उत्तर मैं अब तक बहुत मददगार रहे हैं मिला है, तुम लोगों के लिए पर्याप्त धन्यवाद नहीं कर सकता! प्रत्येक व्यक्ति को मेरी आँखें थोड़ा अलग करने के लिए +1 मिल गया है। शीर्ष जवाब चुनना मुश्किल है, लेकिन मुझे लगता है कि कर्नल श्रापनेल इसका हकदार है क्योंकि सबकुछ काफी ढंका हुआ है, यहां तक ​​कि कस्टम लाइब्रेरीज़ के साथ अन्य सरणी में भी जाना जो मुझे पता नहीं था!

लेकिन मैं कभी नहीं bindParam() या परम प्रकार या लंबाई से परेशान आप सभी को धन्यवाद :)

+0

शायद 'उपयोगकर्ता नाम' और 'ईमेल' फ़ील्ड की लंबाई? उदाहरण के लिए। यदि उपयोगकर्ता नाम वर्चर (32) है, तो लंबाई पैरामीटर 32 होना चाहिए। – deejayy

उत्तर

12

दिलचस्प सवाल के लिए धन्यवाद। ये रहा:

यह खतरनाक वर्ण पलायन,

आपका अवधारणा पूरी तरह से गलत है।
वास्तव में "खतरनाक पात्र" एक मिथक है, कोई भी नहीं है। और mysql_real_escape_string भाग रहा है लेकिन केवल स्ट्रिंग delimiters। इस परिभाषा से आप इसकी सीमाएं समाप्त कर सकते हैं - यह केवल स्ट्रिंग्स के लिए काम करता है।

हालांकि, यह अभी भी अन्य हमलों के लिए कमजोर है जिसमें सुरक्षित पात्र हो सकते हैं लेकिन डेटा प्रदर्शित करने या कुछ मामलों में, डेटा को दुर्भावनापूर्ण रूप से संशोधित करने या हटाने के लिए हानिकारक हो सकता है।

आप यहां सब कुछ मिला रहे हैं।
डेटाबेस का भाषण,

    स्ट्रिंग्स के लिए
  • यह नहीं असुरक्षित है। जब तक आपके तारों को उद्धृत और भाग लिया जा रहा है, तब तक "डेटा को दुर्भावनापूर्ण रूप से संशोधित या हटा नहीं सकता"। *
  • अन्य डेटा टाइपडाटा के लिए - हाँ, यह बेकार है। लेकिन ऐसा नहीं है क्योंकि यह कुछ हद तक "असुरक्षित" है लेकिन केवल अनुचित उपयोग के कारण।

प्रदर्शित डेटा के रूप में, मैं इसे से Offtopic पीडीओ संबंधित सवाल में है लगता है, के रूप में पीडीओ या तो डेटा प्रदर्शित करने के साथ कोई संबंध नहीं है।

बचने उपयोगकर्ता इनपुट

^^^ एक और भ्रम ध्यान दिया जाना चाहिए!

  • एक उपयोगकर्ता इनपुट कुछ नहीं भागने से कोई लेना देना नहीं है। जैसा कि आप पूर्व परिभाषा से सीख सकते हैं, आपको स्ट्रिंग से बचना होगा, जो भी "उपयोगकर्ता इनपुट" नहीं है। तो, फिर से:

    • आप बच तार है, उनके स्रोत के कोई फर्क नहीं पड़ता
    • यह बेकार डेटा के अन्य प्रकार, स्रोत की कोई बात नहीं है से बचने के लिए है।

बिंदु मिल गया?
अब, मुझे आशा है कि आप भागने की सीमाओं के साथ-साथ "खतरनाक पात्र" गलत धारणा को समझें।

ऐसा नहीं है कि पीडीओ/तैयार बयान का उपयोग कर एक ज्यादा सुरक्षित

नहीं वास्तव में है मेरी समझ है।

  • एक स्ट्रिंग
  • एक नंबर
  • एक पहचानकर्ता
  • एक वाक्य रचना कीवर्ड:
    वास्तव में, वहाँ चार अलग क्वेरी भागों हम गतिशील इसे करने के लिए जोड़ सकते हैं जो कर रहे हैं।

तो, आप देख सकते हैं कि भागने से केवल एक ही समस्या शामिल है।(लेकिन निश्चित रूप से, यदि आप संख्याओं को तारों के रूप में देखते हैं (उन्हें उद्धरण में डालते हैं), लागू होने पर, आप उन्हें भी सुरक्षित बना सकते हैं)

तैयार वक्तव्य कवर - यूघ - पूरे 2 अंक! एक बड़ी बात ;-)

अन्य 2 समस्याओं के लिए मेरे पहले जवाब देखने, In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?

अब, समारोह नाम अलग तो नहीं रह गया होगा मेरी mysql_query, mysql_fetch_array, mysql_num_rows आदि काम कर रहे हैं।

यह एक और है, पीएचपी की कब्र भ्रम उपयोगकर्ताओं, एक प्राकृतिक आपदा, एक तबाही:

भी

जब पुराने mysql ड्राइवर का उपयोग, अपने कोड में नंगे एपीआई कार्यों का उपयोग कभी नहीं करना चाहिए ! रोज़ाना उपयोग के लिए उन्हें किसी पुस्तकालय समारोह में रखना होगा! (कुछ जादू संस्कार के रूप में नहीं बल्कि कोड को कम, कम दोहराव, त्रुटि-सबूत, अधिक सुसंगत और पठनीय बनाने के लिए)।

पीडीओ के लिए भी यही है!

अब आपके प्रश्न के साथ फिर से।

लेकिन इनका उपयोग करके यह mysql_real_escape_string जैसे कुछ उपयोग करने की आवश्यकता को खत्म करता है?

हाँ।

लेकिन मुझे लगता है यह मोटे तौर पर क्या एक डेटाबेस से उपयोगकर्ता को लाने के लिए

नहीं लाने के लिए किया जाना चाहिए के विचार है, लेकिन क्वेरी करने के लिए एक जो कुछ डेटा जोड़ने के लिए!

आप के लिए पीडीओ के बाद लंबाई दिया है: PARAM_STR अगर मैं गलत

आप कर सकते हैं नहीं कर रहा हूँ, लेकिन आप की जरूरत नहीं है।

अब, यह सब सुरक्षित है?

डेटाबेस सुरक्षा के मामले में इस कोड में कोई कमजोर धब्बे नहीं हैं। यहां सुरक्षित करने के लिए कुछ नहीं। प्रदर्शित करने के लिए

- बस इस साइट को XSS कीवर्ड के लिए खोजें।

आशा है कि मैंने इस मामले पर कुछ प्रकाश डाला है।

Btw, लंबे आवेषण के लिए आप समारोह मैं किसी दिन लिखा में से कुछ का उपयोग करें, Insert/update helper function using PDO

हालांकि, कर सकते हैं मैं इस समय तैयार बयानों उपयोग नहीं कर रहा, जैसा कि मैंने उन पर अपने घर-पीसा प्लेसहोल्डर पसंद करते हैं, मैंने ऊपर वर्णित लाइब्रेरी का उपयोग किया। तो, नीचे दिए गए कोड RIHA द्वारा पोस्ट की गई मुकाबला करने के लिए, यह इन 2 लाइनों के रूप में के रूप में कम होगा:

$sql = 'SELECT * FROM `users` WHERE `name`=?s AND `type`=?s AND `active`=?i'; 
$data = $db->getRow($sql,$_GET['name'],'admin',1); 

लेकिन निश्चित रूप से आप एक ही कोड के रूप में अच्छी तरह से तैयार बयान का उपयोग कर सकते हैं।


* (yes I am aware of the Schiflett's scaring tales)

+0

मैं एक पसंदीदा के रूप में उत्तर कैसे चिह्नित करूं? – TehShrike

+0

धन्यवाद :) अब, मुझे लगता है। अगर मैं इसे –

+0

बुकमार्क करना चाहता हूं तो ओपी को स्वयं कोडित लाइब्रेरी का उपयोग करने के लिए प्रोत्साहित क्यों करें ओपी है असल में पीडीओ का सही तरीके से उपयोग करने के लिए पूछना? पहला कदम पहले आता है, आपको पता है? एक रूकी (जो अभी सीखा है कि mysql_ * से अधिक है) वास्तव में कस्टम डीबी रैपर लाइब्रेरी पर विचार करने से पहले मूल पीडीओ उपयोग सीखना चाहिए। इसके अलावा, दो-लाइनर जैसे आपका पढ़ने/समझने/डीबग/संशोधित करने के लिए एक पिटा है। शॉर्ट कोड हमेशा सबसे अच्छा कोड नहीं होता है। – riha

8

मैं सिर्फ निष्पादित करने के लिए पैरामीटर मान की एक सरणी पारित(), इस तरह:

$stmt = $dbh->prepare("SELECT * FROM `users` WHERE `id` = :user_id"); 
$stmt->execute(array(':user_id' => $user_id)); 

$stmt = $dbh->prepare("INSERT INTO `users` (username, email) 
         VALUES (:username, :email)"); 
$stmt->execute(array(':username'=>$username, ':email'=>$email)); 

यह बस के रूप में प्रभावी है, और कोड के लिए आसान।

आप मेरी प्रस्तुति SQL Injection Myths and Fallacies, या मेरी पुस्तक SQL Antipatterns: Avoiding the Pitfalls of Database Programming में रुचि भी ले सकते हैं।

+0

क्या यह भी किया जा सकता है? सरणी में प्लेसहोल्डर तो? कहें 'चयन * उपयोगकर्ताओं से जहां नाम =? और ईमेल =? ");' 'निष्पादित करें (सरणी ($ नाम, $ ईमेल)); 'या यह इस मामले में काम नहीं करता है? – Joe

+0

हां, आप नामित पैरामीटर के बजाए स्थितित्मक पैरामीटर का उपयोग कर सकते हैं, जैसा कि आप दिखाते हैं। –

2

लंबाई प्रश्न का उत्तर देने के लिए, यह निर्दिष्ट करना वैकल्पिक है जब तक कि आप बाध्यकारी नहीं हैं, संग्रहीत प्रक्रिया से एक आउट पैरामीटर है, इसलिए ज्यादातर मामलों में आप इसे सुरक्षित रूप से छोड़ सकते हैं।

जहां तक ​​सुरक्षा चलती है, जब आप पैरामीटर को बांधते हैं तो दृश्यों के पीछे भागना होता है। यह संभव है क्योंकि जब आप ऑब्जेक्ट बनाते हैं तो आपको डेटाबेस कनेक्शन बनाना होता था। कथन तैयार करके आप एसक्यूएल इंजेक्शन हमलों से भी संरक्षित हैं, आप उपयोगकर्ता डेटाबेस को इसके करीब कहीं भी प्राप्त करने से पहले अपने डेटाबेस को कथन का प्रारूप बता रहे हैं। एक उदाहरण:

$id = '1; MALICIOUS second STATEMENT'; 

mysql_query("SELECT * FROM `users` WHERE `id` = $id"); /* selects user with id 1 
                  and the executes the 
                  malicious second statement */ 

$stmt = $pdo->prepare("SELECT * FROM `users` WHERE `id` = ?") /* Tells DB to expect a 
                   single statement with 
                   a single parameter */ 
$stmt->execute(array($id)); /* selects user with id '1; MALICIOUS second 
           STATEMENT' i.e. returns empty set. */ 

इस प्रकार, सुरक्षा के मामले में, ऊपर दिए गए आपके उदाहरण ठीक लगते हैं।

अंत में, मैं मानता हूं कि बाध्यकारी पैरामीटर अलग-अलग हैं और पीडीओएसटेमेंट-> निष्पादित() (http://www.php.net/manual/en/pdostatement.execute.php देखें) को पारित सरणी के साथ प्रभावी ढंग से किया जाता है।

5

हाँ,: कुछ पीडीओ में एक नामित प्लेसहोल्डर है, तो? एक अज्ञात प्लेसहोल्डर है। वे आपको एक या एक से एक बार मूल्यों को बांधने की अनुमति देते हैं।

तो, मूल रूप से मूल्यों के साथ आपकी क्वेरी प्रदान करने के लिए चार विकल्प बनाता है।

एक करके bindValue()

के साथ एक यह जैसे ही आप इसे कहते आपके प्लेसहोल्डर करने के लिए एक ठोस मूल्य बांधता है। वांछित अगर आप bindValue(':something', 'foo') जैसे हार्ड कोडेड तारों को भी बांध सकते हैं।

पैरामीटर प्रकार प्रदान करना वैकल्पिक है (लेकिन सुझाया गया है)। हालांकि, चूंकि डिफ़ॉल्ट PDO::PARAM_STR है, इसलिए आपको स्ट्रिंग नहीं होने पर केवल इसे निर्दिष्ट करने की आवश्यकता है। इसके अलावा, PDO यहां लंबाई की देखभाल करेगा - कोई लंबाई पैरामीटर नहीं है।

$sql = ' 
    SELECT * 
    FROM `users` 
    WHERE 
    `name` LIKE :name 
    AND `type` = :type 
    AND `active` = :active 
'; 
$stm = $db->prepare($sql); 

$stm->bindValue(':name', $_GET['name']); // PDO::PARAM_STR is the default and can be omitted. 
$stm->bindValue(':type', 'admin'); // This is not possible with bindParam(). 
$stm->bindValue(':active', 1, PDO::PARAM_INT); 

$stm->execute(); 
... 

मैं आमतौर पर इस दृष्टिकोण पसंद करते हैं। मुझे यह सबसे साफ और सबसे लचीला लगता है।

bindParam()

के साथ एक एक करके एक चर अपने प्लेसहोल्डर जब क्वेरी executed है, नहीं जब bindParam() कहा जाता है पढ़ा जाएगा कि स्वाभाविक है। वह हो सकता है जो आप चाहते हैं या नहीं। यह आसान होता है जब आप बार-बार अपनी क्वेरी को विभिन्न मानों के साथ निष्पादित करना चाहते हैं।

$sql = 'SELECT * FROM `users` WHERE `id` = :id'; 
$stm = $db->prepare($sql); 
$id = 0; 
$stm->bindParam(':id', $id, PDO::PARAM_INT); 

$userids = array(2, 7, 8, 9, 10); 
foreach ($userids as $userid) { 
    $id = $userid; 
    $stm->execute(); 
    ... 
} 

आप केवल एक बार सीपीयू चक्र सुरक्षित करते हैं और बाध्य करते हैं। :)

नामित प्लेसहोल्डर

तुम बस execute() लिए एक सरणी में गिरावट के साथ सभी एक ही बार में । प्रत्येक कुंजी आपकी क्वेरी में नामित प्लेसहोल्डर है (बिल करविन्स का जवाब देखें)। सरणी का क्रम महत्वपूर्ण नहीं है।

एक तरफ ध्यान दें: इस दृष्टिकोण के साथ आप डेटा प्रकार संकेतों (पीडीओ :: PARAM_INT आदि) के साथ पीडीओ प्रदान नहीं कर सकते हैं। AFAIK, पीडीओ अनुमान लगाने की कोशिश करता है।

सभी एक ही बार में गुमनाम प्लेसहोल्डर

तुम भी एक सरणी में गिरावट निष्पादित करने के लिए() के साथ है, लेकिन यह संख्यानुसार अनुक्रमित है (कोई स्ट्रिंग कुंजी है)। मान आपके अज्ञात प्लेसहोल्डर्स को एक-एक करके आपके क्वेरी/सरणी में दिखाई देने के क्रम में बदल देंगे - पहला सरणी मान पहले प्लेसहोल्डर को बदल देता है और आगे। Erm410 का जवाब देखें।

सरणी और नामित प्लेसहोल्डर के साथ, आप डेटा प्रकार संकेत प्रदान नहीं कर सकते हैं।

क्या वे आम

  • उन सब के सब आप के लिए बाध्य/के रूप में आप प्लेसहोल्डर है के रूप में ज्यादा मान प्रदान करने की आवश्यकता होती है में है। यदि आप बहुत अधिक/कुछ बांधते हैं, तो पीडीओ आपके बच्चों को खाएगा।
  • आपको भागने के बारे में परवाह करने की ज़रूरत नहीं है, पीडीओ इसे संभालती है। तैयार पीडीओ स्टेटमेंट डिजाइन द्वारा एसक्यूएल इंजेक्शन सुरक्षित हैं। हालांकि, यह exec() और query() के लिए सच नहीं है - आपको आम तौर पर उन दोनों को हार्डकोडेड प्रश्नों के लिए उपयोग करना चाहिए।

यह भी ध्यान रखें कि पीडीओ अपवाद फेंकता है। वे उपयोगकर्ता को संभावित रूप से संवेदनशील जानकारी प्रकट कर सकते हैं। आपको कम से कम प्रारंभिक पीडीओ सेटअप को कोशिश/पकड़ ब्लॉक में रखना चाहिए!

यदि आप इसे बाद में अपवादों को फेंकना नहीं चाहते हैं, तो आप त्रुटि मोड को चेतावनी के लिए सेट कर सकते हैं।

try { 
    $db = new PDO(...); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING) 
} catch (PDOException $e) { 
    echo 'Oops, something went wrong with the database connection.'; 
} 
+0

तो क्या एक/अन्य कथन के समान प्रयास/पकड़ ब्लॉक है? और विभिन्न विकल्पों को इंगित करने के लिए धन्यवाद, यह मुझे चारों ओर खेलने के लिए कुछ देना चाहिए! – Joe

+0

एक और त्वरित सवाल, '$ e' के लिए क्या उपयोग किया जाएगा, मुझे लगता है कि आप इसे किसी त्रुटि के लिए संदर्भित कर रहे हैं? – Joe

+0

काफी नहीं है। यदि कोशिश ब्लॉक में कहीं भी अपवाद फेंक दिया जाता है, तो यह कोशिश ब्लॉक के निष्पादन को रोकता है और कैच ब्लॉक निष्पादित करता है। $ ई अपवाद है जिसे फेंक दिया गया था। इसमें त्रुटि संदेश/कोड/फ़ाइल/रेखा इत्यादि शामिल है और व्यवस्थापक को ईमेल भेजने या फ़ाइल में लॉग इन करने के लिए उपयोग किया जा सकता है ताकि आप जांच सकें कि क्या गलत हुआ है। सारांश: त्रुटि प्रबंधन के लिए प्रयास/पकड़ असाधारण रूप से अच्छा है। क्या एक पन हाहा है। – riha

संबंधित मुद्दे