【问题标题】:Sanitizing An Array清理数组
【发布时间】:2011-07-17 21:13:27
【问题描述】:

我有一个动态生成的表单。最终用户将能够向数据库提交员工详细信息。所以数组 $fname 将包含所有名字, $lname 所有姓氏等。然后将数组插入 MySQL,如下所示:

   $query = "INSERT INTO workers (date_added, department,fname, lname, rank)
   VALUES ";
    $fname = count(fname);
    for($i=0; $i<$employee_count; $i++) {
    $query .= "(NOW(),'$department','{$fname[$i]}','{$lname[$i]}','{$rank[$i]}'),\n";
  }

这工作非常好,直到我们有像单引号这样的危险字符,例如 MC'Mahon,这会使查询失败。我不能使用许多普通函数,例如 mysqli_real_escape_string(),因为这是一个数组。 有没有办法清理数组,即转义数组中的任何危险字符,以便我在将每个数组推入它们之前对其进行清理,以便循环将每个数组拆分为字符串,然后输入 MySQL?

【问题讨论】:

  • 您应该考虑使用PDO library
  • 您没有将数组插入数据库,而是从数组中插入字符串。您可以而且应该对它们进行消毒。
  • 我的意思是“你是”,当然……两次。

标签: php mysql


【解决方案1】:

您可以在 for 循环之前使用 array_map。该函数将回调应用于数组的每个值。在这种情况下,回调将是mysqli_real_escape_string

$fname = array_map('mysqli_real_escape_string', $fname);
$lname = array_map('mysqli_real_escape_string', $lname);
$rank = array_map('mysqli_real_escape_string', $rank);

根据以下 cmets 更新:

要在程序模式下使用mysqli_real_escape_string,您需要传递“链接”,因此您需要创建一个自定义函数:

function array_map_callback($a)
{
  global $dbc;

  return mysqli_real_escape_string($dbc, $a);
}

$fname = array_map('array_map_callback', $fname);
$lname = array_map('array_map_callback', $lname);
$rank = array_map('array_map_callback', $rank);

【讨论】:

  • 感谢@Francois,问题是 mysqli_real_escape_string() 需要将数据库连接作为参数之一传递,因此上面会产生错误。我不是很确定array_map 需要哪些参数,所以我还在研究如何传递db 连接。
  • @Bululu - 确保使用mysqli_connect$mysqli = new mysqli(); 在这些行上方建立与MySQL 的连接。如果您使用的是mysql_connect,则需要使用mysql_real_escape_string。在任何一种情况下,您都不需要指定“链接”,就好像没有指定一样,它将使用最近的连接,因此您应该首先连接。
  • @Franchois 我的数据库连接如下所示。 $dbc = mysqli_connect(localhost,root, user_password,some_db);我认为 $dbc 需要传递给 mysqli_real_escape_string() 函数,因为它是一个 MySQL 函数,
  • @Bululu - 查看我更新的答案。显然,mysqli_real_escape_string 函数需要“链接”,这与 mysql_real_escape_string 不同。
  • @Franchois,非常感谢,就像魅力一样!所以我投票并接受它作为正确答案。
猜你喜欢
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
相关资源
最近更新 更多