2016-11-09 12 views
0

画像をアップロードしてBLOBとしてデータベースに格納しようとすると、PDOBで挿入するときにBlobが常に1Bを挿入する

私が使用するコードは別のテーブルに挿入するときに完全に機能するので、基本的には別の挿入クエリのコードを使用しました。

これはPHPです:

<?php 
error_reporting(-1); 
if (isset($_POST['gallery-upload'])) { 
    $hostname='**'; 
    $username='**'; 
    $password='**'; 
    $file = $_FILES['image'] ['tmp_name']; 
    $tmpName = $_FILES['image']['tmp_name']; 
    $filter = $_POST['filter']; 

    $fp = fopen($tmpName, 'rb'); 

    try { 
     $dbh = new PDO("mysql:host=$hostname;dbname=dddoecje_campu",$username,$password); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // <== add this line 
     $stmt = $dbh->prepare("INSERT INTO `gallery`(`id`, `image`, `filter`) VALUES ('',:image,:filter)"); 
     $stmt->bindParam(':filter', $filter); 
     $stmt->bindParam(':image', $fp, PDO::PARAM_LOB); 
     $dbh->errorInfo(); 
     $stmt->execute(); 
     // use exec() because no results are returned 
     header("Location: index.php"); 

    } 
    catch(PDOException $e) 
    { 
     echo $sql . "<br>" . $e->getMessage(); 
    } 

    $dbh = null; 
} 
?> 

そして、これは形式です:

<div class="col-md-4"> 
    <div class="panel panel-default"> 
     <div class="panel-body"> 
      <form action="upload-gallery.php" method="post" enctype="multipart/form-data"> 
     <div class="form-group"> 
      <i class="icon-cloud-upload"></i> 
      <span>Select file</span> 
      <input type="file" accept="image/png, image/jpeg, image/gif" data-max-size="5000" name="image"> 
     </div> 
       <select name="filter"> 
        <option value="all">All</option> 
        <option value="area">Area</option> 
        <option value="resort">Resort</option> 
        <option value="rinjani">Rinjani</option> 
       </select> 
       <button style="margin-top: 10px;" name="gallery-upload" class="btn btn-default"><?php echo $upload_gallery;?></button> 
     </form> 
     </div> 
    </div> 
</div> 

これは私が画像を挿入した後、私は、データベースに見えるものです:

enter image description here

すべてが正常に挿入されていますが、一部のrではBLOBだけが挿入されませんeason。また、data-max-sizeがなければ動作しません。

+1

あなたのタイトルは「挿入1B」と読みますが、それは1バイトで何を意味しますか?アップロードしようとしているファイルのサイズはどれくらいですか?それが処理できる列のタイプ/サイズは何ですか? –

+1

'$ file = $ _FILES ['image'] ['tmp_name'];は' $ file = $ _FILES ['image'] ['name']; 'でなければなりません。既に$ tmpName = $ _FILES ['image'] ['tmp_name']; 'というtmp宣言があります。あなたは '$ stmt-> bindParam( ':image'、$ file、PDO :: PARAM_LOB);'このコメントでも試しましたか?私がここで言ったことはうまくいくはずです。 –

+0

あなたの最初の答えは、編集を確認してください。あなたの2番目の答えは、そこに置いたものを試してもうまくいかなかった – Rik

答えて

-1

ファイルを指すファイルハンドラを開き、ファイルハンドラをパラメータとして渡しています。

ファイルハンドラが参照する内容全体を変数に読み込み、その変数をプリペアドステートメントに渡すようにしてください。これを行うには、fgets()コマンドを使用します。

私はこの回答を携帯電話に書いているので、私はあなたに簡単にそれを表示することはできません。

  1. オープン(あなたがやった)ファイル
  2. (FEOF($ FP)!)一方で、変数 にファイルを読む {$のVAR = fgetsの($ FP);}
+0

LOBを挿入すると、ファイルポインタをバインドするだけで、PDOはそれを読み込みます。自分でファイル全体を読む必要はありません。 –

+0

@jonathan私がこの答えを出したのは、彼のコードがデータを正常に挿入できなかった場合、提案された方法は、その特定のファイルに関連していると仮定して彼の問題を解決できる別の方法として役立ちますストリーム。 –

関連する問題