2009-12-16 16 views
19

मेरे पास मेरी वेबसाइट (उच्च ट्रैफ़िक) पर एक पृष्ठ है जो प्रत्येक पृष्ठ लोड पर एक सम्मिलित करता है।PHP एसक्यूएल सम्मिलित करने के लिए कोशिश करें और पकड़ें

मैं सबसे तेज़ और सुरक्षित तरीका (एक त्रुटि पकड़ने) के उत्सुक हूं और जारी रखता हूं कि सिस्टम MySQL में डालने में सक्षम नहीं है। क्या मुझे कोशिश/पकड़ या मर या कुछ और उपयोग करना चाहिए। मैं यह सुनिश्चित करना चाहता हूं कि सम्मिलन होता है लेकिन अगर किसी कारण से यह नहीं चाहता कि मैं पेज को वैसे भी लोड करना जारी रखूं।

... 
$db = mysql_select_db('mobile', $conn); 
mysql_query("INSERT INTO redirects SET ua_string = '$ua_string'") or die('Error #10'); 
mysql_close($conn); 
... 
+0

"या मरने" के उपयोग पर: http://www.phpfreaks.com/blog/or-die-must-die – outis

+1

अपवादों के रूप में वापसी मूल्यों की जांच करने के लिए, यह इस बात पर निर्भर करता है कि कितने अंक त्रुटियां उत्पन्न कर सकते हैं। एक या दो बिंदुओं के साथ, मैं त्रुटि जांच के साथ जाऊंगा, क्योंकि यह अधिक प्रदर्शनशील है और इस मामले में पढ़ने योग्य है। कोड ब्लॉक में तीन या अधिक त्रुटि जांच करने के बाद, अपवाद अधिक पठनीय हो जाते हैं। यह सब चक्रीय जटिलता को कम करने के बारे में है। ध्यान दें कि यह उस बिंदु को शामिल करता है जो आप त्रुटि को संभालते हैं; यदि आप सिग्नलिंग त्रुटियों के बारे में बात कर रहे हैं, तो आप विभिन्न दिशानिर्देशों के साथ हवादार हो जाएंगे। – outis

उत्तर

23

documentation जाँच हो रही है पता चलता है कि अपने रिटर्न एक त्रुटि पर false। तो or die() के बजाय वापसी की स्थिति का उपयोग करें। अगर यह विफल हो जाता है तो यह झूठी वापसी करेगा, जिसे आप लॉग कर सकते हैं (या जो भी आप करना चाहते हैं) और फिर जारी रखें।

$rv = mysql_query("INSERT INTO redirects SET ua_string = '$ua_string'"); 
if ($rv === false){ 
    //handle the error here 
} 
//page continues loading 
+0

कि कोई त्रुटि नहीं फेंकती है? –

+1

मुझे नहीं लगता कि mysql_query अपवाद फेंकता है। – Yacoby

+8

दरअसल, न तो 'mysql_query' और न ही' mysqli_query' अपवाद फेंक देता है। 'PDOStatement :: execute' होगा, लेकिन केवल तभी जब आप' PDOStatement :: execute' को कॉल करने से पहले 'पीडीओ :: सेटएट्रिब्यूट (पीडीओ :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION)' कॉल करते हैं। – outis

5

यदि आप त्रुटि लॉग करना चाहते हैं तो आपको कोशिश/पकड़ने का उपयोग करना चाहिए, यदि आप नहीं करते हैं; बस mysql_query

संपादित करें: आप इस तरह की कोशिश करने का प्रयास कर सकते हैं; ताकि आप त्रुटि लॉग इन करें और पेज किसी भी विधि पिछले पोस्ट में वर्णित

function throw_ex($er){ 
    throw new Exception($er); 
} 
try { 
mysql_connect(localhost,'user','pass'); 
mysql_select_db('test'); 
$q = mysql_query('select * from asdasda') or throw_ex(mysql_error()); 
} 
catch(exception $e) { 
    echo "ex: ".$e; 
} 
+0

