2012-04-14 25 views
0

okay, ich habe ein Dilemma. Ich möchte in der Lage sein, maximal sechs Bilder und 2 Textfelder (Titel und Desc) in die DB zu laden ... eigentlich lasse ich mich korrigieren, ich möchte den Namen der Bilder in der db speichern, damit ich es bekommen kann die Bilder später. Ich weiß, wie man mehrere Bilder in einen Ordner hochlädt, und ich weiß, wie man Zeilen in die db einfügt, aber ich kann nicht herausfinden, wie man die zwei kombiniert. Wie würde ich dies mit Bildern kombinieren und den gesamten Prozess abbrechen, wenn eine der Dateien ein Problem hat?hochladen mehrere Bilder in db mit 2 Textfeldern

Mein DB-Setup ist einfach ID | Titel | Beschreibung | img1 | img2 | img3 | img4 | img5 | img6

der Code die ich bisher geschrieben habe, ist:

if (isset($_POST['formsubmitted'])) { //if form was submitted 
$error = array();//Declare An Array to store any error message 

if (empty($_POST['title'])) {//if no name has been supplied 
    $error[] = 'Please enter a title for your post.';//add to array "error" 
    $show_errors = 'show'; 
} else { 
    $title = $_POST['title'];//else assign it a variable 
} 



if (empty($_POST['desc'])) { 
    $error[] = 'Please enter a short desc of your post.';//add to array "error" 
    $show_errors = 'show'; 
} else { 
    $desc = $_POST['desc'];//else assign it a variable 
} 



    if (empty($error)){ //if no error, insert into db 

$new_post = "INSERT INTO `posts` (`title`, `desc`) VALUES ('$title', '$desc')"; 
    $result = mysql_query($new_post) or die(mysql_error('error inserting post')); 

} 


} 

dann die html ist:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
</head> 

<body> 
<?php if (isset($show_errors)) { 
    //show user the errors if form cant be submitted 
    echo '<div> <ol>'; 
     foreach ($error as $key => $values) { echo ' <li>'.$values.'</li>'; } 
     echo '</ol></div><br />'; }?> 

<br /> 
<form method="post" id="newpost" action="" enctype="multipart/form-data"> 
<div><input name="title" type="text" value="" class="title_input"></div> 
<div><textarea id="area4" cols="40" rows="5" name="desc" class="desc_texbox"></textarea></div> 
<div><input type="file" name="images1"></div> 
<div><input type="file" name="images2"></div> 
<div><input type="file" name="images3"></div> 
<div><input type="file" name="images4"></div> 
<div><input type="file" name="images5"></div> 
<div><input type="file" name="images6"></div> 
<input type="hidden" name="formsubmitted" value="TRUE" /> 
<input type="submit" id="upload" value="Upload"> 
</form> 
</body> 
</html> 
+1

Ich würde vorschlagen, mit der Normalisierung Ihrer Datenstruktur zu beginnen, indem Sie die Bilder in eine Bildtabelle verschieben, anstatt das wiederholte Feld in der Posts-Tabelle zu haben. – nnichols

Antwort

1

Dies ist keineswegs abgeschlossen, aber es sollte Sie in die richtige Richtung bringen. Beachten Sie, dass ich dies basierend auf dem Ändern der Dateifelder wie <input type="file" name="images[1]" /> umbenannt habe, damit sie als Array verarbeitet werden.

<?php 

error_reporting(E_ALL); 
ini_set('display_errors', true); 

$db = new PDO('mysql:dbname=test;host=127.0.0.1', 'user', 'pass'); 


if (isset($_POST['formsubmitted'])) { //if form was submitted 

    $error_array = array();//Declare An Array to store any error message 

    // check all images for upload errors 
    // you should probably add extra file validation here - check image type etc 
    $upload_error = false; 
    foreach($_FILES['images']['error'] as $error) { 
     if ($error != 0 && $error != 4) { 
      $upload_error = true; 
     } 
    } 

    if ($upload_error) { 
     $error_array[] = 'One of the image uploads failed!'; 
    } 


    if (empty($_POST['title'])) {//if no name has been supplied 
     $error_array[] = 'Please enter a title for your post.';//add to array "error" 
    } else { 
     $title = $_POST['title'];//else assign it a variable 
    } 

    if (empty($_POST['desc'])) { 
     $error_array[] = 'Please enter a short desc of your post.';//add to array "error" 
    } else { 
     $desc = $_POST['desc'];//else assign it a variable 
    } 

    if (empty($error_array)){ //if no error, insert into db 

     $new_post = "INSERT INTO `posts` (`title`, `desc`) VALUES (?, ?)"; 
     $stmt = $db->prepare($new_post); 
     $stmt->execute(array($title, $desc)); 

     $new_post_id = $db->lastInsertId(); 

     // now start processing the images 
     $image_sql = "INSERT INTO `post_images` (`post_id`, `img_name`) VALUES (?, ?)"; 
     $stmt = $db->prepare($image_sql); 

     for ($i = 1; $i <= 6; $i++) { 

      // you need to add some code to vlaidate, move and rename the files 

      // add the files to the db 
      $file_name = $_FILES['images']['name'][$i]; 
      $stmt->execute(array($new_post_id, $file_name)); 

     } 

    } else { 
     print_r($error_array); 
    } 

} 
?> 
+0

danke! Ich kann definitiv damit arbeiten – Keezy

0

Ich denke, besser ist, zuerst die Bilder auf dem Server, wenn der move_uploaded_file hochladen () Funktion gibt Fehler zurück, fügt einen Wert in $ error array hinzu. Auf diese Weise werden die Daten nur dann in die Datenbank eingefügt, wenn der Upload erfolgreich abgeschlossen wurde.