0

我对 PHP 比较陌生。我工作的教科书涵盖了 PHP5.2,没有提到内爆。我从 PHP 手册中获得的信息有点不清楚。我正在寻找关于内爆的简短清晰的解释和示例

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

我知道 implode 返回其数组元素的字符串,但是以下 2 个示例有何不同,以及为什么要使用一个而不是另一个:

示例 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());

谢谢

4

5 回答 5

2

我将忽略您在代码中使用 mysql_query() 的事实 - 因为这是 PHP 报告中更易受攻击的库。当您感觉更舒服时,或者如果您可以马上使用,请使用 PDO。

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

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

例如

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 ) ";

希望有帮助

于 2013-10-10T13:19:33.730 回答
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)解包它们)。

总之,这个功能有很多潜在的用途,一般在应用的时候就会很明显。尽量不要想太多;)

于 2013-10-10T13:15:24.387 回答
0

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

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

我们应该使用它而不是循环整个数组

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

于 2013-10-10T13:15:01.993 回答
0

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

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

于 2013-10-10T13:13:41.130 回答
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)

于 2013-10-10T13:18:15.747 回答