【问题标题】:PHP/MYSQL add column with nested foreachPHP/MYSQL 添加带有嵌套 foreach 的列
【发布时间】:2017-02-09 01:48:55
【问题描述】:

我有 2 个数据库,SYSTEM 和 CUSTOMER。 在 SYSTEM 中有一个包含用户名的人员列表。 CUSTOMER 中的每个表都是一个客户名称。

我正在尝试做的是在 Customer 中的 foreach 表, foreach 'system.stafflist 中的用户名', ALTER TABLE '$table' ADD '$username'

这是我的代码:

$sql3 = "SELECT username from system.stafflist";
$result3 = $conn->query($sql3);
$sales = array();
    while($row3 = $result3->fetch_array()) {
        $sales[]="x".$row3['username'];
    }   

$sql = "SHOW TABLES from customer";
$result = $conn2->query($sql);
$table = array();
    $i=0;
    while($row = $result->fetch_array()) {
        $table[] = $row[$i];
    }
var_dump ($table);
var_dump ($sales);

foreach ($table as $table){
    foreach ($sales as $sales){
        $sql2 = "ALTER TABLE $table ADD $sales VARCHAR( 12 );";
        if ($conn2->query($sql2) === TRUE) {} else {echo "Error: " . $sql2 . "<br>" . $conn2->error;}
    }
}

var_dump 显示了两个正确的数组:

array (size=62)
  0 => string 'rita' (length=4)
  1 => string 'sadk' (length=4)
  2 => string 'sand' (length=4)
  3 => string 'sany' (length=4)
  4 => string 'sbdk' (length=4)
  5 => string 'sdkg' (length=4)

array (size=54)
  0 => string '0007' (length=4)
  1 => string '0006' (length=4)
  2 => string '0005' (length=4)
  3 => string '0004' (length=4)
  4 => string '0003' (length=4)

但是有两个错误:

错误:ALTER TABLE rita ADD x2304 VARCHAR(12); 重复的列名“x2304”

和

Warning: Invalid argument supplied for foreach()  <--the $sales foreach

如果我注释掉 $sales foreach 循环并将我的 ALTER 语句列名更改为“abc”而不是 $sales,那么我可以成功地将“abc”添加到每个表中。

是什么导致 $sales foreach 出错?

【问题讨论】:

    标签: php mysql arrays foreach


    【解决方案1】:

    在 foreach 循环中你覆盖了你的数组

    foreach ($sales as $sales) 
    

    应该读

    foreach ($sales as $sale)
    

    您必须在查询中更改 $sale 变量以反映该更改

      $sql2 = "ALTER TABLE $table ADD $sale VARCHAR( 12 );";
                                      ^^^^^
    

    测试它是否能立即修复你的 sql 错误。

    编辑:我看到你用桌子做同样的事情

    foreach ($table as $table){
    

    为您的阵列找到另一个名称。 ei $tables。

    另外,这对我来说看起来很有趣,因为你没有增加你的计数器,但你可以在这里为你的数组添加一个 's':

    $tables = array(); //table changed to tables
           $i=0;
            while($row = $result->fetch_array()) {
                $tables[] = $row[$i]; //table changed to tables
            }
    

    ... 等等。小错误,大后果:P

    除非您只想获取该行的第 1 列。在这种情况下,您可以像这样使用 reset():

    $tables[] = reset($row);
    

    或者只是调用数组索引0,不需要$i。

    $tables[]=$row[0];
    

    有关定义 foreach 循环的正确方法,请参阅 php 手册: http://php.net/manual/en/control-structures.foreach.php

    【讨论】:

    • 如果我的代码在人们看来很有趣,我不会感到惊讶,我并不声称自己是一名优秀的程序员,但尽我所能,边做边学。您对 $sales 作为 $sales 和 $table 作为 $table 的看法是正确的,在调整后一切正常。奇怪的是 $table 循环从来没有给我带来问题。无论如何它正在工作。也感谢您提供的其他信息。
    • 您的开端不错,PHP.net 是一个很好的信息来源。我没有费心讲述 sql 注入,因为您使用的是内部数据,但是在从用户输入跳转到数据库之前,您必须了解准备好的语句。 stackoverflow.com/questions/60174/… 其余的,请继续。 :) 在我看来,你发布问题的方式是正确的。太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2012-02-16
    • 2021-02-22
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多