2010-11-27 17 views
0

私のノービスのために困難を抱えています。私はこの権利をしているかどうかは分かりませんが、mysql dbにforeachループを介して配列を持つid変数をポストする必要があります。それが意味をなさないのであれば、それはおそらく私が技術専門用語で表現する能力の欠如に起因しているでしょう。 PHPコードの注釈をご覧ください。foreachループ内に2つの配列がありますか?

いつも助けてください。

乾杯、リーは

FORM:

<form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data"> 

<?php 
    $num = 0; 
    while($num < $num_uploads) 
    { 
     ?> 
<input type="hidden" name="item_id[]" value="<?php echo $stockno; ?>" /> 
<input type="file" id="myfile" name="userfile[]" size="40"> 

     <?php $num++; 
    } 
?> 
<input type="submit" name="Preview" value="Preview" /> 
</form> 

PHPスクリプト:

if(isset($_POST['Preview'])) { 
// START PHOTO QUERY 

    if(isset($_FILES['userfile']['tmp_name'])) 
    { 
     /** loop through the array of files ***/ 
     for($i=0; $i < count($_FILES['userfile']['tmp_name']);$i++) 
     { 
      // check if there is a file in the array 
      if(!is_uploaded_file($_FILES['userfile']['tmp_name'][$i])) 
      { 
       $messages[] = 'No file uploaded'; 
      } 
      /*** check if the file is less then the max php.ini size ***/ 
      elseif($_FILES['userfile']['size'][$i] > $upload_max) 
      { 
       $messages[] = "File size exceeds $upload_max php.ini limit"; 
      } 
      // check the file is less than the maximum file size 
      elseif($_FILES['userfile']['size'][$i] > $max_file_size) 
      { 
       $messages[] = "File size exceeds $max_file_size limit"; 
      } 
      else 
      { 
       // copy the file to the specified dir 
       if(@copy($_FILES['userfile']['tmp_name'][$i],$upload_dir.'/'.$_FILES['userfile']['name'][$i])) 
       { 
        /*** give praise and thanks to the php gods ***/ 
        $messages[] = $_FILES['userfile']['name'][$i].' uploaded'; 
        $name[] = $_FILES['userfile']['name'][$i]; 
        $id[] = $_POST['item_id']; 

// HAVING DIFFICULTIES HERE 

foreach($name as $value) { 
$sql = "INSERT INTO stock_photos (photo_filename) VALUES ('$value')"; 
mysql_query($sql); 
foreach($id as $val) { 
$sql2 = "UPDATE stock_photos SET photo_item_id = '$val' WHERE photo_filename = '$value'"; 
mysql_query($sql2) or die(mysql_error()); 
} 
} 
// END DIFFICULTIES HERE 
       } 
       else 
       { 
        /*** an error message ***/ 
        $messages[] = 'Uploading '.$_FILES['userfile']['name'][$i].' Failed'; 
       } 
      } 
     } 
    } 

// END PHOTO QUERY 
} 

答えて

2

私はあなたのロジックに欠陥があると思います。ネストされたforeachループを持つことは望ましくありません。それについて考えてみましょう:

各ファイル名をループしています。 ファイル名ごとに、すべてのIDをループして、ファイル名IDをID配列の各値とともに更新します。基本的には、UPDATEの呼び出しごとにデータベースのIDを上書きして、最終的に値を$id配列の最後の値に設定します。

したがって、実際にはループを1つずつ持つ必要があります。


通常forループを使用して、あなたがより良い行うことができますあなたの$name$idが適切に満たされ、両方が同じ数の項目が含まれていると仮定:

for($i = 0; $i < count($name); $i++) { 
    $sql = "INSERT INTO stock_photos (photo_filename, photo_item_id) VALUES ('". mysql_real_escape_string($name[$i]) . "', '" . mysql_real_escape_string($id[$i] . "')"; 
    mysql_query($sql); 
} 

注:決して決して決してユーザーの入力を信用しないでください。mysql_real_escape_string()と同じように、フィルタリングとエスケープを行うことで予防措置を講じる必要があります。


更新:

そして、あなたは一度に複数の値を挿入することで、より良いだけ MySQLのクエリで行うことができます。

function prepare($name, $id) { 
    return sprintf("'%s', '%s'", 
      mysql_real_escape_string($name), 
      mysql_real_escape_string($id)); 
} 

$values = array_map('prepare', $name, $id); 
$sql = 'INSERT INTO stock_photos (photo_filename, photo_item_id) VALUES (' . implode('),(', $values) . ')'; 
mysql_query($sql); 

参考:sprintfarray_mapimplode

+0

完璧!ありがとうございました!私がどこに間違っているのかを説明してくれてありがとう。 – Lea

+0

@Lea:ようこそ。ハッピーコーディング! :) –

関連する問題