我正在构建我的查询:
$q = sprintf("UPDATE testTable SET Text='%s', [Read]=0, TimeUpdated='%s', [From]='%s' WHERE ID='%s'", ms_escape_string($text), $dateReceived, $from, $convID);
我执行它:
$res = mssql_query($q, $dbhandle);
$text
应该是自由文本,因此它可以包含各种奇怪的字符(现在让我们坚持使用 ASCII)。最简单的情况是当 $text 包含引号时,例如$text = "Mc'Donalds"
在ms_escape_string函数中,我尝试通过将 ' 替换为 2 个引号 '' 来防止这种情况。我回显查询字符串:
UPDATE testTable SET Text='Mc''Donalds', [Read]=0, TimeUpdated='2012-08-03 12:44:49', [From]='bogus' WHERE ID='14'
(注意:在同一个数据库上从 VS 服务器资源管理器执行这个查询就可以了)
一切似乎都很好 - 请参阅 Mc''Donalds 的双引号 - 但执行时仍然失败: [mssql_query(): message: Incorrect syntax near 'Mc'
我认为 SET QUOTED_IDENTIFIER 可能是罪魁祸首,所以我尝试了
$q = "SET QUOTED_IDENTIFIER OFF";
$resq = mssql_query($q,$dbhandle);
在执行我的查询但没有雪茄之前 - 我仍然得到同样的错误。
现在我被卡住了 - 我应该改变什么来让包含单引号的字符串通过?