2016-06-24 5 views
0

Ich bin mir nicht so sicher, wie man ein Bild in PHP verarbeitet, um es in einen Blob-Typ in MYSQLI zu setzen. Hier ist mein Code so weit ...Wie kann ich ein Bild in mysqli eingeben?

<?php 
    $servername = ""; //Taken out for stack overflow question 
    $username = ""; //Taken out for stack overflow question 
    $password = ""; //Taken out for stack overflow question 
    $dbname = ""; //Taken out for stack overflow question 

    $conn = mysqli_connect($servername, $username, $password, $dbname); 

    if (!$conn) 
    { 
     echo 'Could not connect'; 
    } 
    else 
    { 
     if (!empty($_FILES['cf'] && $_POST['category'])) 
     { 
      $file = $conn->real_escape_string($_FILES['cf']['tmp_name']); 
      mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")"); 
     } 
     else 
     { 
      echo 'Empty file'; 
     } 
    } 

    mysqli_close($conn); 
?> 

nun der Wert des Bildes nicht null ist, so das Bild verarbeitet wird. Aber ich kann es nicht verarbeiten. Normalerweise mache ich eine Variable $ var = $ _POST ['cf']; dann füge ich das in die Abfrage ein. Ich habe auch versucht, $ var = $ _FILES ['cf']; aber es wird nicht verarbeitet. Gibt es noch etwas, was ich tun muss, damit es richtig gesendet/verarbeitet wird?

bearbeiten basierend auf Antwort

änderte ich meine PHP zu etwas, das eine Antwort

<?php 
    $servername = ""; //Taken out for stack overflow question 
    $username = ""; //Taken out for stack overflow question 
    $password = ""; //Taken out for stack overflow question 
    $dbname = ""; //Taken out for stack overflow question 

    $conn = mysqli_connect($servername, $username, $password, $dbname); 

    if (!$conn) 
    { 
     echo 'Could not connect'; 
    } 
    else 
    { 
     if (!empty($_FILES['cf'] && $_POST['category'])) 
     { 
      try 
      { 
       $file = $conn->real_escape_string($_FILES['cf']['tmp_name']); 
       $filecontents = File_Get_Contents($file); 
       $filecontentssafe = $conn->real_escape_string($filecontents); 
       mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")"); 
       echo 'Query successful'; 
      } 
      catch(Exception $e) 
      { 
       echo 'Could not perform action' + $e; 
      } 
     } 
     else 
     { 
      echo 'Empty file'; 
     } 
    } 

    mysqli_close($conn); 
?> 

Nun aber .. nichts geht in die Datenbank ähnelt ich sehe Abfrage erfolgreich.

Bearbeiten - hinzugefügte Datei abrufen

<?php 
    $servername = ""; 
    $username = ""; 
    $passcode = ""; 
    $dbname = ""; 

    $conn = mysqli_connect($servername, $username, $passcode, $dbname); 

    if (!$conn) 
    { 
     echo 'Could not connect'; 
    } 
    else 
    { 
     try 
     { 
      $sql_query = mysqli_query($conn, "SELECT * FROM `adDatabase`"); 
      while ($row = mysqli_fetch_array($sql_query)) 
      { 
       $id = $row['ID']; 
       $img = $row['img']; 
       $image = '<img src="data:image/png;base64,'.base64_encode($row['food']).'" style="height: 12em; width: 12em; margin: 1em; padding: 0.9em; " >'; 
       echo $image; 
      } 
     } 
     catch(Exception $e) 
     { 
      echo $e; 
     } 
    } 
?> 

Wie ich Informationen abrufen

+1

Sie haben eine SQL-Injection-Schwachstelle. – SLaks

+0

'var_dump ($ _ FILES)'. Was ist in $ _FILES ist nur Informationen über den Upload. es ist NICHT der eigentliche Dateiinhalt. –

+1

Weder SSL noch andere Sicherheitsmethoden helfen in irgendeiner Weise bei der SQL-Injektion. Sie müssen Sicherheitslücken verstehen. Und die Verwendung von Parametern wird Ihr Problem trotzdem beheben. – SLaks

