我有一个使用mysql_real_escape_string()
的php页面来转义包含单引号的内容。我相信它使用的是utf-8(但我不确定)。当我插入一些内容时,我收到以下mysql警告(并在内容中添加了?而不是'
字符串值不正确:'\ x92t ...
这是我的一个例子:
$link = ConnectToServer($theIntranet, $theUser, $thePW);
$theTagToFind = 'ac';
$theTagToUse = 'trc';
$database = '{databaseName}';
$theQuery = "SELECT * FROM {$database}.templates
WHERE content like '%{" . $theTagToFind . ":%'";
$updates = fopen('001_intranet_change' . strtoupper($theTagToFind) . 'to' . strtoupper($theTagToUse) . '.sql', 'w+');
$rollback = fopen('001_intranet_change' . strtoupper($theTagToUse) . 'backto' . strtoupper($theTagToFind) . '.sql', 'w+');
$theResultHandle = mysql_query($theQuery, $link);
$comment = "--Update All $theTagToFind tags to $theTagToUse tags in $database --";
fwrite($updates, $comment . "\r\n\r\n");
fwrite($rollback, "--Rollback - Convert all $theTagToUse tags back to $theTagToFind tags --\r\n\r\n");
mysql_set_charset('latin1');
while (($data = mysql_fetch_assoc($theResultHandle)) != false)
{
$rb_content = $data['content'];
$data['content'] = preg_replace("/{" . $theTagToFind . ":/", "{" . $theTagToUse . ":", $data['content']);
$theResult[] = $data;
$update_script = "\r\n
Update $database.templates
SET content = '" . mysql_real_escape_string($data['content']) . "'
WHERE _id = " .$data['_id'] . ";";
$rollback_script = "\r\n
UPDATE $database.templates
SET content = '" . mysql_real_escape_string($rb_content) . "'
WHERE _id = " . $data['_id'] . ";";;
fwrite($updates, $update_script);
fwrite($rollback, $rollback_script);
}
fclose ($updates);
fclose($rollback);
print_r($theResult);
和$data['content']
可能等同于:
“你好, 请记得联系医生办公室......“
答案 0 :(得分:2)
你去吧
mysql_set_charset('utf8');
您必须确保表定义中的字符集也设置为utf8
答案 1 :(得分:1)
您确定您的服务器配置正确并且magic quotes已关闭吗?这些可以具有双重转义值的效果。
您可以通过查看$_POST
数据进行测试,看看它是否已根据您的预期进行了修改。如果是,请查看您是否可以在php.ini
中修复该设置。
请注意,您不应在新代码中使用mysql_query
。这是危险的,已弃用,将在未来的PHP版本中删除。使用SQL placeholders是最安全,最简单的转义方式。
在这里的简短示例中,您似乎忘记了$data['_id']
,这意味着它可能是SQL注入错误。即使一个错误也会产生严重的后果,所以永远不要将未转义的数据放入查询字符串中。