2012-12-26 39 views
8

php.net, स्टैक ओवरफ्लो और ट्रस्ट के अन्य स्रोतों के अनुसार, मुझे पीडीओ कनेक्शन पर यूटीएफ -8 सेट करने के 4 अलग-अलग तरीके मिल सकते हैं, लेकिन यह नहीं मिल सकता कि कौन सी चुनना बेहतर है।पीडीओ कनेक्शन: एसईटी नाम/चरित्र सेट के साथ यूटीएफ -8 घोषणा?

एक पीडीओ कनेक्शन कोड (और कुछ inits):

$localhost = $_SERVER['SERVER_NAME'] == 'localhost'; 
error_reporting(-1); ini_set('display_errors', $localhost); // Old : error_reporting($localhost ? -1 : 0); see answer above 
date_default_timezone_set('Europe/Paris'); 

$pdo_db = 'mysql:host=localhost;dbname=local_db;charset=utf8'; // METHOD #1 
$pdo_login = 'root'; 
$pdo_pass = 'localpass'; 

try { 
    $db = new PDO($pdo_db, $pdo_login, $pdo_pass, array(
     PDO::ATTR_ERRMODE => $localhost ? PDO::ERRMODE_EXCEPTION : PDO::ERRMODE_SILENT, 
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', // METHOD #2 
    )); 
    $db -> exec('SET NAMES utf8'); // METHOD #3 
    $db -> exec('SET CHARACTER SET utf8'); // METHOD #4 
    $db -> exec('SET time_zone = \''.date_default_timezone_get().'\''); 
} catch (PDOException $error) { 
    die($error -> getMessage()); 
} 

तो, मैं क्या समझ में आया, कि विधि 1 केवल पीएचपी के साथ काम 5.3+ (लेकिन ऐसा लगता है कि यह थोड़ा गाड़ी है) है, और विधि 2 केवल MySQL के लिए है। विधि 3 और 4 के बीच अंतर MySQL thing है, लेकिन मुझे अभी भी पता नहीं है कि कौन बेहतर है। और पीडीओ विशेषताओं में सेट नामों को कॉल करने का कोई तरीका है, लेकिन केवल MySQL के लिए नहीं?

धन्यवाद!

उत्तर

6

DSN में यह निर्धारित करना केवल उचित तरीका है (हालांकि यह केवल 5.3 के बाद से समर्थित है)।
आप एक ही समय में यह एक और SET NAMES कर सकते हैं।

अन्य सभी तरीकों से कुख्यात आधा-काल्पनिक जीबीके इंजेक्शन संभव हो जाएगा।

कृपया ध्यान दें कि error_reporting() के लिए आपकी सेटिंग पूरी तरह से गलत है। यह बिना शर्त -1 होना चाहिए। यदि आप त्रुटियों को प्रदर्शित करने के बारे में चिंतित हैं - इसके लिए एक उचित आईएनआई सेटिंग है, जिसे display_errors कहा जाता है, रनटाइम पर सेट किया जा सकता है।
जबकि error_reporting त्रुटि के स्तर सेट करता है और हर समय अधिकतम होना चाहिए।

+0

तो <5.3, सेट नाम कॉललेट और सीई, लेकिन 5.3.0 और इससे पहले, विधि # 1 केवल वास्तव में पर्याप्त है? और, क्या मैं दोनों को दे सकता हूं? ओह और मुझे आपका मुद्दा नहीं मिलता है: इसे बिना शर्त -1 क्यों होना चाहिए? मैं नहीं चाहता कि त्रुटियों को प्रदर्शित करने के लिए जब मैं स्थानीयहोस्ट हूं ... (इस विषय-वस्तु सलाह के लिए धन्यवाद btw!) – Joan

+0

यह बिल्कुल सही लगता है! तो दूसरी पंक्ति 'error_reporting (-1) बन जाती है; ini_set ('display_errors', $ localhost); '। – Joan

-2

मैं हमेशा अपने dbconfig फ़ाइल में इन कोड लिखें:

mysql_query("SET character_set_results = 'utf8', 
       character_set_client = 'utf8', 
       character_set_connection = 'utf8', 
       character_set_database = 'utf8', 
       character_set_server = 'utf8'"); 
+0

हाँ लेकिन पीडीओ के बारे में क्या? ओपी को पीडीओ या माइस्क्ली समाधान पसंद नहीं करना चाहिए? – luchosrock

+0

तो 'सेट नाम' utf8 'COLLATE' utf8_general_ci'' इसका शॉर्टकट है? – Joan

+0

@ डिजजो हाँ, लेकिन यह वेब इंटरफेस से सभी इनपुट और आउटपुट को भी नियंत्रित करता है – Ehsan

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

  • कोई संबंधित समस्या नहीं^_^