2011-05-01 102 views
1

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

在评论栏,我写这篇文章:

这是“意见”

我意识到这是一个问题,所以我增加了一个功能之前,我将其输入数据库通过一系列Session变量(包括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); 
     } 

我运行此功能后,我尝试回声出意见变量$ _SESSION [“意见”]

这是“意见”

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

THIS IS MY SOLUTION(I用于从两个建议比特)

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

回答

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

感谢您的帮助。我发布了我上面做的。 – zeckdude 2011-05-02 06:38:06

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

使用$阵列而不是使用$ _SESSION的。

+0

仍然在$ _SESSION原始值的副本上运行。 – 2011-05-01 03:58:31

+0

使用'foreach($ array as $ key => $ value)'而不是使用'array_keys()'创建包含键的新数组。或者使用'foreach($ array as&$ value)的引用'$ value = addslashes($ value);'。 – 2011-05-01 08:49:32

-1

你需要存储的结果值回值,你是呼应

$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指出要清理的阵列中的数据,而不是索引/键。

+0

由于'$ strip_fields'不包含匹配关键字,它将覆盖'$ _SESSION'中的第0,第1,第2等值。 – 2011-05-01 03:59:59

+0

我在回复时正在编辑我的回复。我已经实现了他的数组结构后更新了我的代码。我意识到这并不会更新'SESSION' var,但我正在使用他写的,认为他可能会在别处使用它。大卫的解决方案正确地修改了'SESSION' var – Brombomb 2011-05-01 04:01:08

+0

这是行不通的。你不能从'foreach'修改'$ strip_fields'。 – kapa 2011-05-01 09:34:28

5

你的问题意味着你真的想修改$_SESSION变量的内容,但是这似乎并不像一个好主意,因为你最终只会一次又一次地添加斜线每当调用脚本(只是观察没有看到你所有的代码)。因为每个数据库(或数据库抽象层)都有它自己的转义数据的方式(例如mysql_real_escape_string或PDO准备语句),所以您不应该使用addslashes来为数据库转义。

另外,$_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

+1是唯一一个提及**'addslashes'永远不是用于为SQL插入准备数据的正确方法**。 – Charles 2011-05-01 04:41:10

+0

同意。有时候回答问题并不是正确的答案。 :) – 2011-05-01 08:46:17

+0

我重视您的输入,但这并不能真正解决我的问题。那么我该如何解决这个问题。如果没有addslashes,当它试图将它添加到数据库中时,由于它包含引号,我仍然会遇到MySQL错误。你是否建议我只使用mysql_real_escape_string而不是addslashes?这将在我创建的数组中工作吗? – zeckdude 2011-05-01 19:55:26

1

请勿使用addslashes()针对SQL查询的ESCAPE值!(抱歉大喊)

在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()将对您数组的所有元素应用回调,并返回结果数组。