PHP - BLOB没有插入MySQL数据库

时间:2015-12-24 21:14:55

标签: php mysql blob

我试图创建一个页面,有人可以上传文档或图像,然后将其存储在MySQL数据库中,但由于某种原因,文档/图像的内容实际上并不存在插入我创建的表中。奇怪的是,表格中的其他列已经填充,它只是一个fatal error: unexpectedly found nil while unwrapping an Optional value (lldb) 列不是。

以下是表单的HTML代码:

LONGBLOB

我相信我的表单是正确的,并确保存在具有最大值的隐藏字段并且编码正确。

这是处理表单POST的PHP代码:

<form method="post" enctype="multipart/form-data">
        <input type="submit" value="Submit" />
        <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
        <label>Select Event:</label>
           <select name="eventID">
              <?php
                 foreach($data as $e)
                 {
                     echo "<option value='" . $e["eventID"] . "'>" . $e["name"] . "</option>";
                 }
              ?>
          </select>

          <label>Your ID:</label>

          <input name="contributorID" type="number" min="0" />

          <label>Your Abstract:</label>

          <textarea name="abstract" rows="10" cols="50"></textarea>

          <label>Attachment:</label>

          <input type="file" name="attachment" />

</form>

$abstract = $this->model("Abstracts"); if (!empty($_FILES["attachment"]) && ($_FILES["attachment"]["error"] == 0)) { $fileName = $_FILES["attachment"]['name']; $tmpName = $_FILES["attachment"]['tmp_name']; $fileSize = $_FILES["attachment"]['size']; $fileType = $_FILES["attachment"]['type']; //$fp = fopen($tmpName, 'r'); $content = file_get_contents($tmpName); $content = addslashes($content); //fclose($fp); if(!get_magic_quotes_gpc()) { $fileName = addslashes($fileName); } $abstract->insertAbstract($_POST["contributorID"], $_POST["eventID"], $_POST["abstract"], $content, $fileName, $fileType, $fileSize); } 类的insertAbstract方法:

Abstracts

存储过程背后的SQL:

public function insertAbstract($contributorID, $eventID, $abstract, $attachment = null, $name = null, $type = null, $size = null)
{
    $conn = new Credentials;
    $this->connection = $conn->conn;

    if (!empty($attachment))
    {
        $query = $this->connection->prepare("CALL sp_PopulateAbstractAttachments(?,?,?,?,?)");
        $query->bind_param("ibssi", $abstractID, $attachment, $name, $type, $size);

        $query->execute();

        $query->close();
    }

    mysqli_close($this->connection);
}

行插入了正确的CREATE PROC... (abID INT, att LONGBLOB, n VARCHAR(500), t VARCHAR(30), s INT) BEGIN DELETE FROM abstractattachments WHERE abstractID = abID; INSERT INTO abstractattachments (abstractID, attachment, name, type, size) VALUES (abID, att, n, t, s); END abIDnt,但s似乎并不存在。在phpMyAdmin中,该值在表中只是空的。如果我错了,请纠正我,但不应该显示价值吗?只是要仔细检查我是否正确,我创建了一个脚本来下载文件,但是当我打开文件时,它会显示为空文件。

这是脚本:

attn

我迷失在这里,所以任何指导都会受到欢迎。我试图尽可能地压缩代码。

2 个答案:

答案 0 :(得分:0)

我不擅长使用sql程序,在mysql数据库中创建表后尝试以下代码,它会起作用 。如果能真正解决您的问题,请将此标记为正确答案...

SQL

editText.requestFocus()

HTML

create table customer_account (photo_id int(55) primary key auto_increment,photo longblob,name varchar(88),account_no integer(86),address varchar(72),email varchar(45));

upload.php的

<html>
  <body>
    <font color=green size=4>upload Passport Photograph of aCustomer<BR>
    Using PHP Uploads Technology</font></b><br>     
    <form method="post" action="upload.php"  enctype="multipart/form-data">
      <table class="main">
        <tr>
          <td class="header" colspan="2">General Account Opening Form Along with Passport Photograph of the Customer<BR>
            Using PHP Uploads Technology
          </td>
        </tr> 
        <tr>
          <td>Photo</td>
          <td><input type="file" name="photo_upload" class="long"></td>
        </tr>
        <tr>
          <td>Name</td>
          <td><input type="text" name="name" class="long"></td>
        </tr>
        <tr>
          <td>Account Number</td>
          <td><input type="text" name="account_no" class="long"></td>
        </tr>
        <tr>
          <td>Address</td>
          <td><input name="address" type="text"></td>
        <tr>
           <td>Email</td>
            <td><input name="email" type="TEXT"></td>
        </tr>
        <tr>
          <td colspan="2"><input type="submit" value="Register!" /></td>
        </tr>
      </table>
    </form>
  </body> 
</html> 

答案 1 :(得分:0)

首先,使用addslashes()可能会损坏您存储的文件。你不想这样做,因为the parameterized query takes care of escaping

  

绑定变量与查询分开发送到服务器,因此不会干扰它。在解析语句模板之后,服务器直接在执行点使用这些值。 绑定参数不需要进行转义,因为它们永远不会直接替换为查询字符串。必须为服务器提供绑定变量类型的提示,以创建适当的转换。

我们在评论中发现的另一个问题是,您的数据库未配置为允许将大型参数传递给它。您可以尝试使用send_long_data()以较小的块将参数传递给数据库。

    $query = $this->connection->prepare("CALL sp_PopulateAbstractAttachments(?,?,?,?,?)");
    $query->bind_param("ibssi", $abstractID, null, $name, $type, $size);
    foreach (str_split($attachment, 10240) as $chunk) {
        $query->send_long_data(1, $chunk);
    }
    $query->execute();
    $query->close();

(完全披露,我之前从未使用过send_long_data()。我总是将文件存储在文件系统中,并建议同样做!)

最后,您执行的每个数据库功能 - 打开连接,准备语句,绑定参数和执行语句 - 都应该具有结果checked for errors。即使没有错误,MySQL仍然可以生成non-fatal warnings,这可能导致未插入错误值等内容。