Antwort

0

Bis Sie mysql rufen, $ file enthält nur einen Pfad zum temporären hochgeladenen Datei nicht die gewünschten Daten .

Wenn Sie MySQL wollen auf den Dateipfad suchen und direkt in Ihre Datenbank seinen Inhalt laden, haben einen Blick auf die Funktion LOAD_FILE MySQL() hier: http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_load-file

Andernfalls, wenn Sie tun möchten dies in PHP, würden Sie den Inhalt der Datei in eine Variable mit so etwas wie

$file_contents=File_Get_Contents($file); 

... und dann

$file_contents_safe=$conn->real_escape_string($file_contents); 

vor stic verwenden ziehen König $ file_contents_safe in die Datenbank. Einige Leute mögen auch Base64 zu kodieren.

Bearbeiten: Bitte beachten Sie auch die Sicherheitslücken in der Injektion, wie andere vorgeschlagen haben. Der Name der temporären Datei und alles, was sonst von post/apache kommt, sollte nicht allein vertrauenswürdig sein.

+0

Ich habe Base64 beim Abrufen von Bildern verwendet. –

+0

Vielen Dank für Ihre Antwort. –

+0

Ich versuche es jetzt –

0

Wenn Sie den Blob-Inhalt nicht in der Datenbank speichern müssen, können Sie den Dateinamen nur in der Datenbank speichern und einen normalen Datei-Upload an einen ausgewählten Speicherort durchführen. Dafür müssen Sie dies vor

$tmp_name = $_FILES["filename"]["tmp_name"]; 
$name = $_FILES["filename"]["name"]; 
move_uploaded_file($tmp_name, "YOUR_UPLOAD_DIR/{$name}"); 

Und nach dem Hochladen der Datei, Hinzufügen der Inhalte in der Datenbank müssen Sie nur hinzufügen, speichern, seinen Namen in der Datenbank anstelle der Fleckinhaltsaktualisierer zu speichern. Bei der Anzeige müssen Sie nur auf die tatsächliche Datei in Ihrem Upload-Ordner zugreifen und diese anzeigen. Es ist eine viel sauberere Lösung, besonders wenn Sie keine Dateien zwischen Servern migrieren müssen.

Der gesamte Code würde wie folgt aussehen:

if (!empty($_FILES['cf'] && $_POST['category'])) 
{ 
    $tmp_name = $_FILES["cf"]["tmp_name"]; 
    $name = $_FILES["cf"]["name"]; 
    move_uploaded_file($tmp_name, "YOUR_UPLOAD_DIR/{$name}"); 
    $file = $conn->real_escape_string($name); 
    mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")"); 
} 

Dann, wenn es Zugriff hat, müssen Sie die Daten aus der Datenbank ziehen und sie nur an.Wenn es ein Bild ist, könnte es

<img src="<?php YOUR_UPLOAD_DIR.'/'.$name ?>"/> 

anders sein:

die Bilddaten in die Datenbank einzufügen tun:

$content = file_get_contents($tmpName); 
$file = $conn->real_escape_string($content); 
$mime_type = mime_content_type($tmpName); 
mysqli_query($conn, "INSERT INTO adDatabase(".$category.", mime_type) VALUES(".$file.", ".$mime_type.")"); 

Hinweis habe ich eine MIME-Typ zum Einsatz, weil Sie es brauchen, um die Datei später korrekt anzeigen zu können.

Dann, wenn Sie es anzeigen möchten, ziehen Sie einfach den Inhalt aus der Datenbank und echo es zusammen mit dem richtigen Header.

header('Content-type:'.$mime_type); 
echo $content; 
+0

Unglücklicherweise brauche ich die Datenbank. Normalerweise benutze ich diese Methode. Aber eine db ist in diesem Fall notwendig. –

+0

Just aktualisiert die Antwort, sollte jetzt hilfreicher sein :) – trajchevska

+0

Danke, was ist mimi_content_type? –

Verwandte Themen