php mysql 圖像_將圖像插入MySQL并使用PHP檢索圖像

此文可能比較繁瑣,有更好的方法,但是出于教程目的,這是我的"“最佳實踐”的路線。

今天,我們將討論一個似乎每個人都有些困惑的話題……在MySQL中存儲BLOB圖像,然后使用PHP再次顯示它們。盡管始終建議不要這樣做,但我先展示一些演示代碼,說明如何實現此目標,并討論為什么/為什么不這樣做。然后,討論一些替代方案,以及為什么與直接將圖像直接存儲到數據庫相比。

因此BLOB或“Binary Large Objects”是數據庫中用于存儲原始二進制數據的字段。這些數據可能代表圖片,文件或二進制格式的文本。由于這些類型的對象相當大(甚至可能是千兆字節大小),因此該字段旨在容納大量信息。我們如何在PHP中使用這些字段來插入個人資料圖片?

1、我們必須將圖像讀取為二進制。

2、我們必須準備將其插入數據庫(轉義)。

3、我們使用典型的SQL將其插入數據庫中

對于我們的示例,我們將使用三步過程...

1、設置文檔的內容類型以使其與圖片類型相匹配(對于jpg圖片,圖像/ jpeg)

2、在數據庫中找到圖像并將其拔出

3、顯示它

//圖片由表單提交。打開它進行閱讀(模式“ r”)

$ fp = fopen($ _ FILES ['file_name'] ['tmp_name'],“ r”);

//如果成功,則使用文件大小(以字節為單位)作為長度從文件指針讀取。 如果($ fp){

$ content = fread($ fp,$ _FILES ['file_name'] ['size']);

fclose($ fp);

//在內容中添加斜杠,以便轉義特殊字符。 //如前所述,在這里也可以使用mysql_real_escape_string。你的選擇。 $ content =加號($ content);

//將我們的二進制數據字符串(“內容”)插入到“圖像”列的表“表”中 mysql_query(“插入表(image)值('$ content')”);

}

在這里,我們打開文件進行讀取并將圖像讀取到變量中。對該fread()的調用正在讀取圖像的字節,因此我們為其指定了圖像文件的字節長度。可以使用“ size”鍵從$ _FILES數組中獲得。一旦將其包含在變量中,只需將其插入表中“ BLOB”類型的列中即可。在我們的示例中,“圖像”列是“ BLOB”數據類型。確保您在MySQL中選擇的BLOB也足夠大以容納數據,因為MySQL確實具有不同大小的BLOB數據類型。

//讀取我們要從數據庫中提取的行。

$ result = mysql_query(“從ID = 1的表中選擇圖像”);

//如果成功,則以行的形式獲取該行,并將“ image”列中的數據存儲到變量中。如果($ result){

如果($ row = mysql_fetch_array($ result)){

$ img = $ row [“ image”];

}

}

//將此頁面的內容類型設置為image / jpeg,因為我們要拉出的圖像是jpg圖像。header(“ Content-type:image / jpeg”);

//回顯圖像。回顯“ $ img”;

在這里,我們使用行的ID查找所需的圖像。然后,我們從“圖像”列中提取數據,并將其放入一個變量中,我們將在一秒鐘內回顯該變量。在將頁面的標題設置為image / jpeg的內容類型之后,我們可以從變量中回顯二進制數據。

現在請記住,

在header()調用之前無法打印任何內容。如果這樣做,即使打印一個空格,它也會刷新標題并在您嘗試再次調用header()時導致錯誤。注意:錯誤將與“標題已發送”類似。

此過程與也具有Blob字段的其他數據庫非常相似。這里的想法是,我們要獲取一個二進制對象,將其作為轉義的字符串插入,讀回并以告訴瀏覽器我們正在顯示圖像數據的內容類型進行顯示。

那么為什么我們不應該將圖像存儲到這樣的數據庫中呢?數據庫(尤其是MySQL)非常適合快速查找數據和短數據塊。數據庫通常會獲取這些數據并將其分解為可快速在磁盤上定位的頁面。像BLOB這樣的大字段確實使數據庫膨脹,并且我們平時也會享受到了它的優勢,例如在搜索中使用文件名。但!使用大量二進制數據來膨脹數據庫可能會降低查詢速度,因為然后數據庫被迫(可能)讀取2 GB的BLOB以便進行顯示。所以當然不能這么做。

解決方案:

