2016-10-26 29 views
0

私はthis質問を参考にしています。私の問題は、文字列を16進数にエンコードしていますが、それがデータベースに書き込まれるとデコードしないことです。SQL Serverエスケープ文字列

HTMLのtextareaの

<textarea class="form-control" rows="5" name="nomInfo[]" id="appNom" placeholder="Additional Information"></textarea> 

POST値を取得し、例えば、テキストエリアにggfdgdfg/fdg.fdgdf.gdf "fdskfdskfds;fsd ' sdfds' fds/f%におけるI型の場合は、フォームを提出し、これが書き込まれているので、DB

function mssql_escape($data) { 
    if(is_numeric($data)) 
     return $data; 
    $unpacked = unpack('H*hex', $data); 
    return '0x' . $unpacked['hex']; 
} 

$nomInfo = $_POST['nomInfo'][0]; 

$nomInfoDecode = mssql_escape($nomInfo); 

$query = "INSERT INTO dbo.emp_recog (nomInfo) VALUES ("; 
$query .= "'" . $nomInfoDecode . "');"; 

に挿入データベース0x67676664676466672f6664672e66646764662e676466205c226664736b6664736b6664733b667364205c272073646664735c27206664732f6625

+0

これはやり過ぎのように思えます。編集:あなたの質問に答えるには、$クエリのものの2行目のアポストロフィを削除します。例えば、 – ZLK

+0

。 '$ query。=" '" $ nomInfoDecode。 "');"; ' - >' $ query。= $ nomInfoDecode。 ");"; "アポストロフィは文字通り、その16進数値が表すものとは対照的に、 '0x67676664676466672f6664672e66646764662e676466205c226664736b6664736b6664733b667364205c272073646664735c27206664732f6625'になります。 – ZLK

+0

それは理にかなって正しいと思われますが、何らかの理由で、あなたが言ったことを正確に行った後も、16進文字列をデータベースに書き込んでいます。 @ ZLK – collint25

答えて

0

この例では、挿入する値を引用していません。

二重引用符を使用して、クエリに翻訳
mssql_query(' 
    INSERT INTO sometable (somecolumn) 
    VALUES (' . mssql_escape($somevalue) . ') 
'); 

は次のようになります。

$query = "INSERT INTO dbo.emp_recog (nomInfo) VALUES ("; 
$query .= $nomInfoDecode . ");"; 

あなたがショットすることを与えることはできますか?

+0

btw、私はこのような二重引用符を利用することを選ぶかもしれません:$ query = "INSERT INTO dbo.emp_recog(nomInfo)VALUES($ nomInfoDecode)"; – WEBjuju

+0

それは理にかなって正しいと思われますが、何らかの理由で、あなたが言ったことを正確に行った後も、16進文字列をデータベースに書きました。 @WEBjuju – collint25

0

すべての16進数をスクラップする必要はありません。エスケープすることについて本当に唯一のことは、引用'です。 MySQLはエスケープ文字としてスラッシュ\を使用します。 MS SQLがquote 'を逃れるために引用'を使用していますので、あなただけのダブルアップ引用符:プリペアドステートメントは、エスケープ文字列の必要性を回避するとき

return str_replace("'", "''", $data);