<?php
$conn = mysqli_connect("localhost","root","root","world");
$conn->query("CREATE TABLE files(id INTEGER PRIMARY KEY AUTO_INCREMENT, data BLOB)");
$stmt = $conn->prepare("INSERT INTO files VALUES(NULL, ?)");
$stmt->bind_param("b", $data);
$file = "test.jpg";
$fp = fopen($file, "r");
$size = 0;
while($data = fread($fp, 1024)){
$size += strlen($data);
$stmt->send_long_data(0, $data);
}
if($stmt->execute()){
print "$file ($size bytes) was added to the files table\n";
} else {
die($conn->error);
}
运行效果:
数据库的变化:
由于BLOB是二进制数据,只能看到对应行列中的<BLOB>标记,MySQL-Front中如果是图像在下方会有预览,读取这类数据将在下一篇中说明.
注意:send_long_data的原型如下,为什么第1个参数为0,请自已看文档:
$param_nr指示出右边第几个参数和数据相关联,参数从0开始编号
/**
* Send data in blocks
* @link http://php.net/manual/en/mysqli-stmt.send-long-data.php
* @param int $param_nr <p>
* Indicates which parameter to associate the data with. Parameters are
* numbered beginning with 0.
* </p>
* @param string $data <p>
* A string containing data to be sent.
* </p>
* @return bool true on success or false on failure.
* @since 5.0
*/
public function send_long_data ($param_nr, $data) {}
需要注意的地方是bind_param("b", $data)中,由于是要存blob数据,第1参数要写b,这个书中有误.书中是s,实测存不进去,改为b以后可以存上.