2016-11-09 39 views
0

当我尝试上传图片并将其作为BLOB放入数据库时​​。Blob在插入PDO时始终插入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

一切都插入正常,但只有BLOB不插入一些r陈奕迅。也没有data-max-size它不起作用。

+1

您的标题显示为“insert 1B”,那么您的意思是什么,1个字节?以及您尝试上传的文件有多大以及它可以处理的列的类型/大小是多少? –

+1

也''文件= $ _FILES ['image'] ['tmp_name'];'应该是'$ file = $ _FILES ['image'] ['name'];'。你已经有了你的tmp声明'$ tmpName = $ _FILES ['image'] ['tmp_name'];'。你尝试过'$ stmt-> bindParam(':image',$ file,PDO :: PARAM_LOB);'还有这个评论吗?我在这里说的应该工作。 –

+0

为了您的第一个答案,请检查编辑。对于你的第二个答案,试着你放在那里,没有工作 – Rik

回答

-1

您已打开指向您的文件的文件处理程序,并将文件处理程序作为参数传递。

尝试将您的文件处理程序引用的完整内容读入一个变量,并将该变量传递给准备的语句。你可以通过使用fgets()命令来做到这一点。

因为我在手机上写下这个答案,所以我不能很容易地告诉你该怎么做。

  1. 打开文件(你所做的)
  2. 文件读入到一个变量 虽然(FEOF($ FP)!) {$ VAR =与fgets($ FP);}
+0

插入LOB时,只需绑定一个文件指针,PDO将从中读取。你不需要自己阅读整个文件。 –

+0

@jonathan我在这里回答的是,在他的代码未能成功插入数据的情况下,所提出的方法可以作为他可以解决他的问题的替代方法,假设它与该特定文件有关流。 –