2016-04-12 14 views
1

Ich habe versucht Anzahl der Threads hier ist SO, um dies zu machen, aber keiner hilft mir bisher oder ich vermisse etwas hier.Drei Eingabedateien Feld in einem Formular und speichern in Datenbank

So habe ich ein Formular mit drei Eingabefeldern .. Ich weiß, ich kann multiple auf einem Feld verwenden, aber ich brauche es so. Hier ist einfache Version (ein Teil des Feldes, um gelöscht zu machen Quelle kompaktere für die Buchung hier)

HTML-Teil:

<form class="form-horizontal" name="form-horizontal" action="" method="post" role="form" enctype="multipart/form-data" > 
    <div class="form-group"> 
     <label class="control-label col-sm-2" for="upload_one">Upload_one: </label> 
      <div class="col-sm-10"> 
       <input type="file" class="form-control" name="file[]" id="upload_one">    
      </div> 
    </div> 
    <div class="form-group"> 
     <label class="control-label col-sm-2" for="upload_two">Upload_two:</label> 
      <div class="col-sm-10"> 
       <input type="file" class="form-control" name="file[]" id="upload_two"> 
      </div>      
    </div> 
    <div class="form-group"> 
     <label class="control-label col-sm-2" for="upload_three">Upload_three: </label> 
      <div class="col-sm-10"> 
       <input type="file" class="form-control" name="file[]" id="upload_three" multiple> 
      </div>      
    </div>                                                             
    <div class="form-group"> 
     <div class="col-sm-offset-2 col-sm-4"> 
      <input type="submit" name="add" value="Add New Lesson" class="btn btn-primary btn-block"> 
     </div> 
    </div>      
</form> 

Und der PHP Teil

