2013-03-07 15 views
12

PDO tarafından hazırlanmış ifadeleri kullanarak bir MySQL veritabanında sorgu için uygun hata işleme oluşturmaya çalışıyorum. Programın o andan çıkmasını istiyorum, hazırlanan deyimdeki bir hata tespit edildi. checkSuccess() aşağıdakileri yaparak birliktePDO Hazırlanan Deyimler için Hata Denetimi

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); 

: PDO hazırlanan deyimi sürecinde her adımı başarısızlık üzerine False döndürür aslında yararlanarak, birlikte bu iğrenç kesmek attı

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

iki şey. İlk olarak, bu korkunç derecede ve aptalca. Daha iyi bir yol olmalı. Açıkçası boole'ları bir dizide veya bir kod veya bir kod 2 çıkarmak için bir şey saklayabilirim, ama yine de.

İkincisi, bu değerleri kontrol bile gerekir, yoksa bu kod satırı gerçekleştirildikten sonra ben sadece sonucu kontrol etmelisiniz:

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); 

Zaten bunu yapar koduna sahip

Hazırlanan deyim sürecini tuhaf, eşleşmeyen veya uzun sorguları ekleyerek kırmaya çalıştığım zaman, programım false'u checkSuccess() çalıştırdığım işlevlerden hiçbirine dönmeden $result atamasına her zaman yapar. Yani belki yukarıdaki mantığı kontrol etmem gerekmiyor mu? Programda daha önce başarılı bir veritabanı bağlantısı olup olmadığını kontrol etmeyi unutmayın.

+0

[azarı] DO NT USE 'global's [/ scolding] Bunu kontrol edin - http://stackoverflow.com/questions/1557787/are-global-variables-in-php-considered-bad-practice-if-so-why – ShuklaSannidhya

cevap

12

:

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

Ben veritabanına bağlanmak hemen sonra. Böylece her sorun bir PDOException atacağım Yani kod olacaktır:

$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()); 
} 

işlevi nerede olacağını:

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

Ben de böyle bir şey vardır genel işlevi kullanıyorum

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

nerede birden fazla sorgu sorunu çalıştırıyorum eğer söyle

+0

Ayrıca 'hazırla 'deyimini' try' bloğuna da koymalısınız. – jeroen

+1

-1. ASLA try..catch sadece bir hata yapmak için kullanın. Daha fazlası için bu işe yaramaz, gereksiz ve güvensiz –

+7

@YourCommonSense bakımı? ayrıca .. bu sadece ilk kodun denediği şeye benzer bir şey yapan bir örnektir .. bir dosyaya da yazabilir, bir mesaj gönderebilir ya da herhangi bir hata işleme türü gönderebilir. değil, hızlı ve kirli bir uygulama yapıyorum, istisna işleme dışarı bırakarak ek kod olmadan hataları bildirecektir muhtemelen bana güveniyorum için onlarla – mishu

4

Sen PDOException yakalamak zorunda: Böyle durumlar atma hata modunu ayarlayarak preffer

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

PDOException

+2

Ve yap PDO'nun istisnalar attığından emin olun: '$ db-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);' – jeroen

+0

Bu, genel kullanıma açık kod için güvenli midir? Yoksa tablolarım hakkında hassas bilgiler gösterme riski var mı? – user1427661

+0

@ user1427661 Teknik hata mesajlarını asla canlı bir sitede görüntülememelisiniz. Sadece kayıt olduklarından emin ol. – jeroen

İlgili konular