mysql फ़ंक्शन कोई अपवाद नहीं फेंक रहा है। – TheHippo

+0

महान उदाहरण, ऐसा करने का यह सबसे उचित तरीका प्रतीत होता है, और मैं इसके साथ भी रहना चाहता हूं। लाभ स्पष्ट है - आपको पता चलेगा कि आपको एक ब्लॉक में 5 प्रश्न कब करना होगा और अगर उनमें से कोई अपवाद के साथ विफल रहता है तो उसे बाहर निकालना होगा। हालांकि मैं थोड़ी देर के लिए उस पर विस्तृत जानकारी दूंगा। – Anonymous

+0

अच्छा उदाहरण और अच्छा तरीका, मेरे मामले के परिणाम: पूर्व: कुंजी 'प्राथमिक' के लिए संदेश 'डुप्लिकेट प्रविष्टि' 4 'के साथ अपवाद' अपवाद '। धन्यवाद – Phiber

-1

उपयोग लोड करने के लिए किसी भी तरह mysql त्रुटि को पकड़ने के लिए जारी रख सकते हैं।
सबसे आम है:

$res = mysql_query('bla'); 
if ($res===false) { 
    //error 
    die(); 
} 
//normal page 

यह भी होगा काम:

function error() { 
    //error 
    die() 
} 
$res = mysql_query('bla') or error(); 
//normal page 

try { ... } catch {Exception $e) { .... } काम नहीं करेगा!

नोट: सीधे आपके प्रश्न से संबंधित नहीं है, लेकिन मुझे लगता है कि यदि आप उपयोगकर्ता को कुछ उपयोगी दिखाते हैं तो यह बेहतर होगा। मैं कभी ऐसी वेबसाइट पर फिर से नहीं जाउंगा जो सिर्फ एक खाली स्क्रीन या किसी रहस्यमय त्रुटि संदेश प्रदर्शित करता है।

10

यह चाल कर सकते हैं,

function createLog($data){ 
    $file = "Your path/incompletejobs.txt"; 
    $fh = fopen($file, 'a') or die("can't open file"); 
    fwrite($fh,$data); 
    fclose($fh); 
} 
$qry="INSERT INTO redirects SET ua_string = '$ua_string'" 
$result=mysql_query($qry); 
if(!$result){ 
    createLog(mysql_error()); 
} 
+0

यह पूरी तरह से काम करता है। –

+0

@DjangoReinhardt धन्यवाद और मुझे किसी की मदद करने में खुशी है ... – VKGS

+0

@ सेकर मुश्किल .. –

2

yasaluyari के जवाब पर विस्तार से चर्चा करते मैं कुछ इस तरह के साथ छड़ी जाएगा:

हम सिर्फ हमारी mysql_query इस प्रकार संशोधित कर सकते हैं:

function mysql_catchquery($query,$emsg='Error submitting the query'){ 
    if ($result=mysql_query($query)) return $result; 
    else throw new Exception($emsg); 
} 

अब हम इसे इस तरह उपयोग कर सकते हैं, कुछ अच्छे उदाहरण:

