Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
为什么addslashes()函数不能在php中的数组上工作?_Php_Arrays_Session_Escaping - Fatal编程技术网

为什么addslashes()函数不能在php中的数组上工作?

为什么addslashes()函数不能在php中的数组上工作?,php,arrays,session,escaping,Php,Arrays,Session,Escaping,我在一个数组中有一系列会话变量。当我在一个字符串变量中使用引号时,我尝试添加斜杠,以便最终将其插入数据库,但addslashes()函数不起作用。这里有一个例子 在评论栏中,我写下: 这是“评论” 我意识到这是一个问题,所以在将函数输入数据库之前,我添加了一个函数,该函数通过一系列会话变量(包括comments变量)运行 $strip_fields = array($_SESSION['comments'],$_SESSION['employee_id'],$_SESSION['approved

我在一个数组中有一系列会话变量。当我在一个字符串变量中使用引号时,我尝试添加斜杠,以便最终将其插入数据库,但addslashes()函数不起作用。这里有一个例子

在评论栏中,我写下:

这是“评论”

我意识到这是一个问题,所以在将函数输入数据库之前,我添加了一个函数,该函数通过一系列会话变量(包括comments变量)运行

$strip_fields = array($_SESSION['comments'],$_SESSION['employee_id'],$_SESSION['approved_by'],$_SESSION['delivery_email'],$_SESSION['full_name'],$_SESSION['first_name'],$_SESSION['last_name']);

        foreach($strip_fields as $key => $value) {
            $key = addslashes($key);
        }
运行此函数后,我尝试回显comments变量$\u SESSION['comments']

这是“评论”

因此,我可以看到addslashes函数的工作方式与我使用它的方式不同。为什么addslashes函数不能像我现在使用的那样工作

这是我的解决方案(我使用了两个建议中的一点)

使用$array而不是使用$\u会话


使用$array而不是使用$\u SESSION。

您需要将结果值存储回您正在回显的值中

$strip_fields = array($_SESSION['comments'],$_SESSION['employee_id'],$_SESSION['approved_by'],$_SESSION['delivery_email'],$_SESSION['full_name'],$_SESSION['first_name'],$_SESSION['last_name']);

    foreach($strip_fields as $key => $value) {
        $strip_fields[$key] = addslashes($value); // Store it back into the strip_fields var
    }

正如@Gaurav所指出的,您需要清理数组数据,而不是索引/键。

您需要将结果值存储回您正在回送的值中

$strip_fields = array($_SESSION['comments'],$_SESSION['employee_id'],$_SESSION['approved_by'],$_SESSION['delivery_email'],$_SESSION['full_name'],$_SESSION['first_name'],$_SESSION['last_name']);

    foreach($strip_fields as $key => $value) {
        $strip_fields[$key] = addslashes($value); // Store it back into the strip_fields var
    }

正如@Gaurav所指出的,您希望清理数组数据,而不是索引/键。

这里有一些错误:

  • 您正在将
    $\u会话
    中的值复制到新变量
  • 您正在将键传递给
    addslashes()
    ,但将值放入数组值中
  • foreach()
  • 你应该可以使用参考资料,但我认为跳过它们会更清楚

    $strip_fields = array(
            'comments', 'employee_id', 'approved_by', 'delivery_email', 
            'full_name', 'first_name', 'last_name']
        );
    
    foreach($strip_fields as $key) {
        $_SESSION[$key] = addslashes($_SESSION[$key]);
    }
    

    这里有几件事不对:

  • 您正在将
    $\u会话
    中的值复制到新变量
  • 您正在将键传递给
    addslashes()
    ,但将值放入数组值中
  • foreach()
  • 你应该可以使用参考资料,但我认为跳过它们会更清楚

    $strip_fields = array(
            'comments', 'employee_id', 'approved_by', 'delivery_email', 
            'full_name', 'first_name', 'last_name']
        );
    
    foreach($strip_fields as $key) {
        $_SESSION[$key] = addslashes($_SESSION[$key]);
    }
    

    您的问题意味着您实际上想要修改
    $\u会话
    变量的内容,但这似乎不是一个好主意,因为每次调用脚本时,您都会一次又一次地添加斜杠(只是一个没有看到所有代码的观察)

    另外,您不应该使用
    addslashes
    来转义数据库,因为每个数据库(或数据库抽象层)都有自己的转义数据的方式(例如
    mysql\u real\u escape\u string
    或PDO准备的语句)

    另外,
    $\u会话
    和数据库是不同的数据持久化方法,很可能混合使用它们是一种糟糕的设计选择

    评论后编辑

    如果要将所有这些变量放入数据库,并且在此之前,它们位于
    $\u会话中(如前所述,这可能不是最好的主意),并且您正在使用,则可以执行以下操作:

    $db_names=array(
        "comments",
        "employee_id",
        "approved_by",
        "full_name",
        "first_name",
        "last_name"
    );
    $clean=array();
    foreach($db_names as $name)
        $clean[$name]=mysql_real_escape_string($_SESSION[$db_name]);
    mysql_query("
            INSERT INTO comments_table 
            (
                comments,
                employee_id,
                approved_by,
                full_name,
                first_name,
                last_name
            )
            VALUES
            (
                '{$clean["comments"]}',
                '{$clean["employee_id"]}',
                '{$clean["approved_by"]}',
                '{$clean["full_name"]}',
                '{$clean["first_name"]}',
                '{$clean["last_name"]}'
            )
    ");
    

    但是,最好不要使用mysql模块,而是使用or。每种方法都有不同的转义字符串的方法(出于许多原因,效果更好)。

    您的问题意味着您实际上想要修改
    $\u会话变量的内容,但这似乎不是一个好主意,因为每次调用脚本时,您都会一次又一次地添加斜杠(只是一个没有看到所有代码的观察)

    另外,您不应该使用
    addslashes
    来转义数据库,因为每个数据库(或数据库抽象层)都有自己的转义数据的方式(例如
    mysql\u real\u escape\u string
    或PDO准备的语句)

    另外,
    $\u会话
    和数据库是不同的数据持久化方法,很可能混合使用它们是一种糟糕的设计选择

    评论后编辑

    如果要将所有这些变量放入数据库,并且在此之前,它们位于
    $\u会话中(如前所述,这可能不是最好的主意),并且您正在使用,则可以执行以下操作:

    $db_names=array(
        "comments",
        "employee_id",
        "approved_by",
        "full_name",
        "first_name",
        "last_name"
    );
    $clean=array();
    foreach($db_names as $name)
        $clean[$name]=mysql_real_escape_string($_SESSION[$db_name]);
    mysql_query("
            INSERT INTO comments_table 
            (
                comments,
                employee_id,
                approved_by,
                full_name,
                first_name,
                last_name
            )
            VALUES
            (
                '{$clean["comments"]}',
                '{$clean["employee_id"]}',
                '{$clean["approved_by"]}',
                '{$clean["full_name"]}',
                '{$clean["first_name"]}',
                '{$clean["last_name"]}'
            )
    ");
    

    但是,最好不要使用mysql模块,而是使用or。每个模块都有不同的转义字符串的方法(并且由于许多原因更好)。

    不要使用
    addslashes()
    来转义SQL查询的值!
    (很抱歉大声喊叫)

    在MySQL的例子中,您的选择是
    MySQL\u real\u escape\u string()
    ,但其他引擎都有自己的转义函数。
    addslashes()
    如果您试图进行SQL注入攻击,那么很容易被“愚弄”

    最好的办法不是转义
    $\u SESSION
    本身,而是创建一个副本,并使用
    array\u map()
    mysql\u real\u escape\u string()
    。这样也可以保留原始的未转义版本

    $escaped_SESSION=array_map('mysql_real_escape_string', $_SESSION);
    

    其他人已经解释了为什么
    foreach
    不是操作数组的最佳选择。它与正在运行它的数组的副本一起工作。它将对数组的所有元素应用回调,并返回结果数组。

    不要使用
    addslashes()
    来转义SQL查询的值!
    (对不起,大声喊叫)

    在MySQL的例子中,您的选择是
    MySQL\u real\u escape\u string()
    ,但其他引擎都有自己的转义函数。
    addslashes()
    如果您试图进行SQL注入攻击,那么很容易被“愚弄”

    最好的办法不是转义
    $\u SESSION
    本身,而是创建一个副本,并使用
    array\u map()
    mysql\u real\u escape\u string()
    。这样也可以保留原始的未转义版本

    $escaped_SESSION=array_map('mysql_real_escape_string', $_SESSION);
    
    O