Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 转义以插入MySql_Php_Mysql_Escaping - Fatal编程技术网

Php 转义以插入MySql

Php 转义以插入MySql,php,mysql,escaping,Php,Mysql,Escaping,我有一个php页面,它使用mysql\u real\u escape\u string()来转义包含单引号的内容。我相信它使用的是utf-8(但我不确定)。当我插入一些内容时,我得到了以下mysql警告(它在内容中添加了一个?而不是'in'): 不正确的字符串值:'\x92t 以下是我的php示例: $link = ConnectToServer($theIntranet, $theUser, $thePW); $theTagToFind = 'ac'; $theTagToUse = '

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

不正确的字符串值:'\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']
可以等于:

“你好,
请记住联系医生办公室,电话是……“

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

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

请注意,您不应该在新代码中使用
mysql\u query
。它很危险,已弃用,将在PHP的未来版本中删除。使用是最安全、最简单的逃跑方式

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

给你

mysql_set_charset('utf8');

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

谢谢tadman,(我没有投反对票)。这是一个intranet应用程序,该组织的标准是使用mysql_query()(我想他们不会很快更新PHP)。我很确定这个错误与mysql和uft8有关,而不是双转义(因为单引号的utf8表示形式是\x92),魔引号不会导致错误的字符串错误;mysql_查询并不危险;转义的_id对任何人都没有帮助。好吧,不管您是否希望将未转义的值放入您的查询中。该值在转义之前是什么样子的?你需要
echo
it来找出答案。@tadman,我同意应该对值进行转义。因为我只是编写一个实用脚本来更新数据并将其从一个db移动到另一个db,所以它并不重要(根本没有用户输入)。这在我的帖子里没有解释,所以你不可能知道。然而,发生了一些不同的事情,阻止了转义“这是一个intranet应用程序,组织的标准是使用mysql_query()”,这听起来像是一个功能失调的组织。过去,我(被动地、积极地)在名为
VulnerableMySql_Query()
的包装函数中封装了对不安全方法的调用,并使用不推荐的方法使用类似“//As per[requester's email address]”的代码注释。像这样的选择看起来像是小问题,但当你负责维护和修复它时,有助于了解外部需求在哪里破坏了你的工作。我尝试使用mysql\u set\u charset('latin1'),因为表就是这样设置的。不幸的是,我正在做的是写入一个文本文件以便稍后导入(我必须创建一种方法来更新表的生产版本)。我会发布我剩下的代码,你可以看一下。