【问题标题】:Why does the addslashes() function not work on my array in php?为什么addslashes() 函数在我的php 数组上不起作用?
【发布时间】:2011-05-01 03:51:17
【问题描述】:

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

在 cmets 字段中,我这样写:

这是“评论”

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

$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);
        }

运行此函数后,我尝试回显 cmets 变量 $_SESSION['cmets']

这是“评论”

所以我可以看到,addslashes 函数在某种程度上不能像我使用它那样工作。为什么 addlashes 函数不能像我使用的那样工作?

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

$strip_fields = array(
            'employee_id', 'approved_by', 'delivery_email', 'full_name', 
            'first_name', 'last_name', 'title', 'title_2', 'dept_div', 
            'dept_div_2', 'email', 'comments', 'special_instructions'
        );

        foreach($strip_fields as $key) {
            $_SESSION[$key] = $conn->real_escape_string($_SESSION[$key]);
        }

【问题讨论】:

    标签: php arrays session escaping


    【解决方案1】:

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

    此外,您不应使用 addslashes 转义数据库,因为每个数据库(或数据库抽象层)都有自己的转义数据方式(例如 mysql_real_escape_string 或 PDO 准备语句)。

    另外,$_SESSION 和数据库是保存数据的不同方式,很可能将它们混合是一个糟糕的设计选择。

    评论后编辑...

    如果您想将所有这些变量放入数据库中,并且在此之前它们位于$_SESSION(如前所述可能不是最好的主意),并且您正在使用mysql php module,那么您可以做类似的事情:

    $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模块,而是使用mysqliPDO。每个都有不同的(并且由于多种原因更好)转义字符串的方法。

    【讨论】:

    • +1 因为是唯一一个提到 addslashes 从来都不是为 SQL 插入准备数据的正确方法
    • 同意。有时回答所提出的问题并不是正确的答案。 :)
    • 我很重视您的意见,但这并不能真正解决我的问题。那么我该如何解决这个问题。如果没有添加斜杠,我在尝试将其添加到数据库时仍然会出现 MySQL 错误,因为它包含引号。您是否建议我只使用 mysql_real_escape_string 而不是添加斜杠?这会在我创建的数组中工作吗?
    【解决方案2】:

    这里有一些问题:

    1. 您正在将$_SESSION 中的值复制到新变量中。
    2. 您将键传递给addslashes(),但您将值放入数组值中。
    3. foreach() 将数组中的值复制到 $key$value,因此您正在对副本进行操作。

    您应该可以为此使用引用,但我认为跳过它们会更清楚。

    $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]);
    }
    

    【讨论】:

    • 感谢您的帮助。我发布了我在上面所做的。
    【解决方案3】:

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

    对于 MySQL,您的选择是mysql_real_escape_string(),但其他引擎有自己的转义函数。如果您尝试进行 SQL 注入攻击,addslashes() 非常容易被“愚弄”。

    您能做的最好的事情不是逃避$_SESSION 本身,而是创建一个副本,并使用array_map()mysql_real_escape_string()。这样您也可以保留原始的未转义版本。

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

    其他人已经解释了为什么foreach 不是操作数组的最佳选择。它适用于您正在运行它的阵列的副本。 array_map() 将对数组的所有元素应用回调,并返回结果数组。

    【讨论】:

      【解决方案4】:
      $array = array('comment' => $_SESSION['comment'], 'employee_id' => $_SESSION['employee_id']);  // other keys of session
      
      foreach(array_keys($array) as $value){
          $array[$value] = addslashes($array[$value]);
      }
      

      使用 $array 而不是使用 $_SESSION。

      【讨论】:

      • 这仍然对来自$_SESSION的原始值的副本进行操作。
      • 使用foreach ($array as $key => $value) 而不是创建一个包含array_keys() 键的新数组。或使用foreach ($array as &$value) $value = addslashes($value); 的引用。
      【解决方案5】:

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

      $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 所说,您要清理数组数据,而不是索引/键。

      【讨论】:

      • 这将覆盖来自$_SESSION 的第0、第1、第2 等值,因为$strip_fields 不包含匹配的键。
      • 在您回复时,我正在编辑我的回复。在实现他的数组结构后,我更新了我的代码。我意识到这不会更新SESSION var,但我正在使用他写的内容,认为他可能会在其他地方使用它。大卫的解决方案正确修改了SESSION var
      • 这行不通。您不能从foreach 修改$strip_fields
      • @bazmegakapa 当然可以。虽然 $value 明确是副本(而不是参考),但您无法更新该值并使其在原件中受到影响。但是,通过在给定索引处显式更新实际数组,它将强制更新。如果你想做它作为参考,你可以包含 &,但我不想让它更具技术性。 foreach($strip_fields as $key => &$value){$value = addslashes($value); }
      • 是的,你是对的。不过,您在答案中写的内容是错误的,因为它不起作用。因此,它不是这个问题的答案。请尽可能多地编辑并“使其技术化”以提供有效的答案:)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2021-12-18
      相关资源
      最近更新 更多