我在一个数组中有一系列会话变量。当我在一个字符串变量中使用引号时,我会尝试添加斜杠,以便最终将其插入数据库,但addslashes((函数不起作用。下面是一个例子。
在评论栏中,我写下:
这是"注释">
我意识到这是一个问题,所以在将函数输入数据库之前,我添加了一个函数,该函数通过一系列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['comments']
这是"评论">
所以我可以看到addslashes函数在某种程度上不符合我使用它的方式。为什么addslashe函数不符合我的使用方式?
这是我的解决方案(我使用了两个建议中的一点(
$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]);
}
您的问题暗示您实际上想要修改$_SESSION
变量的内容,但这似乎不是一个好主意,因为无论何时调用脚本,您都会一次又一次地添加斜杠(只是一个观察,没有看到所有代码(。
此外,您不应该使用addslashes
来转义数据库,因为每个数据库(或数据库抽象层(都有自己的转义数据的方式(例如mysql_real_escape_string
或PDO准备的语句(。
此外,$_SESSION
和数据库是不同的数据持久化方式,很可能将它们混合在一起是一个糟糕的设计选择。
在评论后编辑。。。
如果您想将所有这些变量放入数据库,并且在此之前它们位于$_SESSION
中(如前所述,这可能不是最好的主意(,并且您正在使用mysql.php模块,那么您可以执行以下操作:
$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模块,而是使用mysqli或PDO。每种方法都有不同的(出于多种原因,效果更好(转义字符串的方法。
这里有一些错误:
- 您正在将
$_SESSION
中的值复制到新变量中 - 您将密钥传递给
addslashes()
,但将值放入了数组值中 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]);
}
不要使用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()
将对数组的所有元素应用回调,并返回生成的数组。
$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。
您需要将结果值存储回您正在回显的值中
$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所指出的,您希望清理数组数据,而不是索引/键。