2016-04-28 2 views
0

Я struggeling с крошечным скрипт, который отвечает за 2 вещи: - усечения базы данных - загрузки файлов в базу данныхPHP - File получить содержание и правильное кодирование

выглядит так:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 


$mysql_host = 'localhost'; 
$mysql_username = 'x'; 
$mysql_password = 'y'; 
$mysql_database = 'z'; 

$db = new PDO('mysql:dbname='.$mysql_database.';host='.$mysql_host,$mysql_username,$mysql_password); 

// works not with the following set to 0. You can comment this line as 1 is default 
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1); 

function truncate_db() 
{ 
    global $db; 

    $sql_query_1 = " 
    TRUNCATE TABLE `VISITS`; 
    TRUNCATE TABLE `ANIMALS`; 
    TRUNCATE TABLE `DOCTORS`; 
    TRUNCATE TABLE `PAYMENTS`; 
    TRUNCATE TABLE `CUSTOMER` 
    "; 

    try { 
     $stmt = $db->prepare($sql_query_1); 
     $stmt->execute(); 
     echo "Truncate action - OK"; 
    } 
    catch (PDOException $e) 
    { 
     echo $e->getMessage(); 
     die(); 
    } 
} 

function import_db() 
{ 
    global $db; 

    try 
     { 
     $sql_query_2 = implode(array_map(function ($v) { 
      return file_get_contents($v); 
      }, glob(__DIR__ . "/*.sql"))); 

     $qr = $db->exec($sql_query_2); 
     echo "Import action - OK"; 
     } 
     catch (PDOException $e) 
     { 
     echo 'Connection failed: ' . $e->getMessage(); 
    } 
} 

truncate_db(); 
echo '<br />'; 
import_db(); 

$db = null; 
?> 

Проблема - файлы (sql one), которые я загружаю в базу данных, содержат специальные символы (например, ś, ó, ę и т. Д.). После этого у меня есть проблема в базе данных, что некоторые слова не содержат больше тех символы. После загрузки у меня есть такие символы, как: ³, ¿и т. Д. Как отредактировать функцию import_db(), чтобы сохранить эти символы? я думал о:

mb_convert_encoding 

, но я понятия не имею, как включить это в мой код,/в моей таблице БД, колонка с того, что слова (содержащий специальные символы) устанавливается: utf8_general_ci. благодаря!

+0

попробуйте добавить: $ dbh = new PDO ('mysql: charset = utf8mb4'); – Naruto

+0

попробуйте это - $ db = new PDO ('mysql: dbname ='. $ Mysql_database. '; Host ='. $ Mysql_host, $ mysql_username, $ mysql_password; charset = utf8); –

+0

не работает. Когда я использую ваш код OR $ db-> exec ('SET NAMES utf8'); он просто отсекает все в слове после этого специального символа :( –

ответ

1

Я неясный на то, что ваша проблема

усеченный текст, когда вы пытаетесь вставить Señor, но считают, что только Se отображается в таблице. Эта форма усечения обычно вызывается

  • Клиент символы с диакритическими знаками, закодированные в latin1 (или LATIN2, и т.д.), и
  • SET NAMES utf8 был в силе в течение INSERT (или LOAD DATA)

То есть, вы должны либо получить текст в utf8, либо вы должны изменить то, что вы указываете MySQL, кодирование.

Если вы можете получить шестнадцатеричное содержимое файла, ś ó ę должно быть 2-байтовым шестнадцатеричным C59B C3B3 C499 в utf8. latin1 имеет только ó как один байт F3. В latin2 это B6 F3 EA, так что, возможно, это то, откуда вы пришли?

Это нормально, если у вас есть несоответствие между тем, что говорит SET NAMES, и что CHARACTER SET вы установили в стол/столбец. MySQL будет конвертировать кодировку по мере ее переноса.

Не используйте mb_convert_encoding или любые другие функции преобразования при использовании MySQL, это только добавляет путаницы.

Кроме того, делайте TRUNCATEs по одному за раз. API не любит несколько операторов.

Смежные вопросы