try { 
    mysql_catchquery('CREATE TEMPORARY TABLE a (ID int(6))'); 
    mysql_catchquery('insert into a values(666),(418),(93)'); 
    mysql_catchquery('insert into b(ID, name) select a.ID, c.name from a join c on a.ID=c.ID'); 
    $result=mysql_catchquery('select * from d where ID=7777777'); 
    while ($tmp=mysql_fetch_assoc($result)) { ... } 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 

ध्यान दें कि यह कितना सुंदर है। जब भी कोई भी qq हमारी त्रुटियों के साथ gtfo विफल रहता है। और आप यह भी ध्यान दे सकते हैं कि सत्यापन के लिए हमें $result चर में लेखन प्रश्नों की स्थिति को संग्रहीत करने की आवश्यकता नहीं है, क्योंकि हमारा कार्य अब इसे स्वयं ही संभालता है। और वैसे ही यह चयनों को संभालता है, यह सामान्य रूप से एक चर को परिणाम देता है जैसा सामान्य कार्य करता है, फिर भी त्रुटियों को स्वयं में संभालता है।

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

6

आप mysql क्वेरी पर फेंकने वाले अपवादों को लागू कर सकते हैं अपने आप में विफल। क्या आप की जरूरत mysql_query समारोह के लिए एक आवरण, उदा .:

// user defined. corresponding MySQL errno for duplicate key entry 
const MYSQL_DUPLICATE_KEY_ENTRY = 1022; 

// user defined MySQL exceptions 
class MySQLException extends Exception {} 
class MySQLDuplicateKeyException extends MySQLException {} 

function my_mysql_query($query, $conn=false) { 
    $res = mysql_query($query, $conn); 
    if (!$res) { 
     $errno = mysql_errno($conn); 
     $error = mysql_error($conn); 
     switch ($errno) { 
     case MYSQL_DUPLICATE_KEY_ENTRY: 
      throw new MySQLDuplicateKeyException($error, $errno); 
      break; 
     default: 
      throw MySQLException($error, $errno); 
      break; 
     } 
    } 
    // ... 
    // doing something 
    // ... 
    if ($something_is_wrong) { 
     throw new Exception("Logic exception while performing query result processing"); 
    } 

} 

try { 
    mysql_query("INSERT INTO redirects SET ua_string = '$ua_string'") 
} 
catch (MySQLDuplicateKeyException $e) { 
    // duplicate entry exception 
    $e->getMessage(); 
} 
catch (MySQLException $e) { 
    // other mysql exception (not duplicate key entry) 
    $e->getMessage(); 
} 
catch (Exception $e) { 
    // not a MySQL exception 
    $e->getMessage(); 
} 
+0

लॉल, मैंने 10 मिनट पहले इसी तरह का जवाब दिया था। – Anonymous

+0

@ अनाम, यहां थोड़ा अलग दृष्टिकोण है - आप केवल एक सामान्य अपवाद फेंकते हैं और आप नहीं जानते कि किस तरह का अपवाद फेंक दिया गया है। बेशक आप 'errno' को' $ code' ('अपवाद 'के लिए दूसरा पैरा) के रूप में पास कर सकते हैं और इसे' कैच 'ब्लॉक में देख सकते हैं, लेकिन यह व्यापक नहीं है। यही कारण है कि मैंने इस सवाल को लिखा है कि इस सवाल पर पहले से ही 2 उत्तर हैं, 'mysql_query' फेंकने के लिए रैपर का शोषण। तो, हाँ, यह समान है, लेकिन बिल्कुल वैचारिक रूप से नहीं। – Nemoden

+0

मैं समझता हूं, त्रुटियों के प्रकारों पर आपकी समझ है, जबकि मेरा उपयोग विशेष रूप से उपयोग में आसान है। :) – Anonymous

0
$sql = "INSERT INTO customer(FIELDS)VALUES(VALUES)"; 
    mysql_query($sql); 
    if (mysql_errno()) 
    { 
      echo "<script>alert('License already registered');location.replace('customerform.html');</script>"; 
    } 
0
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

मुझे यकीन है कि नहीं कर रहा हूँ लिखने के लिए यदि इस का एक mysql संस्करण है लेकिन कोड की इस पंक्ति जोड़ने mysqli_sql_exception फेंकने की अनुमति देता है।
मुझे पता है, बहुत समय बीत चुका है और सवाल पहले से ही उत्तर दिया गया है लेकिन मुझे एक अलग जवाब मिला और यह सहायक हो सकता है।

+0

हां, आपके पास अलग-अलग उत्तर हो सकते हैं। कृपया उत्तर में अधिक विवरण जोड़ें जैसे कि कोड की रेखा कहां जोड़नी है और कोड को विस्तार से समझाए गए लिंक? – Ram

+0

जब तक यह php फ़ाइल में उपयोग किया जाता है, तो आप mysqli_sql_exceptionS को पकड़ने में सक्षम हो सकते हैं। – starkm

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