【问题标题】:php implode function not working on concatenated variablesphp 内爆函数不适用于连接变量
【发布时间】:2012-07-06 13:35:16
【问题描述】:

我有多个数组,我在表单提交操作中将它们传递给文件 sales_process.php。数组命名如下:boards1 = {a , b , c}, board2 = {b , c , d}, board3 = {a , c , d} 。 .依此类推(值不是 a、b、c、d)。我在我的表单中通过多个“多个选择框”传递它们,其中 a、b、c、d 是我的多个选择选项:

for ($count=1;$count<10;$count++)
echo "<td>"."<select name='boards".$count."[]' multiple='multiple'>".showOptionsDrop($boards,$arr)."</select></td>";  

现在,当我将它们传递给文件 sales_process.php 时,我想使用 implode 函数将这些数组转换为字符串,以便我可以将它们存储到我的“学校”表中。在 sales_process.php 文件中,我正在这样做:

for ($i=0;$i<$count;$i++) {
$board = implode(',',${'boards'.$i});
$query = "UPDATE schools SET board = '$board' where schoolcode = (some_no)";
$result = mysql_query($query) or die("Error in updating table :".mysql_error());
}  

这样,每次我的循环运行时,boardsX 的值都会转换为字符串并存储在表中,其中 X 是 1,2,3.... 等等。
问题是内爆函数不起作用并给出错误:
Warning: implode() [function.implode]: Invalid arguments passed in C:\xampp\htdocs\relationshipReport\sales_process.php on line 18

现在,如果您说变量 ${'boards'.$i} 不是数组,我这样做了,发现它只给了我一个数组:

$i=1;
var_dump(${'boards'.$i});
print_r(${'boards'.$i});  

输出为:

array(3) { [0]=> string(4) "CBSE" [1]=> string(4) "ICSE" [2]=> string(5) "IGCSE" }
Array ( [0] => CBSE [1] => ICSE [2] => IGCSE )  

我希望我的问题很清楚。请帮助我找出内爆函数中出了什么问题。如果你不明白这个问题,请提出来。

【问题讨论】:

  • 在 PHP 中处理数组时,用方括号括起来,[],而不是花括号。尝试解决此问题并报告回来。 :)
  • 嗯,$i 为 1 时是数组,但它总是数组吗?
  • @SebastiánGrignoli :是的,我传递的变量是'boardsX'的格式,其中X是一个整数值,所以它在连接时总是一个数组。
  • @Spiritfyre : 我做了 $['boards'.$i] 只是为了发现它给了我一个表达式错误:(
  • 您需要以$_POST['boards'.$i]$_GET['boards'.$i] 的身份访问它,具体取决于您从表单发送内容的方式。

标签: php arrays implode


【解决方案1】:

假设${'boards'.$i} 来自$_POST['boards'.$i]。 (如果不是,您使用的是register_globals,但这不好。)

对于多选,如果没有选择任何选项,那么$_POST['boards'.$i] 将给你null 而不是一个数组。

【讨论】:

  • 在这种情况下,用户只需将if 条件插入到围绕implode 函数的for 循环中。 if(isset($_POST['boards'.$i])) 之类的东西应该可以。
  • 不,我正在使用$_POST['boards'.$i] 并且没有注册全局变量。另外我向你保证,没有一个数组是空的,我已经在前端使用 javascript 完成了验证。
  • 这种验证应该在客户端和服务器端都进行。
【解决方案2】:

从您的示例中,我相信这是您当前的代码:

for ($i=0;$i<$count;$i++) {
    $board = implode(',',${'boards'.$i});
    $query = "UPDATE schools SET board = '$board' where schoolcode = (some_no)";
    $result = mysql_query($query) or die("Error in updating table :".mysql_error());
} 

如果是这样,请尝试将其更改为如下所示:

for ($i=0;$i<$count;$i++) {
    if(isset($_POST['boards'.$i]))
    {
        $board = mysql_real_escape_string(implode(',',$_POST['boards'.$i]));
        $query = "UPDATE schools SET board = '$board' where schoolcode = (some_no)";
        $result = mysql_query($query) or die("Error in updating table :".mysql_error());
    }
    else
    {
        echo '$_POST[\'boards' . $i . '\'] doesn\'t exist or is null.<br>';
    }
} 

这包含一个if 条件,检查数组条目是否确实存在。如果确实存在,它将运行查询。如果不存在,它会echos 回复一条消息,告诉您哪个不存在。

即使您已经在前端使用 Javascript 进行了确认,您也应该始终在运行代码之前进行检查,以确保它不会破坏它。您永远不会太安全,尤其是当您的代码包含敏感信息时。

试试这个,告诉我你的进展。

【讨论】:

  • 请在 $board 发送到查询之前添加转义。
  • 好想法@SebastiánGrignoli。我现在将其添加。
  • @Mohit,如果您不使用 mysql_real_escape_string($boards),您将向您的服务器引入 SQL 注入漏洞。
  • 谢谢你们。我发现了错误。我从boards1[] 开始传递变量,以此类推,而我的for_loop 使用从0 开始的计数器,所以它是boards0[]。该死的,我真是个菜鸟。 :( 谢谢大家的时间。
  • 不用担心@Mohit。如果有疑问,请打印您正在执行的操作。调试第一步。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
相关资源
最近更新 更多