Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
在SQL和PHP中处理用户输入字符串的正确方法?_Php_Sql_Mysql - Fatal编程技术网

在SQL和PHP中处理用户输入字符串的正确方法?

在SQL和PHP中处理用户输入字符串的正确方法?,php,sql,mysql,Php,Sql,Mysql,我设计了一个评论系统。这就是我基本上正在做的 $story=$_POST['story']; $story=mysql_real_escape_string($story); $query = "INSERT INTO `comment` VALUES('$story')"; 现在的问题是,当我存储注释时,所有的替换为\和所有的“替换为\”。因此,当我显示注释时,这些\也会显示在注释中 另一个问题是&消失了。例如:如果用户评论I&you only I存储到数据库中 事实上,在少数情况下,注释甚

我设计了一个评论系统。这就是我基本上正在做的

$story=$_POST['story'];
$story=mysql_real_escape_string($story);
$query = "INSERT INTO `comment` VALUES('$story')";
现在的问题是,当我存储注释时,所有的替换为\和所有的“替换为\”。因此,当我显示注释时,这些\也会显示在注释中

另一个问题是&消失了。例如:如果用户评论I&you only I存储到数据库中

事实上,在少数情况下,注释甚至不进入数据库

正确的处理和存储用户评论的方法是什么,这样您就可以将其显示回最初编写的状态

PS:我不担心sql注入。我只想让评论显示它们的输入方式。

看起来您已经打开了。您只需从php.ini开始


如果您担心SQL注入,请考虑使用.< /P> < P>魔术引文可能会在您的PHP安装中打开。 有关详细信息,请参见

这些\s未存储在您的数据库中。如果显示转义的$story变量,您将看到反斜杠,但稍后使用select查询检索数据时,它将只是原始数据

确保您已禁用,否则已转义的字符串将自动再次转义,例如\\,这意味着将插入反斜杠。

是否确定将从数据库中消失(&e)?我猜它不会出现在页面上,因为&表示HTML实体的开始


用于首先删除引号前的反斜杠,然后用于转义HTML实体。

将它们放入数据库的最简单方法是使用准备好的语句,让其他人担心转义

然后,当您再次取出它们时,您仍然需要确保转义符号等以适合html,即使用htmlspecialchars或htmlentities。当你得到它们时,它们是UTF-8或ASCII之类的。当您输出它们时,它们位于HTML中。这意味着显示输入的方式并不意味着直接返回您得到的信息。

使用以下方法:

function safe_mysql( $value ) {
    $magic_quotes_active = get_magic_quotes_gpc();
    $new_enough_php = function_exists( "mysql_real_escape_string" );
    if( $new_enough_php ) {

        if( $magic_quotes_active ) { $value = stripslashes( $value ); }
        $value = mysql_real_escape_string( $value );
    } else {

        if( !$magic_quotes_active ) { $value = addslashes( $value ); }

    }
    return $value;
}

就我个人而言,在插入MySQL之前,我使用以下方法对数据进行santize

$output=filter\u var$input、filter\u SANITIZE\u STRING、filter\u SANITIZE\u SPECIAL\u CHARS


不幸的是,这是针对PHP 5>=5.2.0的,因此可能无法在许多共享服务器上工作。

如果您希望注释以输入方式显示,您会担心SQL注入。事实上,安全性是正确性的一个子集。&甚至不会进入数据库。为什么会这样?问得好不是SQL的特殊字符,因此如果它不能进入数据库,您确定是这样的吗,您是否与mysql客户端进行了检查?必须有一些错误的组件处理输入,而不仅仅是神奇的引用。您是否使用了某种可能会阻止它的框架或服务器模块?您是否尝试过使用当前的PHP方法插入数据的不同方法,使用phpmyadmin、使用准备好的语句、使用像TOAD这样的应用程序。像这样的东西可以帮你找出错误所在。谢谢。这似乎解决了`问题,但&`仍然没有进入数据库。如果它没有正确显示,我会理解的,但是它完全消失了&之后的一切都会消失。我已经用“&”进行了测试,没有任何问题。