2017-02-09 120 views
0

添加列我有2个数据库,体系和客户。 在SYSTEM中有一个包含用户名的stafflist表。 CUSTOMER中的每个表都是客户名称。PHP/MySQL与嵌套的foreach

我所试图做的是在客户的foreach表, 的foreach '的用户名在system.stafflist', ALTER TABLE '$表' 地址 '$用户名'

这里是我的代码:

$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 

如果我注释掉$销售foreach循环和改变我的ALTER语句列名“ABC”,而不是$销售然后我就可以成功添加“ABC '给每张桌子。

是什么原因造成的$销售的foreach给错误?

在foreach循环

回答

1

你overwrting您的阵列

foreach ($sales as $sales) 

应该读

foreach ($sales as $sale) 

你将不得不改变你的$销售varaible在查询中反映这种变化

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

测试,看看它是否立即修复你的SQL错误。

编辑:我看到你与表

foreach ($table as $table){ 

找到适合您的阵列的另一个名字foing同样的事情。 ei $表。

此外,这看起来很滑稽到我,因为你没有incremating你的柜台,但你可以加上“s”你在这里阵:

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

...等等。稍有不慎,大conseuences:P

,除非你想只得到该行的第一个关口。在这种情况下,你可以使用reset()方法,像这样:

$tables[] = reset($row); 

或简单地调用数组索引0,无需日$我。

$tables[]=$row[0]; 

见PHP手册进行正确的方式来定义foreach循环: http://php.net/manual/en/control-structures.foreach.php

+0

我也不会,如果我的代码看起来很滑稽的人,我拿不出自称是一个良好的编码惊讶,但给它我最好,随着我去学习。在调整这一切工作之后,您将$ sales视为$ sales,将$ table视为$ table。奇怪的是,$表循环从来没有给我的问题。反正它正在工作。也感谢你的信息。 – Nama

+1

那么你是一个好的开始,PHP.net是一个很好的信息来源。我没有打扰告诉sql注入,因为你使用的是内部数据,但是在从用户输入跳到数据库之前,你必须学习准备好的语句。 http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1其余的,继续。 :)在我看来,你张贴问题的方式是很好的。好样的! –