Je rencontre actuellement une erreur étrange.
La configuration: MSSQL Server 2012 Express avec un localdb Le classment de la table cible est: SQL_Latin1_General_CP1_CI_AS
PHP 5.3.9 sur un server Zend 5.6 MCrypt avec MCRYPT_RIJNDAEL_256 et MCRYPT_MODE_ECB
Sublime Text 2 enencoding par défaut (je l'ai lu est UTF8 BOM)
J'utilise PDO avec l'adaptateur MS officiel pour le server MSSQL. Tout fonctionne bien à part une chose: je ne peux pas écrire une ligne dans ma table d'administrateur à cause du mot de passe.
Jetons un oeil à mon mot de passe ENCRYPTED:
y"ûƒ^äjw¾bðúl5êù-Ö=W¿Š±¬GP¥Œy÷&ø
C'est la trace de PDO:
Array ( [0] => IMSSP [1] => -7 [2] => An error occurred translating ssortingng 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
Lorsque j'utilise mon Centre de gestion MSSQL, je peux insert ma ligne avec exactement la même requête SQL. La configuration de la colonne est correcte, je suppose:
["id"]=> ssortingng(3) "int" ["username"]=> ssortingng(12) "nvarchar(45)" ["email"]=> ssortingng(12) "nvarchar(45)" ["password"]=> ssortingng(12) "varbinary(45)" ["section"]=> ssortingng(11) "nvarchar(7)" ["country_code"]=> ssortingng(11) "nvarchar(2)"
J'utilise des instructions préparées et la fonction bindParam
avec des options non supplémentaires pour exécuter mes instructions SQL.
Si quelqu'un a une idée, comment résoudre cela s'il vous plaît faites le moi savoir. Toute aide est appréciée!
Vous devriez changer votre collation à quelque chose comme utf8_unicode_ci
pour gérer ces quelques caractères sans surveillance.
Aussi, vous devriez essayer quelque chose comme ceci:
$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);
Pour vérifier le type (c'est là que l'erreur / le bug commence à se produire), faites cette vérification, peut-être même à la place de la dernière ligne de mon exemple ci-dessus:
if (is_ssortingng($lob)) echo $lob; else fpassthru($lob);