if (isset($_POST["add"])) { 
$pdo = Database::connect(); 
$msg = ""; 
$permitted = array('application/vnd.ms-excel', 'application/pdf', 'application/msword', 'image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/bmp'); 

if (count($_FILES["file"]) > 0) {  
    $folderName = "uploads/"; 

    $sql = "INSERT INTO upload (upload_one, upload_two, upload_three, upload_size, upload_type) 
        VALUES (:upload_one, :upload_two, :upload_three, :upload_size, :upload_type)"; 
    $stmt = $pdo->prepare($sql); 

    foreach (array_keys($_FILES) as $file) { 
    for ($i = 0; $i < count($_FILES[$file]["name"]); $i++) { 

     if ($_FILES[$file]["name"][$i] <> "") {  
     if ($permitted) { 

      $fileSize = $_FILES[$file]["size"][$i]; 
      $fileType = $_FILES[$file]["type"][$i]; 
      $fileName = $_FILES[$file]["name"][$i]; 
      $tmpName = $_FILES[$file]["tmp_name"][$i]; 


      $ext = substr(strrchr($fileName, "."), 1); 
      $_FILES[$file]["name"][$i] = rand(10000, 990000) . '-' .$fileName; 

      $filepath = $folderName . $_FILES[$file]["name"][$i]; 

      if (!move_uploaded_file($tmpName, $filepath)) { 
      $emsg .= "Error while uploading file - <strong>" . $_FILES[$file]["name"][$i] . "</strong>. Please try again. <br>"; 
      } else { 
      $smsg .= "The file <strong>" . $_FILES[$file]["name"][$i] . "</strong> is added successfully. <br>"; 

      try { 
       $stmt->bindValue(":upload_one", $_FILES[$file]["name"][$i], PDO::PARAM_STR); 
       $stmt->bindValue(":upload_two", $_FILES[$file]["name"][$i], PDO::PARAM_STR); 
       $stmt->bindValue(":upload_three", $_FILES[$file]["name"][$i], PDO::PARAM_STR);        
       $stmt->bindValue(":upload_size", $fileSize, PDO::PARAM_STR); 
       $stmt->bindValue(":upload_type", $fileType, PDO::PARAM_STR);    


       $stmt->execute(); 
       $result = $stmt->rowCount(); 
       if ($result > 0) { 
       // file uplaoded successfully. 
       } else { 
       // failed to insert into database. 
       } 
      } catch (Exception $ex) { 
       $emsg .= "<strong>" . $ex->getMessage() . "</strong>. <br>"; 
      } 
      } 
     } else { 
      $emsg .= "This file <strong>" . $_FILES[$file]["name"][$i] . "</strong> isn't permitted. <br>"; 
     } 
     } 
    } 

    $msg .= (strlen($smsg) > 0) ? successMessage($smsg) : ""; 
    $msg .= (strlen($emsg) > 0) ? errorMessage($emsg) : ""; 
    } } 
    else { 
     echo ''; 
    } 

Als ich hinzufügen Hit Knopf es ist jedes Eingabefeld in einer Zeile speichern und die Datei von diesem Eingang ist dreimal. Zum Beispiel:

`input file_1` have doc1.docx 
`input file_2` have doc2.docx 
`input file_3` have doc3.docx 

Dies wird dies in der Datenbank erzeugen: enter image description here

können Sie sehen, wie jede Datei 3-mal für jede Eingabedatei gespeichert wird, anstatt jede Datei nur eine in seiner Kolumne zu sein ..

+0

Die Art und Weise, wie Sie Ihre Logik aufbauen, bedeutet, dass dies geschieht. Loop File 1 fügt eine Zeile mit demselben Namen in alle 3 Felder ein. Datei 2 Wiederholen, Datei 3 Wiederholen, Schleife beenden – scottevans93

+0

Es gibt 2 Methoden, um das zu erreichen, entweder alle 3 Dateien in derselben Zeile speichern oder jede Datei hat ihre eigene Zeile. Welcher wäre für Ihren Anwendungsfall besser geeignet? – scottevans93

+0

Ich möchte sie in derselben Zeile speichern. Nur jede Datei in seiner Spalte .. Wie auf dem Bild aber 'upload_1' um Datei_1 zu halten,' upload_2' um Datei2 zu halten .. – Select

Antwort

2

Versuchen Sie, diese für den einreichen Code:

{ 
$pdo = Database::connect(); 
$msg = ""; 
$permitted = array('application/vnd.ms-excel', 'application/pdf', 'application/msword', 'image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/bmp'); 

if (count($_FILES["file"]) > 0) 
{  
    $folderName = "uploads/"; 

    $sql = "INSERT INTO upload (upload_one, upload_two, upload_three, upload_size, upload_type) 
        VALUES (:upload_0, :upload_1, :upload_2, :upload_size, :upload_type)"; 
    $stmt = $pdo->prepare($sql); 

    foreach (array_keys($_FILES) as $file) 
    { 
    for ($i = 0; $i < count($_FILES[$file]["name"]); $i++) 
    { 

     if ($_FILES[$file]["name"][$i] <> "") 
     {  
     if ($permitted) 
     { 

      $fileSize = $_FILES[$file]["size"][$i]; 
      $fileType = $_FILES[$file]["type"][$i]; 
      $fileName = $_FILES[$file]["name"][$i]; 
      $tmpName = $_FILES[$file]["tmp_name"][$i]; 


      $ext = substr(strrchr($fileName, "."), 1); 
      $_FILES[$file]["name"][$i] = rand(10000, 990000) . '-' .$fileName; 

      $filepath = $folderName . $_FILES[$file]["name"][$i]; 

      if (!move_uploaded_file($tmpName, $filepath)) { 
      $emsg .= "Error while uploading file - <strong>" . $_FILES[$file]["name"][$i] . "</strong>. Please try again. <br>"; 
      } else { 
      $smsg .= "The file <strong>" . $_FILES[$file]["name"][$i] . "</strong> is added successfully. <br>"; 

      try { 
       $stmt->bindValue(":upload_".$i, $_FILES[$file]["name"][$i], PDO::PARAM_STR); 
       $stmt->bindValue(":upload_size", $fileSize, PDO::PARAM_STR); 
       $stmt->bindValue(":upload_type", $fileType, PDO::PARAM_STR);    



      } catch (Exception $ex) { 
       $emsg .= "<strong>" . $ex->getMessage() . "</strong>. <br>"; 
      } 
      } 
     } else { 
      $emsg .= "This file <strong>" . $_FILES[$file]["name"][$i] . "</strong> isn't permitted. <br>"; 
     } 
     } 
    } 

    $msg .= (strlen($smsg) > 0) ? successMessage($smsg) : ""; 
    $msg .= (strlen($emsg) > 0) ? errorMessage($emsg) : ""; 
    } 
     $stmt->execute(); 
     $result = $stmt->rowCount(); 
     if ($result > 0) { 
     // file uplaoded successfully. 
     } else { 
     // failed to insert into database. 
     } 

} 
else 
{ 
    echo ''; 
} 

}

+0

Dies würde funktionieren, aber es ist eine schlechte Übung so weit wie die Logik geht. – scottevans93

+0

Also nur das ist der Unterschied: '$ stmt-> bindValue (": upload _ ". $ I, $ _FILES [$ datei] [" name "] [$ i], PDO :: PARAM_STR);'? – Select

+0

Ich zeige nur seinen Fehler, dass er die Ausführung der Einfügeabfrage innerhalb der for-Schleife vorgenommen hat, die jede Datei in einzelne Zeilen einfügt. – Warriorbik

Verwandte Themen