Кодирование UTF-8 с помощью php pdo [duplicate]

В то время как , что вызывает NullReferenceExceptions и подходит к avoid / fix , такое исключение было рассмотрено в других ответах, что многие программисты не имеют " t узнал еще, как независимо отлаживать такие исключения во время разработки.

В Visual Studio это обычно легко благодаря Visual Studio Debugger .


Во-первых, убедитесь, что правильная ошибка будет обнаружена - см. . Как разрешить нарушение «Исключение System.NullReferenceException» в VS2010? Примечание1

Затем либо Начать с отладки (F5) , либо Приложить [отладчик VS] к запуску процесса . Иногда может быть полезно использовать Debugger.Break , в котором будет предложено запустить отладчик.

Теперь, когда NullReferenceException выбрано (или необработанно), отладчик остановится ( помните правило, указанное выше?) в строке, на которой произошло исключение. Иногда ошибка может быть легко обнаружена.

Например, в следующей строке единственный код, который может , вызывает исключение, если myString имеет значение null. Это можно проверить, посмотрев окно Watch или выполнив выражения в окне Immediate Window .

var x = myString.Trim();

В более сложных случаях, таких как следуя ниже, вам нужно будет использовать один из методов выше (Watch или Immediate Windows) для проверки выражений, чтобы определить, было ли str1 пустым или если str2 имеет значение null.

var x = str1.Trim() + str2.Trim();

Once , где было выбрано исключение, это обычно тривиально по отношению к разуму назад, чтобы выяснить, где введенное значение null было [неправильно] -

. Найдите время, необходимое для понимания причина исключения. Проверьте нулевые выражения. Проверьте предыдущие выражения, которые могли бы привести к таким нулевым выражениям. Добавьте контрольные точки и, по мере необходимости, пройдите через программу. Используйте отладчик.


1 Если Break on Throws слишком агрессивен и отладчик останавливается на NPE в библиотеке .NET или сторонних разработчиков, Break на User-Unhandled можно использовать для ограничения выловленных исключений. Кроме того, VS2012 представляет Just My Code , который я рекомендую также включить.

Если вы отлаживаете с включенным Just My Code, поведение немного отличается. При включенном Just My Code отладчик игнорирует исключения, связанные с привилегиями обычного языка (CLR) первого шанса, которые выходят за пределы My Code и не проходят через My Code

blockquote>

7
задан Pierre Buyle 6 December 2011 в 12:10
поделиться

4 ответа

При работе в Linux и использовании драйвера FreeTDS кодировку для клиента можно настроить с настройкой client charset в файле freetds.conf . Для того, чтобы файл freetds.conf использовался при использовании PDO ODBC и unixODBC, необходимо настроить источник данных ODBC с помощью комбинированной конфигурации ODBC . Если для настройки источника данных ODBC используется конфигурация только ODBC , файл freetds.conf не используется. С этим я смог получить и вставить данные UTF-8 из / в базу данных MS SQL Server.

Будучи парнем Linux / Unix, я не смог понять / найти способ настройки кодировки используется, когда PDO ODBC используется в Windows. Смутное понимание заключается в том, что при настройке на системном уровне источник данных ODBC может быть настроен для использования кодировки базы данных SQL Server или преобразования в кодировку клиентского компьютера.

5
ответ дан Pierre Buyle 26 August 2018 в 10:42
поделиться

Вы можете использовать этот код, чтобы исправить свою проблему:

Первичные данные Преобразование

'$word = iconv("UTF-8","Windows-1254",$_POST['search']);'

И чтение данных Преобразование

while($data = $result->fetchObject()){
  $values[] = iconv("Windows-1254", "UTF-8",$data->text));
}

SQL String

$sql = "SELECT * FROM yourtables WHERE text LIKE '%{$word}%'";
or
$sql = "SELECT * FROM yourtables";
0
ответ дан Cemil şen 26 August 2018 в 10:42
поделиться

Вы можете использовать этот код, чтобы исправить свою проблему:

$result = odbc_exec($this->con, $sql);    
$data = fetch2Array($result);

 private function fetch2Array($result){    
    $rows = array();

    while($myRow = odbc_fetch_array( $result )){ 
        $rows[] = $this->arrayToUTF($myRow);
    }
    return $rows;
}

private function arrayToUTF($arr){
    foreach ($arr as $key => $value) {
        $arr[$key] = utf8_encode($value);
    }
    return $arr;
}
0
ответ дан Pacho Zuñiga 26 August 2018 в 10:42
поделиться

При настройке кодировки символов на UTF-8 вам также потребуется кодировать ваши запросы как UTF-8 и декодировать результаты. Кодировка говорит водителю, что вы говорите UTF8 изначально. Таким образом, вам нужно преобразовать UTF8 обратно в то, что понимает PHP (ASCII или mbstring).

$dsn = "odbc:DRIVER={SQL Server};SERVER=$hostname;DATABASE=$database;charset=UTF-8";
$pdo = new PDO($dsn,$username,$password);
$sql = utf8_encode("SELECT text FROM atable");
$result = $PDO->query($sql);
while($data = $result->fetchObject()){
  $values[] = utf8_decode($data->text); 
  // possibly also: $values[] = utf8_decode($data[utf8_encode('text')]);
}
dpm($values);
2
ответ дан Veggivore 26 August 2018 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: