转义为插入MySql

时间:2013-04-02 18:36:29

标签: php mysql escaping

我有一个使用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']可能等同于:

“你好, 请记得联系医生办公室......“

2 个答案:

答案 0 :(得分:2)

你去吧

mysql_set_charset('utf8');

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

答案 1 :(得分:1)

您确定您的服务器配置正确并且magic quotes已关闭吗?这些可以具有双重转义值的效果。

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

请注意,您不应在新代码中使用mysql_query。这是危险的,已弃用,将在未来的PHP版本中删除。使用SQL placeholders是最安全,最简单的转义方式。

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