/ / MySQLi त्रुटि से निपटने? - php, आर्किटेक्चर, mysqli

MySQLi त्रुटि हैंडलिंग? - PHP, वास्तुकला, mysqli

मैंने प्रक्रियात्मक MySQL के बाद OO-MySQLi का उपयोग करना शुरू किया और मुझे एक समस्या है।

उत्पादन वातावरण में मेरा सिस्टम एक कस्टम पेज के रूप में सभी त्रुटियों को प्रदर्शित करता है। MySQLi त्रुटियाँ एक "त्रुटि" भी है और मैं उन्हें पकड़ना चाहता हूं, लेकिन प्रलेखन में ऐसा करने का केवल एक तरीका बताया गया है:

if (!$mysqli->query("SET a=1")) {
exit("An error occurred: " . $mysqli->error);
}

(सिर्फ उदाहरण के लिए)। यह एक बहुत ही बुरा तरीका है, क्योंकि मेरे सिस्टम में मैं कई चीजें कर रहा हूं जब त्रुटि हुई, जैसे लॉगिंग, कॉलिंग इवेंट आदि।

उदाहरण के लिए, मैं mysqli वर्ग का विस्तार कर सकता हूं:

class myMysqli {
public function __construct(/* ... */)
{
parent::__construct(/* ... */);
}

public function query(/* .. */)
{
parent::query(/* ... */);

if($this->errno !== 0)
{
// An error occurred
}
}
}
$mysqli = new myMysqli(/* ... */);
$mysqli->query(/* ... */);

लेकिन इस तरह मुझे लगभग विस्तार करने की आवश्यकता है सब ऐसे तरीके जहां त्रुटि हो सकती है। इसके अलावा, MySQLi तैयार स्टेटमेंट (mysqli_stmt वर्ग) प्रदान करता है जिसकी अपनी त्रुटियां हैं!

क्या आप MySQLi त्रुटियों को संभालने का एक बेहतर तरीका जान सकते हैं? पहले ही, आपका बहुत धन्यवाद।


जोड़ा गया

अपवादों के बारे में: क्या मैं सही ढंग से समझता हूं कि अपवादों के साथ मुझे ऐसा कुछ करने की आवश्यकता है:

try {
$mysqli->query(/* ... */);
} catch (Exception $e) {
// An error occurred
}

लेकिन यह समान है

if(!$mysqli->query(/* ... */))
{
// An error occured
}

क्या अंतर है?

उत्तर:

उत्तर № 1 के लिए 1

मैं कोशिश का उपयोग करें ... इस तरह की विधि को पकड़ने ...

try {
// get result of record from "id"
$query = "SELECT * FROM models WHERE id =$id";
$result = $mysqli->query($query);

if (!$result) {
throw new Exception($mysqli->error());
}
$row = $result->fetch_array();
}
catch (Exception $e)
{
echo "We are currently experiencing issues. Please try again later.";
echo $e->getMessage();
}
finally
{
$result->free();
}

क्या उससे किसी भी तरह से सहायता मिलती है?

आप किसी शर्त का परीक्षण करने के लिए "प्रयास" का उपयोग करते हैं और अपवाद को फेंक देते हैं यदि यह सच है ($ परिणाम)। और सब कुछ पकड़ने के लिए "पकड़" का उपयोग करें जो कि बस हो सकता है!


जवाब के लिए 0 № 2

सबसे पहले, आपका पुराना दृष्टिकोण गलत था।

exit("An error occurred: " . $mysqli->error);

सामान्य रूप से एक बुरा व्यवहार है और mysqli के साथ भी नहीं किया जाना चाहिए।

आप वास्तव में क्या चाहते हैं त्रुटि / अपवाद है हैंडलर। जहां आप लॉगिंग, कॉलिंग इवेंट्स, पेज दिखाने जैसी चीजें कर सकते हैं।

अपवाद नियमित त्रुटि से बेहतर है - इसलिए, अपनी mysqli को अपवाद मोड में सेट करें जैसा कि अन्य उत्तर में दिखाया गया है, और फिर त्रुटि हैंडलर में सभी त्रुटियों को पकड़ लें। जबकि कोशिश..चेक का इस्तेमाल करना होगा केवल जब आपके पास त्रुटि को संभालने के लिए एक विशेष विशेष कार्रवाई होती है।