2017-02-09 4 views
0

私は2つのデータベース、SYSTEMとCUSTOMERを持っています。 SYSTEMには、ユーザー名を持つstafflistテーブルがあります。 CUSTOMERの各テーブルは顧客名です。ここでPHP/MYSQLネストされたforeachを持つ列を追加

私は何をしようとしていますがお客様、 foreachの 'system.stafflistにユーザー名' でforeachのテーブルで、 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は2つの適切な配列を示しています。

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) 

をしかし、2個のエラーがあります。

エラー:ALTER TABLE rita ADD x2304 VARCHAR(12); 重複する列名「x2304」

そして

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

私は$販売foreachループをコメントアウトし、代わりに$販売の「ABC」に私のALTERステートメントの列名を変更する場合、私は正常に「ABCを追加することができます'を各テーブルに追加します。

$ sales foreachがエラーを引き起こす原因は何ですか?あなたは

foreach ($sales as $sales) 

あなたの配列をoverwrtingているforeachループで

答えて

1

foreach ($sales as $sale) 

をお読みくださいあなたはその変化に

$sql2 = "ALTER TABLE $table ADD $sale VARCHAR(12);"; 
            ^^^^^ 
を反映するために、クエリであなたの$販売varaibleを変更する必要があります

SQLエラーを一度に修正するかどうかを確認するテスト。

EDIT:私はあなたがテーブル

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 
     } 

...とを。少しの間違い、大きい結婚式:P

行の最初の列だけを取得したい場合を除きます。その場合、reset()を以下のように使用することができます。

$tables[] = reset($row); 

または単に配列インデックス0を呼び出し、th $ iは不要です。

$tables[]=$row[0]; 

は、foreachループを定義するための適切な方法のためのPHPのマニュアルを参照してください。 http://php.net/manual/en/control-structures.foreach.php

+0

私は私のコードは、人々におかしい、私は良いコーダであることにノークレームを取らない場合は驚いて、それを与えていないだろう私の最高と私が行くように学ぶ。あなたは、$ salesとしての$ salesと$ tableとしての$ tableについて、これをすべて調整した後、正しく機能しました。奇妙なことは、$ tableループは私に問題を与えてくれないということです。とにかくそれは働いています。また、追加情報に感謝します。 – Nama

+1

あなたは良いスタートを切っています.PHP.netは素晴らしい情報源です。私はあなたが内部データを使用しているが、ユーザー入力からデータベースにジャンプする前に準備されたステートメントについて学ぶことが不可欠であるため、SQLインジェクションについて説明するのは大変です。残りの部分については、http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1こちらをご覧ください。 :)あなたが質問を投稿した方法は、私の意見では、うまく形成されました。ブラボー! –

関連する問題