【问题标题】:SQL Server Escape StringSQL Server 转义字符串
【发布时间】:2016-10-26 22:51:19
【问题描述】:

我使用this 问题作为参考。我的问题是它将我的字符串编码为十六进制,但一旦写入数据库就没有解码。

HTML 文本区域

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

获取 POST 值并插入数据库

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 . "');";

例如,如果我在 textarea 中输入 ggfdgdfg/fdg.fdgdf.gdf "fdskfdskfds;fsd ' sdfds' fds/f% 并提交表单,则会将其写入数据库 0x67676664676466672f6664672e66646764662e676466205c226664736b6664736b6664733b667364205c272073646664735c27206664732f6625

【问题讨论】:

  • 当准备好的语句避免需要转义字符串时,这似乎有点过头了。编辑:但要回答您的问题,请删除 $query 事物第二行的撇号。
  • 例如$query .= "'" . $nomInfoDecode . "');"; - > $query .= $nomInfoDecode . ");";因为撇号让你从字面上把在“0x67676664676466672f6664672e66646764662e676466205c226664736b6664736b6664733b667364205c272073646664735c27206664732f6625”,而不是该十六进制值代表什么 SPAN>
  • 这是有道理的,看起来是正确的,但由于某种原因,在完全按照你说的做之后,它仍然将十六进制字符串写入数据库。 @ZLK
  • 您的查询实际上是如何执行的?
  • 你是放弃还是什么???

标签: php html sql-server


【解决方案1】:

废弃所有十六​​进制的东西,没有必要。真正唯一担心转义的是引用'。 MySQL 使用斜线 \ 作为转义字符。 MS SQL 使用引号 ' 转义引号 ',因此您只需将引号加倍:

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

但是,您确实应该使用支持 MS SQL 的PHP Data Objects,然后是PDO::quote

【讨论】:

【解决方案2】:

我很确定该示例没有引用要插入的值:

mssql_query('
  INSERT INTO sometable (somecolumn)
  VALUES (' . mssql_escape($somevalue) . ')
');

使用双引号翻译成您的查询将是:

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

你可以试一试吗?

【讨论】:

  • 顺便说一句,我可能会选择像这样利用双引号:$query = "INSERT INTO dbo.emp_recog (nomInfo) VALUES ($nomInfoDecode)";
  • 这是有道理的,看起来是正确的,但由于某种原因,在完全按照你说的做之后,它仍然将十六进制字符串写入数据库。 @WEBjuju
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 2011-07-05
  • 2023-03-03
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
相关资源
最近更新 更多