MySQL PHP Blob 101
MySQL PHP Blob是一個(gè)能夠保存二進(jìn)制數(shù)據(jù)的數(shù)據(jù)類(lèi)型,二進(jìn)制數(shù)據(jù)指的是不僅限于文本,還包括圖像、聲音、視頻等媒體類(lèi)型的數(shù)據(jù)。
比如有一張照片需要保存在MySQL數(shù)據(jù)庫(kù)中,那么可以將該照片轉(zhuǎn)碼成二進(jìn)制數(shù)據(jù),然后保存在Blob類(lèi)型的字段中。
//創(chuàng)建表格,字段格式BLOB
CREATE TABLE images(
id INT(11) AUTO_INCREMENT PRIMARY KEY,
image_name VARCHAR(50),
image_data BLOB
);
//實(shí)現(xiàn)圖片上傳
if($_FILES["image"]["error"] >0){
echo "文件上傳出錯(cuò)";
}
else{
$image_data = file_get_contents($_FILES["image"]["tmp_name"]);
$image_name = $_FILES["image"]["name"];
$sql = "INSERT INTO images(image_name, image_data) VALUES('".$image_name."', '".$image_data."')";
}
Blob類(lèi)型的字段可以包含很大的二進(jìn)制數(shù)據(jù),同時(shí)需要注意的是,插入或者更新Blob類(lèi)型的字段,需要使用prepared statements來(lái)防止SQL注入攻擊。
//使用prepared statements插入blob類(lèi)型的字段
$stmt = $conn->prepare("INSERT INTO images(image_name, image_data) VALUES (?, ?)");
$stmt->bind_param("sb", $image_name, $image_data);
$stmt->execute();
與Blob類(lèi)型相關(guān)的一個(gè)常見(jiàn)問(wèn)題是,如何從數(shù)據(jù)庫(kù)中讀取二進(jìn)制數(shù)據(jù)并顯示呢?答案是,使用php的header()函數(shù)將數(shù)據(jù)內(nèi)容以二進(jìn)制方式輸出,并且確保輸出前沒(méi)有其他內(nèi)容。
//讀取Blob類(lèi)型的字段并顯示
$sql = "SELECT image_data FROM images WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows >0){
$row = $result->fetch_assoc();
header('Content-type:image/jpeg');
echo $row['image_data'];
}
總結(jié)一下,MySQL PHP Blob類(lèi)型的字段,可以方便地存儲(chǔ)二進(jìn)制數(shù)據(jù),比如圖像、聲音、視頻等媒體類(lèi)型的數(shù)據(jù)。然而,對(duì)Blob類(lèi)型字段的操作需要使用prepared statements來(lái)防止SQL注入攻擊,同時(shí)在讀取二進(jìn)制數(shù)據(jù)時(shí)需要使用php的header()函數(shù)將數(shù)據(jù)以二進(jìn)制方式輸出。