2013-03-07 7 views
12

मैं पीडीओ का उपयोग कर एक MySQL डेटाबेस पर प्रश्नों के लिए से निपटने के उचित त्रुटि बनाने के लिए कोशिश कर रहा हूँ के लिए जांच की जा रही करने में त्रुटि। मैं चाहता हूं कि इस कार्यक्रम से बाहर निकलने के लिए तैयार कथन प्रक्रिया में एक त्रुटि का पता चल जाए। checkSuccess() निम्न कार्य के साथपीडीओ तैयार वक्तव्य

global $allFields; 
global $db; 
global $app; 
//dynamically append all relevant fields to query using $allFields global 
$selectQuery = 'SELECT ' . implode($allFields, ', ') . 
    ' FROM People WHERE ' . $fieldName . ' = :value'; 
//prepared statement -- returns boolean false if failure running query; run success check 
$success = $selectQueryResult = $db->prepare($selectQuery); 
    checkSuccess($success); 
$success = $selectQueryResult->bindParam(':value', $fieldValue, PDO::PARAM_STR); 
    checkSuccess($success); 
$success = $selectQueryResult->execute(); 
    checkSuccess($success); 

: तथ्य यह है कि पीडीओ तैयार बयान प्रक्रिया के प्रत्येक चरण रिटर्न False विफलता पर का लाभ उठाते हुए, मैं एक साथ इस प्रतिकूल हैक फेंक दिया

function checkSuccess($success) { 
    if ($success == false) { 
     //TODO: custom error page. 
     echo "Error connecting to database with this query."; 
     die(); 
    } 
} 

दो बातें। सबसे पहले, यह बहुत verbose और बेवकूफ है। इसके लिए अवश्य ही एक बेहतर तरीका होना चाहिए। ' जाहिर है मैं एक पंक्ति या कोड के 2, लेकिन अभी भी बाहर निकालने के लिए एक सरणी या कुछ में बूलियन्स संग्रहीत कर सकती है।

दूसरा, यह भी इन मूल्यों को जांच करने के लिए आवश्यक है, या मैं सिर्फ परिणाम की जाँच करनी चाहिए के बाद मैं कोड की इस पंक्ति प्रदर्शन:

if ($result) { //test if query generated results 
    // do successful shit 
} 

else { 
    echo "404"; 
    $app->response()->status(404); //create 404 response header if no results 
:

$result = $selectQueryResult->fetch(PDO::FETCH_ASSOC); 

मैं पहले से ही है कि इस करता है कोड है

जितना मैं अजीब, बेमेल या लम्बे प्रश्नों को डालने के द्वारा तैयार कथन प्रक्रिया को तोड़ने की कोशिश करता हूं, मेरा प्रोग्राम हमेशा $result असाइनमेंट को false पर वापस किए बिना किसी भी फ़ंक्शन पर checkSuccess() चलाता है। तो शायद मुझे उपर्युक्त तर्क की जांच करने की आवश्यकता नहीं है? ध्यान रखें कि मैं प्रोग्राम में पहले एक सफल डेटाबेस कनेक्शन की जांच करता हूं।

+0

[scolding] DO NT उपयोग 'global's [/ डांट] इस की जाँच करें - http://stackoverflow.com/questions/1557787/are-global-variables-in-php-considered-bad-practice-if-so-why – ShuklaSannidhya

उत्तर

12

मैं इस तरह अपवाद फेंक करने के लिए त्रुटि मोड सेट preffer:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

सही होने के बाद मैं डेटाबेस से कनेक्ट। तो हर समस्या का एक PDOException फेंक देते हैं तो अपने कोड होगा:

$selectQuery = ' 
       SELECT 
        ' . implode($allFields, ', ') . ' 
       FROM 
        People 
       WHERE 
        ' . $fieldName . ' = :value 
'; 
try 
{ 
    $selectQueryResult = $db->prepare($selectQuery); 
    selectQueryResult->bindParam(':value', $fieldValue); 
    $selectQueryResult->execute(); 
} 
catch(PDOException $e) 
{ 
    handle_sql_errors($selectQuery, $e->getMessage()); 
} 

जहां समारोह होगा:

function handle_sql_errors($query, $error_message) 
{ 
    echo '<pre>'; 
    echo $query; 
    echo '</pre>'; 
    echo $error_message; 
    die; 
} 

वास्तव में मैं एक सामान्य समारोह भी तरह कुछ है कि उपयोग कर रहा हूँ

$debug = debug_backtrace(); 
echo 'Found in ' . $debug[0]['file'] . ' on line ' . $debug[0]['line']; 

मुझे यह बताने के लिए कि अगर मैं एकाधिक प्रश्न

+0

आपको 'try' block में 'ready' कथन भी रखना चाहिए। – jeroen

+1

-1। किसी भी त्रुटि को थूकने के लिए प्रयास न करें .. कोशिश करें। यह बेकार, अनावश्यक और असुरक्षित –

+7

@YourCommonSense उस पर और अधिक साझा करने की देखभाल करता है? यह भी .. यह सिर्फ एक उदाहरण है जो प्रारंभिक कोड की कोशिश करने के समान ही करता है .. यह फ़ाइल को लॉग ऑन भी कर सकता है, एक संदेश या किसी भी प्रकार की त्रुटि प्रबंधन भेज सकता है .. सवाल यह था कि त्रुटियों को कैसे पकड़ें , उनके साथ क्या करना है – mishu

4

आप PDOException को पकड़ने के लिए है:

try { 
    //your code/query 
} catch (PDOException $e) { 
    //Do your error handling here 
    $message = $e->getMessage(); 
} 

PDOException

+2

और बनाने सुनिश्चित करें कि पीडीओ अपवाद फेंकता है: '$ db-> setAttribute (पीडीओ :: ATTR_ERRMODE, पीडीओ :: ERRMODE_EXCEPTION);' – jeroen

+0

इस जनता के लिए तैनात किए गए कोड के लिए सुरक्षित है? या क्या यह मेरी टेबल के बारे में संवेदनशील जानकारी प्रदर्शित करने का जोखिम उठाता है? – user1427661

+0

@ user1427661 आप एक लाइव साइट पर तकनीकी त्रुटि संदेश प्रदर्शित नहीं करनी चाहिए। बस सुनिश्चित करें कि वे लॉग हैं। – jeroen

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