我对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());
谢谢
答案 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)