將大型文件作為二進制文件存儲在數據庫中,保持數據庫的精簡并在數據庫中存儲文件的路徑.

可以將其視為指向對象的指針。如果需要顯示圖像,則可以在數據庫中查找該字段,獲取文件路徑,然后使用該路徑從磁盤上定位圖片以進行顯示。這給您帶來兩個好處:1、將數據庫必須管理的數據保持在最低限度(又稱其占用空間); 2、使用文件路徑,我們可以使用查詢來搜索它,以按文件名查找文件。

那么,為什么要有BLOB字段呢?如果您的圖像很小(例如圖標),則該字段可能是一件好事。我也不建議在數據庫中使用大量圖標,但是可以在不引起過多性能噩夢的情況下使用一小塊二進制數據。但是將數據庫留給文件系統管理簡單的快速數據片段和大文件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530346.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530346.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530346.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用Maven逆向工程生成mybatis映射文件

一&#xff0c;pom.xml 注意修改逆向工程配置文件的路徑 <build><pluginManagement><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1…

mysql update多個表_mysql update 多表 (復制)

定我們有兩張表&#xff0c;一張表為Product表存放產品信息&#xff0c;其中有產品價格列Price&#xff1b;另外一張表是ProductPrice表&#xff0c;我們要將ProductPrice表中的價格字段Price更新為Price表中價格字段的80%。在Mysql中我們有幾種手段可以做到這一點&#xff0c;…

ORA-00907:missing right parenthesis缺少右括號

一&#xff0c;有嵌套查詢&#xff0c;并且子查詢中用了union all合并兩個查詢時&#xff0c;前一個查詢用了order by&#xff0c;那么會報錯并提示ORA-00907:missing right parenthesis缺少右括號&#xff1a; select * from ( select t.* from emp t where t.jobMANAGER ord…

mysql重復記錄大于十的數據庫_面試官:在使用mysql數據庫時,遇到重復數據怎么處理?...

前言前段時間&#xff0c;很多人問我能不能寫一些數據庫的文章&#xff0c;正好自己在測試mysql數據庫性能的時候&#xff0c;出現了一個問題&#xff0c;也就是出現了很多重復的數據&#xff0c;想起來自己long long ago寫過一篇類似的&#xff0c;僅此就拿來總結了一下。如果…

線程組的概念

一&#xff0c;線程組和線程的結構&#xff1a;樹形結構 每個Thread必然存在于一個ThreadGroup中&#xff0c;Thread不能獨立于ThreadGroup存在。 執行main()方法線程的名字是main 如果在new Thread時沒有顯式指定&#xff0c;那么默認將父線程&#xff08;當前執行new Threa…

mysql中ak替換鍵_數據庫:唯一性約束_alternate key(替換鍵) mySQL Oracle 數據庫 ak 唯一性約束...

數據庫:唯一性約束_alternate key(替換鍵) mySQL Oracle 數據庫 ak 唯一性約束數據庫:唯一性約束所謂唯一性約束(unique constraint)不過是數據表內替代鍵的另一個名稱而已。替代鍵(alternate key)可以是數據表內不作為主鍵的其他任何列&#xff0c;只要該鍵對該數據表唯一即可…

Oracle自定義類型

Oracle自定義類型可以通過type/create type來聲明或者創建 一&#xff0c;四種創建方式 1.1&#xff0c;使用create type創建object類型 create or replace type obj_type as object(id number,name varchar2(50 byte),birthday date); 1.2&#xff0c;使用create type創建…

Oracle/mysql查詢語句的執行過程

執行順序 from on join/pivot/unpivot(mysql沒有pivot和unpivot) where group by having select distinct order by limit&#xff08;oralce沒有&#xff09; 書寫順序 select distinct <select_list> from <left_table> <join_type>join <righ…

mysql定時sql腳本_定時執行的SQL腳本

因為要同步一個表&#xff0c;所以每天要同步一次數據&#xff0c;但是對SQL不是精通的我&#xff0c;為了測試寫了一段代碼來測試定時功能創建一個存儲過程&#xff0c;是用來插數據的&#xff0c;沒有輸出和輸出參數create or replace procedure temp_pro asbegininsert into…

mysql xml語句_Mysql語句

