2009-08-11 9 views
0

これは密集した質問ですが、お詫び申し上げますが、イメージBLOBをアップロードするためにMYSQL LOAD_FILE()をプリペアドステートメントとともに使用するのに少し問題があります。その結果、私は、クエリを分離するために使用することに頼る必要があります。一つは詳細のための文を準備し、もう一つはBLOBを挿入するための文を準備しません。ここで私が試したクエリの例です: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; 
     } 
    } 
} 

残念ながら、このクエリは失敗し、私はそれのうちいずれかのエラーを取得するように見えることはできません。逆に、ここで働く私の現在のクエリでは、ですが、プリペアドステートメントを使用していない、とあまり安全である:すべての詳細は、現在エスケープされたよう

$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; 
    } 

、と私はむしろ使用のプロセスを経るないだろうnl2br()ともう一度、私は2つのクエリを考えています:1つは$ _POST変数にプリペアドステートメントを使用し、もう1つはaddslashes()とファイルの通常のステートメントを使用します。私は1つの準備されたステートメントでインサート全体を実行できるようにしたいと思います。どんな助けと理解も大歓迎です!あなたが必要なもの

+0

LOAD_FILE()あなたのPHPサーバとMySQLサーバが同じマシン上にあることを意味し、MySQLはPHPがファイルを書いたTMPの場所へのアクセス権を持っていること。それはあなたが持っているセットアップですか? – VoteyDisciple

+0

コメントありがとうございます!はい、私は私が現在持っているセットアップであることをホストから聞いてきました。 –

答えて

0

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(); 
関連する問題