Подтвердить что ты не робот

Как вставить двоичные данные в MSSQL с помощью PDO

В настоящее время я испытываю странную ошибку.

Настройка: MSSQL Server 2012 Express с localdb Сопоставление целевой таблицы: SQL_Latin1_General_CP1_CI_AS

PHP 5.3.9 на сервере Zend 5.6 MCrypt с MCRYPT_RIJNDAEL_256 и MCRYPT_MODE_ECB

Sublime Text 2 по умолчанию (я читал это спецификация UTF8)

Я использую PDO с официальным MS-адаптером для сервера MSSQL. Все отлично работает, кроме одного: Я не могу написать строку в моей таблице администратора из-за пароля.

Давайте посмотрим на мой пароль ENCRYPTED:

y"ûƒ^äjw¾bðúl5êù-Ö=W¿Š±¬GP¥Œy÷&ø

Это трассировка PDO:

Array
(
    [0] => IMSSP
    [1] => -7
    [2] => An error occurred translating string for input param 3 to UCS-2: No mapping for the Unicode character exists in the target multi-byte code page.


)
SQL: [120] INSERT INTO administrator ( [username], [email], [password], [section] )  VALUES(:username, :email, :password, :section)
Params:  4
Key: Name: [9] :username
paramno=0
name=[9] ":username"
is_param=1
param_type=2
Key: Name: [6] :email
paramno=1
name=[6] ":email"
is_param=1
param_type=2
Key: Name: [9] :password
paramno=2
name=[9] ":password"
is_param=1
param_type=2
Key: Name: [8] :section
paramno=3
name=[8] ":section"
is_param=1
param_type=2

Когда я использую свой MSSQL Management Center, я могу вставить мою строку с тем же SQL-запросом. Предположим, что настройка столбца:

    ["id"]=>
    string(3) "int"
    ["username"]=>
    string(12) "nvarchar(45)"
    ["email"]=>
    string(12) "nvarchar(45)"
    ["password"]=>
    string(12) "varbinary(45)"
    ["section"]=>
    string(11) "nvarchar(7)"
    ["country_code"]=>
    string(11) "nvarchar(2)"

Я использую подготовленные операторы и функцию bindParam без дополнительных параметров для выполнения моих операторов SQL.

Если у кого-то есть идея, как решить это, пожалуйста, дайте мне знать. Приветствуется помощь Anykind!

4b9b3361

Ответ 1

Вы должны изменить свое сопоставление на что-то вроде utf8_unicode_ci для обработки этих нескольких символов без присмотра.

Также вы должны попробовать что-то вроде этого:

$db = new PDO('foo', 'bar', 'blo');
$stmt = $db->prepare("select foo, bar from table where id=?");
$stmt->execute(array($_GET['id']));
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
header("Content-Type: $type");
fpassthru($lob);

Чтобы дважды проверить тип (здесь происходит ошибка/ошибка), выполните эту проверку, возможно, даже вместо последней строки моего примера выше:

if (is_string($lob)) echo $lob;
else fpassthru($lob);