2012-06-29 6 views
12

का उपयोग कर एमएसएसक्यूएल में बाइनरी डेटा कैसे डालें I वर्तमान में एक अजीब त्रुटि का सामना कर रहा हूं।पीडीओ

स्थापना: MSSQL सर्वर 2012 एक्सप्रेस एक localdb लक्ष्य तालिका मिलान के साथ है: SQL_Latin1_General_CP1_CI_AS

पीएचपी 5.3.9 एक Zend सर्वर MCRYPT_RIJNDAEL_256 साथ 5.6 mcrypt और MCRYPT_MODE_ECB

उदात्त पाठ 2 डिफ़ॉल्ट पर एन्कोडिंग (मैंने इसे यूटीएफ 8 बीओएम पढ़ा है)

मैं एमएसएसएलएल सर्वर के लिए आधिकारिक एमएस एडाप्टर के साथ पीडीओ का उपयोग कर रहा हूं। सब कुछ ठीक से काम करता है: मैं पासवर्ड की वजह से अपनी व्यवस्थापक तालिका में एक पंक्ति नहीं लिख सकता।

चलें मेरी एनक्रिप्टेड पासवर्ड पर एक नजर है:

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 प्रबंधन केंद्र का उपयोग मैं ठीक उसी एसक्यूएल के साथ मेरी पंक्ति सम्मिलित कर सकते हैं:

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

यह पीडीओ ट्रेस है क्वेरी। स्तंभ सेटअप ठीक है मुझे लगता है:

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

एमएस एसक्यूएल के बारे में सुनिश्चित नहीं हैं, लेकिन एक द्विआधारी स्तंभ घोषित करने के लिए एक तरह से होना चाहिए, कोई एन्कोडिंग या मिलान अर्थात्। –

+0

@ जैक, टिप्पणी के लिए धन्यवाद। इसके बाद मैंने बाइनरी और varbinary कॉलम की कोशिश की, लेकिन वे या तो काम नहीं करते हैं। – Richard

+0

ठीक है, क्या पीडीओ में बाइनरी के रूप में पैरामीटर को बाध्य करने का कोई तरीका है? –

उत्तर

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