2012-06-29 27 views
12

Actualmente estoy experimentando un error extraño.Cómo insertar datos binarios en MSSQL usando PDO

La configuración: MSSQL Server 2012 Express con un LocalDB La tabla de destino colación es: SQL_Latin1_General_CP1_CI_AS

PHP 5.3.9 en un servidor Zend 5.6 MCrypt con MCRYPT_RIJNDAEL_256 y MCRYPT_MODE_ECB

Sublime Text 2 por defecto codificación (Lo leí es BOM UTF8)

Estoy utilizando PDO con el adaptador MS oficial para el servidor MSSQL. Todo funciona bien, aparte de una cosa: No puedo escribir una fila en mi tabla de administrador debido a la contraseña.

permite echar un vistazo a mi contraseña cifrada:

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

Ésta es la DOP Traza:

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 

Cuando uso mi Centro de Gestión de MSSQL puedo insertar mi fila con exactamente el mismo SQL consulta. La configuración de la columna está bien supongo:

["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)" 

utilizo declaraciones preparadas y la función bindParam con opciones adicionales para no ejecutar mis instrucciones SQL.

Si alguien tiene una idea, cómo solucionar eso, por favor, hágamelo saber. ¡Cualquier tipo de ayuda se agradece!

+2

No estoy seguro acerca de ms sql, pero debe haber una manera de declarar una columna binaria, es decir, sin codificación o intercalación. –

+0

@Jack, gracias por el comentario. Después de eso probé las columnas binarias y varbinary, pero esas tampoco funcionan. – Richard

+0

Bien, ¿hay alguna manera de vincular quizás el parámetro como binario en PDO? –

Respuesta

2

Debe cambiar su intercalación por algo como utf8_unicode_ci para manejar esos pocos caracteres desatendidos.

También usted debe intentar algo como esto:

$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); 

comprobar el tipo (aquí es donde el error/fallo comienza a suceder) hacer esta comprobación, tal vez incluso en el lugar de la última línea de mi ejemplo arriba:

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