xml文件轉義字符處理(1)(2)直接寫轉義后的字符1、mysql里批量修改表內某個字段內的部分數據UPDATE inventory_stockSET batchno REPLACE(batchno,-20-201901,-50-2019)2、ON DUPLICATE KEY UPDATE根據主鍵判斷是新增還是修改(也可以有兩個或多個主鍵)INSERT INTO TABLE (a,c) …

destoon網站mysql分表_destoon : 常用數據庫操作

destoon在初始化系統后系統會自動連接數據庫&#xff0c;并將數據庫操作對象保存在$db。對于數據庫操作方法參考include/db_mysql.class.php函數原型&#xff0c;我來寫幾個常用數據庫操作。1、讀取單條信息$S $db->get_one("SELECT * FROM {$DT_PRE}table WHERE xxxy…

delphi7 mysql控件_Delphi7連接MySql數據庫-DBGrid控件顯示數據

一個簡單的Delphi7小程序&#xff0c;使用MySql數據庫做簡單查詢&#xff0c;用DBGrid控件顯示結果&#xff0c;實現過程如下&#xff1a;(1)在MySql中新建demouser表&#xff0c;插入記錄用于測試。(2)在Delphi7中新建項目。(3)在From中添加組件。組件Panel&#xff1a;pnl1組…

for循環false 終止 python_python3.5.1給用戶3次無效的嘗試,然后終止pgm(Simple FOR循環)...

我需要幫助(新生-2周)。我想得到這段代碼可能的最微小的變化&#xff0c;允許用戶3次在程序中輸入錯誤的值。輸入錯誤值3次后&#xff0c;程序應終止。唯一的要求是代碼必須包含FOR循環。我不知道它是需要一個FOR循環還是3個FOR循環(每次轉換一個)。我嘗試了很多種方案&#xf…

mysql何時會走索引

訪問類型&#xff0c;這里只列出最常見的6種類型 all,index,range,ref,eq_ref&#xff0c;const mysql中explain的type的解釋_dennis211的博客-CSDN博客_explain type 使用不同的運算符時訪問類型不一樣&#xff1a; !、not in、<>、>、<、in(多個值)、or、bet…

mysql數據庫唯一性_在MySQL數據庫中添加唯一性約束,范圍可能嗎?

我有一個使用MySQL的Rails應用程序。我在兩個模型之間有一個has_many :through關聯&#xff0c;如下所述&#xff1a;class Category < ActiveRecord::Basehas_many :category_pairingshas_many :dishes, through: :category_pairings, :inverse_of > :categoriesendclas…

filtic函數 matlab_matlab filtic 函數應用 filter 解差分方程 dft 函數

matlab filtic 函數應用 filter 解差分方程 dft 函數一、 解差分方程說明都在代碼注釋里面了%這里要利用filtic函數 為濾波器的直接II型實現選擇初始條件%求解查分方程 y(n) - 0.4y(n-1) - 0.45y(n-2) 0.45x(n) 0.4x(n-1) - x(n-2)%y(-1) 0 y(-2) 1 x(-1) 1 x(-2) 2%x(n)…

rabbitmq進階一

上一篇文章有講到rabbitmq的安裝、web管理端和springboot簡單集成rabbitmq 本文重點介紹rabbitmq相關api的使用 按照官網常用的五種模式的順序&#xff1a;HelloWorld、Work queues、Publish/Subscribe、Routing、Topics 模式簡單介紹 HelloWorld 一個生產者&#xff0c;一…

mysql 相關搜索_MySQL單詞搜索相關度排名

一個單詞搜索的相關度排名,這個例子演示了一個單詞搜索的相關度排名計算。mysql> CREATE TABLE articles (-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,-> title VARCHAR(200),-> body TEXT,-> FULLTEXT (title,body)-> ) ENGINEInnoDB;Query O…

IDEA使用總結

idea中使用tomcat IntelliJ IDEA配置Tomcat&#xff08;完整版圖文教程&#xff09;_猿Bug的博客-CSDN博客_intellij tomcat配置 用上面的方式發現缺少文件&#xff0c;在edit configuration頁面選擇before lanuch前選擇Run maven goal package

mysql一直copying to tmp table_mysql提示Copying to tmp table on disk

網站運行的慢了&#xff0c;查找原因是Copying to tmp table on disk那怎么解決這個問題呢解決一例最近常常碰到網站慢的情況&#xff0c;登陸到后臺&#xff0c;查詢一下 /opt/mysql/bin/mysqladmin processlist;發現一個查詢狀態為&#xff1a; Copying to tmp table 而且此查…