2009-08-11 4 views
0

Ich entschuldige mich, wenn dies eine dichte Frage ist, aber ich habe ein bisschen Probleme mit MYSQL LOAD_FILE() in Verbindung mit vorbereiteten Anweisungen, um ein Bild BLOB hochladen. Daher muss ich darauf zurückgreifen, um Abfragen zu trennen, eine, um eine Anweisung für Details vorzubereiten, und eine andere, die die Anweisung zum Einfügen meines BLOB nicht vorbereitet. Hier ist ein Beispiel für die Abfrage, die ich versucht habe:Korrekte Verwendung von MySQL LOAD_FILE()

function add_new_video() { 
    $image = $_FILES['thumbnail_file']['tmp_name']; // pass this file name to getimagesize() to determine the mime-type 
    $size_array = getimagesize($image); 
    $thumbnail_mimetype = $size_array['mime']; 
    $thumbnail_contents = file_get_contents($image); 
    $thumbnail_filesize = $size_array[3]; 
    $thumbnail_filename = $_FILES['thumbnail_file']['name']; 

    $title = $_POST['title']; 
    $summary = $_POST['summary']; 
     // Checkbox...  
     if(!empty($_POST['demo_reel'])) { 
     $demo_reel = $_POST['demo_reel']; 
    } 
    else { 
     $demo_reel = 0; 
    } 

    $query = "INSERT INTO videos (title, summary, thumbnail_filename, thumbnail_filesize, thumbnail_mimetype, thumbnail_contents, demo_reel) VALUES(?, ?, ?, ?, ?, LOAD_FILE($image), ?)"; 
    if($stmt = $this->conn->prepare($query)) { 
     $stmt->bind_param('sssssi', $title, $summary, $thumbnail_filename, $thumbnail_filesize, $thumbnail_mimetype, $thumbnail_contents, $demo_reel); 
     $stmt->execute(); 
     if($stmt->affected_rows == 1) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
} 

Leider diese Abfrage fehlschlägt, und ich kann nicht alle Fehler scheinen aus ihm heraus zu bekommen. Im Gegensatz dazu ist hier meine aktuelle Abfrage, die funktioniert, aber nicht bereit, Aussagen verwenden, und ist weniger sicher:

$video_filename = $_POST['file_name']; 
    $video_number = $_POST['number']; 
    $title = $_POST['title']; 
    $summary = $_POST['summary']; 
    if(!empty($_POST['demo_reel'])) { 
    $demo_reel = $_POST['demo_reel']; 
    } 
    else { 
    $demo_reel = 0; 
    } 


    $image = $_FILES['thumbnail_file']['tmp_name']; // pass this file name to  
    getimagesize() to determine the mime-type 
    $size_array = getimagesize($image); 
    $thumbnail_mimetype = $size_array['mime']; 
    $thumbnail_filesize = $size_array[3]; 
    $thumbnail_contents = addslashes(file_get_contents($image)); 
    $thumbnail_filename = $_POST['number'] . '.jpg'; 

    $query = "INSERT INTO videos (`video_filename`, `video_number`, 
    `thumbnail_contents`, `title`, `summary`, `demo_reel`, `thumbnail_filename`,  
    `thumbnail_filesize`, `thumbnail_mimetype`) VALUES ('$video_filename', 
    '$video_number', '$thumbnail_contents', '$title', '$summary', '$demo_reel', 
    '$thumbnail_filename', '$thumbnail_filesize', '$thumbnail_mimetype')"; 

    if($result = $this->conn->query($query)) {   
    return true; 
    } 
    else { 
    return false; 
    } 

Wie alle Details zur Zeit unescaped sind, und ich würde lieber nicht gehen durch den Prozess der Verwendung nl2br() und wieder zurück, ich denke an zwei Abfragen: eine mit vorbereiteten Anweisungen für die Variablen $ _POST, und eine andere mit addslashes() und regulären Anweisungen für die Datei. Ich möchte in der Lage sein, die gesamte Einfügung in einer vorbereiteten Aussage zu machen. Jede Hilfe und Verständnis wird sehr geschätzt!

+0

LOAD_FILE() bedeutet, dass Ihre PHP-Server und MySQL-Server auf der gleichen Maschine sind, und dass MySQL Zugriff auf die tmp Lage, wo PHP die Datei geschrieben hat . Ist das das Setup, das du hast? – VoteyDisciple

+0

Vielen Dank für Ihren Kommentar! Ja, mir wurde von meinem Gastgeber gesagt, dass dies das Setup ist, das ich momentan habe. –

Antwort

0

Was Sie brauchen, ist MySQLi send_long_data:

$stmt = $mysqli->prepare("INSERT INTO images (image) VALUES(?)"); 
//initialize the statement 
$null = NULL; 
$stmt->bind_param("b", $null); 
//bind an empty blob dummy 
$stmt->send_long_data(0, file_get_contents("osaka.jpg")); 
//send the actual data (0 is the index of the parameter to fill with the data) 
$stmt->execute();