كيفية جعل PDO تشغيل مجموعة أسماء UTF8 في كل مرة أتوصل فيها، في ZendFrameWork

StackOverflow https://stackoverflow.com/questions/584676

سؤال

كيفية جعل محول PDO تشغيل تعيين أسماء UTF8 في كل مرة أقوم فيها بالاتصال، في ZendFrameWork. أنا أستخدم ملف INI لحفظ بيانات تكوين المحول. ما هي الإدخالات التي يجب أن أضيف هناك؟

إذا لم يكن واضحا، فأنا أبحث عن بناء الجملة الصحيح للقيام بذلك في ملف Config.ini لمشروعي وليس في كود PHP، كما اعتبر هذا الجزء من رمز التكوين.

هل كانت مفيدة؟

المحلول

itay،

سؤال جيد جدا. لحسن الحظ بالنسبة لك الجواب بسيط للغاية:

database.params.driver_options.1002 = "SET NAMES utf8"

1002 هي قيمة PDO ثابت :: mysql_attr_init_command

لا يمكنك استخدام الثابت في CONFIG.INI

نصائح أخرى

الخوف بلدي جوجل فو

$pdo = new PDO(
    'mysql:host=mysql.example.com;dbname=example_db',
    "username",
    "password",
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

الضربة الأولى ؛)

فقط ضع هذا في التكوين الخاص بك

database.params.charset = "utf8"

أو بعد ZF 1.11 هذا سيعمل علىresources.db.params.charset = utf8هذا هو

الاتصال في zend_db كسول مما يعني أنه يتصل في الاستعلام الأول. إذا كانت لديك صفحة ثابتة مع عدم وجود استعلام، فلن تتصل حتى الآن - حتى لو تم تهيئتها في ملف Bootstrap.

لذلك تشغيل:

$db->query("SET NAMES 'utf8'");

ليس ذكيا جدا. شكرا جزيلا على DCAunt لحله.

كل هذه الطرق شود العمل، إلا في بعض الظروف الخاصة. على سبيل المثال، إذا كنت تقوم بتشغيل خادم ويب محليا على جهاز Windows باستخدام PHP <5.3.1، فقط "يدوي" DBB-> استعلام ("تعيين الأسماء" UTF8 ")؛ قبل الاستعلام الفعلي الخاص بك سيعمل. سوف تفشل أي طريقة أخرى في محاولة لاستخدام MySQL_ATTR_INIT_COMMAND.

إليك ما تعلمته اليوم، يكافح مع هذه المشكلة ذاتها:

  1. لا يمكنك الرجوع إلى PDO :: MySQL_ATTR_INIT_COMMAND في بعض البيئات (أي الألغام، على وجه التحديد لا أعرف). يجب عليك استخدام 1002 صراحة بدلا من ذلك

  2. مع ZEND Framework 1.11 (ربما منذ 1.8، يتم تأكيده)، لا تحتاج إلى تعيين قاعدة البيانات. params.driver_options.1002 = "تعيين أسماء UTF8" في CONFIG.INI: Resources.db.params.charset = "UTF8 "سيكون كافيا ل zend_db_adapter_pdo_mysql للقيام بذلك من أجلك.

  3. على Windows، تحتاج PHP> = 5.3.1 ل MySQL_ATTR_INIT_COMMAND للعمل.

  4. إذا قمت باستبدال إصدار PHP الخاص بك مع 5.3.1 أو أعلى (اخترت أيضا 5.3.3)، فأنت بحاجة إلى التأكد من تعيين قيمة إلى pdo_mysql.default_socket في php.ini. لن تعمل القيمة الفارغة الافتراضية (يجب تأكيدها: قرأت شيئا عن هذا لكنني لم أكن عناء للمحاولة بدونها بعد العثور على نقطة 5)

  5. تحتاج أيضا إلى التأكد من أن لديك "127.0.0.1 LocalHost" في ملف نظام Windows System32 Drivers Etc Etc Etc Hosts (لم تكن مشكلة ل PHP 5.3.0)

بكل هذا في الاعتبار، يجب أن تكون قادرا على الانقاذ من نفسك في يوم من Googling والحفاظ على بعض شعرك! ؛)

عليك فقط تنفيذ هذا الأمر قبل أن تبدأ الاستعلامات، يجب عليك فقط تنفيذها مرة واحدة قبل الاستعلامات وليس لكل استعلام.

$pdo->query("SET NAMES 'utf8'");

مثال على ذلك

$servername = "localhost";
$username = "root";
$password = "test";
$dbname = "yourDB";

try {
    $pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

    $pdo->query("SET NAMES 'utf8'");

    //set the PDO error mode to exception
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT name FROM nations";
    foreach ($pdo->query($sql) as $row) {
       echo "<option value='".$row['name']."'>".$row['name']."</option>";
    }


} catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$pdo = null; 

في ملف bootstrap الخاص بك ...

$db = Zend_Db::factory($adapter, $config);
$db->query("SET NAMES 'utf8'");

ثم يمكنك حفظ هذا المثيل في السجل الخاص بك

Zend_Registry::set('db', $db);
$table->getAdapter()->query('SET NAMES UTF8');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top