2017-08-07 2 views
1

Ein Wert wird in der Datenbank gespeichert, aber es ist nicht der, den ich erwarte. Ich habe viele Methoden ausprobiert, aber diese eine Art scheint zu funktionieren, aber der Dateiname wird nicht gespeichert und wenn ich versuche, die Datei direkt von der Datenbank herunterzuladen, lädt sie ein .bin Dateiformat herunter, das ungefähr wie table_Name-column_Name.bin aussieht . Der Name Datei gespeichert ist BLOB - ## B.Bild wird nicht korrekt in der MySQL-Datenbank gespeichert

Meine Form

<form class="form-horizontal" method="post" action="productsValidate.php" name="myForm" enctype="multipart/form-data"> 
    <fieldset> 
     <legend>Add Product</legend> 
     <div class="form-group"> 
     <label for="Product_Name" class="col-lg-2 control-label">Product Name</label> 
     <div class="col-lg-10"> 
      <input type="text" class="form-control" id="Product_Name" placeholder="Name" required="required" name="Product_Name"> 
     </div> 
     </div> 
     <div class="form-group"> 
     <label for="Size" class="col-lg-2 control-label">Size</label> 
     <div class="col-lg-10"> 
      <input type="text" class="form-control" id="Size" placeholder="Size" required="required" name="Size"> 
     </div> 
     </div> 
     <div class="form-group"> 
     <label for="Color" class="col-lg-2 control-label">Color</label> 
     <div class="col-lg-10"> 
      <input type="text" class="form-control" id="Color" placeholder="Size" required="required" name="Color"> 
     </div> 
     </div> 
     <div class="form-group"> 
     <label for="price" class="col-lg-2 control-label">Price</label> 
     <div class="col-lg-10"> 
      <input type="number" class="form-control" id="price" placeholder="price" required="required" name="price"> 
     </div> 
     </div> 
     <div class="form-group"> 
     <label for="image" class="col-lg-2 control-label">Select Image</label> 
     <div class="col-lg-10"> 
      <input type="file" name="image" id="image"> 
     </div> 
     </div> 
     <div class="form-group"> 
     <label for="categoryId" class="col-lg-2 control-label">Category Id</label> 
     <div class="col-lg-10"> 
      <?php 
       //your connection to the db and query would go here 
       include "../include/settings.php"; 
       $conn = new mysqli($host, $user, $pwd, $sql_db); 
       if ($conn->connect_error) { 
        die("Connection failed: " . $conn->connect_error); 
       } 
       $sql = "SELECT distinct Category_Id FROM products"; 
       $result = mysqli_query($conn, $sql); 
       ?> 
      <select id="categoryId" name="categoryId"> 
       <option value = ""></option> 
       <?php 
        while($row = mysqli_fetch_array($result)) { 
        echo '<option value='.$row['Category_Id'].'>'.$row['Category_Id'].'</option>'; 
        } 
        ?> 
      </select> 
     </div> 
     </div> 
     <div class="form-group"> 
     <label for="description" class="col-lg-2 control-label">Description</label> 
     <div class="col-lg-10"> 
      <textarea type="text" class="form-control" id="description" placeholder="Description" required="required" name="description" pattern="[\sA-Za-z]+"></textarea> 
     </div> 
     </div> 
     <div class="form-group"> 
     <div class="col-lg-6 col-lg-offset-2"> 
      <button type="submit" class="btn btn-primary">Add Product</button> 
     </div> 
     </div> 
    </fieldset> 
</form> 

Meine Form Validierung

<?php 

    $name = $_POST["Product_Name"]; 
    $size = $_POST["Size"]; 
    $color = $_POST["Color"]; 
    $price = $_POST["price"]; 

    $image = addslashes($_FILES['image']['tmp_name']); 
    $image = file_get_contents($image); 
    $image = base64_encode($image); 
    $image=basename($_FILES["image"]["tmp_name"],".jpg"); 

    $category = $_POST['categoryId']; 
    $description = $_POST['description']; 
    insertProduct($name, $size, $color, $price, $image, $category, $description); 

    function insertProduct($name, $size, $color, $price, $image, $category, $description){ 

     require_once ("../include/settings.php"); // Load MySQL log in credentials 
     $conn = @mysqli_connect ($host,$user,$pwd,$sql_db); // Log in and use database 
     if ($conn) { // check is database is avialable for use 
      $query = "INSERT INTO products 
            (Product_Id, Product_Name, Size, Color, Price, Picture, Category_Id, Description) 
           VALUES ('', '$name', '$size', '$color', '$price', '$image', '$category', '$description')"; 

      $result = mysqli_query ($conn, $query); 
      if ($result) {        // check if query was successfully executed 
       echo 'Successfully Added'; 
      } else { 
       echo 'Product could not be added'; 
      } 
      mysqli_close ($conn);     // Close the database connect 
     } else { 
      echo "<p>Unable to connect to our database for adding the product.</p>"; 
     } 
    } 
?> 

Database

+0

Es ist oft besser, das Bild einfach in einen Ordner auf dem Server hochzuladen und den Pfad dazu in der Datenbank zu speichern. – Qirel

Antwort

2

Ich glaube, Sie versuchen, um das tatsächlich codierte Bild in der Datenbank zu speichern, kein Zeiger darauf. Es sieht für mich so aus, als hätte dein elf Byte großes BLOB stattdessen den Zeiger.

Ihr Code enthält diese Zeilenfolge.

Die dritte Zeile fügt eine codierte, nicht binäre Version des Bildes in eine Textzeichenfolge ein. Das ist nahe an dem, was Sie wollen, aber Sie sollten es wahrscheinlich nicht base64-encodieren, wenn Sie ein BLOB einfügen.

Die vierte Zeile verwirft das Bild selbst und überschreibt es mit einem Bildnamen. Ich denke, das ist falsch.

Wenn Sie BLOB-Daten auf diese Weise verwenden möchten, müssen Sie auch die SQL-Anweisungen prepare von mysqli verwenden und dann bind Ihre Parameter. Die Funktion bind_param() bietet Ihnen die Möglichkeit, einen Parameter als Blob zu deklarieren. Das ist besser, als zu versuchen, die String-Verarbeitung von php so auszutricksen, dass sie akzeptiert wird.

All das gesagt, die meisten Menschen verwenden ein Dateisystem oder Content-Server anstelle von BLOBs zu speichern und Bilder an Web-Clients zu liefern. BLOB-Programmierung ist ein Schmerz im Nacken. Wenn Sie ein DBMS zum schnellen Speichern und Abrufen von Bildern verwenden, wird dies schnell zu einem Leistungsengpass in einer skalierbaren Anwendung.

Verwandte Themen