PHP内爆函数说明

时间:2013-10-10 13:09:18

标签: php

我对PHP比较陌生。我的教科书涵盖了PHP5.2,并没有提到任何内爆。从PHP手册获取的信息对我来说有点不清楚。我正在寻找关于内爆的简短明确的解释和例子

  • 它的目的究竟是什么?
  • 你为什么要用它?
  • 安全吗?

我知道implode会返回其数组元素的字符串,但以下两个例子有何不同,为什么你会使用另一个呢?

示例1

$query = 'SELECT `name`, `position` 
        FROM `player_info` 
        WHERE `player_id` IN (' . implode(',', $player_ids) . ')';

示例2

 $result2 = mysql_query("SELECT `fixture_id`, `opponents` 
                         FROM `fixtures` ") or die (mysql_error());

谢谢

5 个答案:

答案 0 :(得分:2)

我将忽略你在代码中使用mysql_query()的事实 - 因为这是PHP reportoire中一个更易受攻击的库。如果您感觉更舒服,或者您可以立即使用,请使用PDO。

要了解implode(),您需要了解arrays()。我假设你知道什么是数组。

在SQL中,当你使用IN()时 - 它相当于多个“OR”。

e.g。

SELECT * FROM table t WHERE t.id IN ( 1,2,3 )

基本上与:

相同
SELECT * FROM table t WHERE t.id = '1' OR t.id = '2' OR t.id = '3' OR t.id = '3'

当你在PHP中有一个数组时 - 它将如下所示:

$array = array ( 1 , 2 , 3 );

如果要将其转储到SQL语句中,它将失败,因为查询如下:

SELECT * FROM table t WHERE t.id IN ( $array )

会输出:

SELECT * FROM table t WHERE t.id IN ( Array )

你想要的是数组中的值。这就是implode()的用武之地.Implode会创建分隔符 - 这相当于数组中每个值(在您的示例中为逗号)之间的一致值,并将输出SQL中所需的必要字符串。

$array = array ( 1 , 2 , 3 );
$query = "SELECT * FROM table t WHERE t.id IN ( ".implode("," , $array)." ) ";

与:

相同
$query = "SELECT * FROM table t WHERE t.id IN ( 1,2,3 ) ";

希望有所帮助

答案 1 :(得分:1)

Implode对列表特别有用。假设你有一系列成分,你可以echo implode("\n",$ingredients)以自己的方式展示它们。

在你的第一个例子中,你需要非常小心。只有当$player_ids是一个数字数组时,它才能正常工作。 implode()本身是完全安全的,但是不正确的使用可能会在您的安全性中留下空洞。该代码的更“正确”版本可能如下所示:

$query = "SELECT `name`, `position` FROM `player_info`
  WHERE `player_id` IN ('".implode("','",array_map("mysql_real_escape_string",$player_ids))."')";

上述代码还处理$player_ids为空的情况。在您的代码中,它将导致MySQL语法错误(IN ()无效),而在此代码中,它只会查找IN (''),它将不匹配任何行。

implode的另一个用途可能是打包数字时。假设您有一个数字数组,您可以implode("",$digits)将它们打包成一个字符串(并str_split($string)将它们打包)。

简而言之,此功能有许多潜在用途,通常在功能适用时会很明显。尽量不要过于考虑它;)

答案 2 :(得分:0)

示例1提取ID为$player_ids的玩家的玩家信息。第二个示例提取了两个没有WHERE条件的列。

你的问题到底是什么?只要您100%确定$player_ids是一个整数数组!那么它是安全的。

答案 3 :(得分:0)

Implode将采用数组并将其转换为字符串,其中原始数组的每个元素将由内部函数的“第一个参数”分隔。

“安全”是什么意思?我不明白这个问题,但我想你问的是因为你看到implode()用于db查询(在例子中)。 implode()与db查询无关,因此没有sql注入(*)等等。

我们应该使用它代替整个数组的循环

(*)显然你应该注意内爆的数组是什么

答案 4 :(得分:0)

implode从数组创建一个字符串。 在开始使用数组之前,您必须对数组有一些基本的了解。

因此,如果您有一组相同类型的数据,则将其存储在数组中。数组中的第一个参数是分隔符。第二 - 是数组。

$animals = ("cats", "dogs", "cows");
echo implode(" &", $animals) . " are animals" ;

会产生: cats & dogs & cows are animals

在您的第一个示例中,IN构造可以接受多个参数。数组适合使用它。

$player_ids = array(1,2,3);

"IN (".implode(", ", $player_ids).")"将导致IN (1, 2, 3)