2012-06-29 3 views
12

В настоящее время я испытываю странную ошибку.Как вставить двоичные данные в MSSQL с помощью PDO

Установка: MSSQL Server 2012 Экспресс с 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. Все отлично работает, кроме одного: Я не могу написать строку в мою таблицу администратора из-за пароля.

Давайте посмотрим на моем ЗАШИФРОВАННОМ пароле:

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 я могу вставить строку с точно таким же 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.

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

+2

Не уверен в ms sql, но должен быть способ объявить двоичный столбец, то есть без кодирования или сортировки. –

+0

@Jack, Спасибо за комментарий. После этого я попробовал двоичные и varbinary столбцы, но они тоже не работают. – Richard

+0

Хорошо, есть ли способ связать параметр как двоичный в PDO? –

ответ

2

Вы должны изменить свое сопоставление на что-то вроде 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); 
Смежные вопросы