1

我有一个 php 页面,用于mysql_real_escape_string()转义包含单引号的内容。我相信它使用的是 utf-8(但我不确定)。当我插入一些内容时,我收到以下 mysql 警告(它在内容中添加了 ? 而不是 '):

不正确的字符串值:'\x92t ...

这是我的 php 示例:

    $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']可以等于:

“您好,请记得联系医生办公室……”

4

2 回答 2

2

干得好

mysql_set_charset('utf8');

您必须确保表定义中的字符集也设置为 utf8

于 2013-04-02T18:46:29.057 回答
1

您确定您的服务器配置正确并且魔术引号已关闭吗?这些可能具有双重转义值的效果。

您可以通过查看$_POST数据来测试它是否已根据您的预期进行了修改。如果是这样,请查看是否可以修复php.ini.

请注意,您不应该mysql_query在新代码中使用。它很危险,已被弃用,并将在 PHP 的未来版本中删除。使用SQL 占位符是进行转义的最安全和最简单的方法。

在您的简短示例中,您似乎忘记了转义$data['_id'],这意味着它可能是 SQL 注入错误。即使是一个错误也会产生严重的后果,因此永远不要将未转义的数据放入查询字符串中。

于 2013-04-02T18:38:40.413 回答