2017-02-09 121 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其餘的,繼續。 :)在我看來,你張貼問題的方式是很好的。好樣的! –