簡體   English   中英

使用PHP和PDO從MySQL檢索MEDIUMBLOB失敗

[英]Retrieving MEDIUMBLOB from MySQL with PHP and PDO fails

我將圖像數據存儲在圖像表的MEDIUMBLOB列中,看起來像這樣:

CREATE TABLE IF NOT EXISTS `images` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `description` varchar(160) DEFAULT NULL,
  `image` mediumblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

我有images.php接收腳本id的圖像顯示,呼吁應該接收圖像的API id paramater(其中包括對這個問題不相關的其他東西),並從返回二進制字符串image列到images.php腳本應該顯示它。

這是API(實際上是imageController)的一部分,它從db獲取圖像數據,將其加載到我的Image類,該類根據前幾個字節簽名確定圖像類型並返回對應的mime-type。

        $pdo = Database::getPDO($db);
        $select_image_statement = $pdo->prepare(
            "SELECT image FROM images WHERE id = :id"
        );
        $select_image_statement->bindParam(":id", $image_id);
        $select_image_statement->execute();

        $select_image_statement->bindColumn(1, $img, PDO::PARAM_LOB);

        $select_image_statement->fetch(PDO::FETCH_BOUND);

        $image = new Image();
        $image->load($img);

        $return = array(
            'image' => $img,
            'mime_type' => $image->getMimeType()
        );

        return $return;

問題是,當我使用error_log($img)輸出它時, $img綁定變量總是包含˙Ř˙ŕ序列,當我從image.php腳本中echo image.php (沒有header() )時,我得到的是空白頁,也為empty()返回1,所以我猜想給定空輸入字符串時, ˙Ř˙ŕ序列只是error_log的某些奇怪行為(至少對我而言)。

直接從API將empty($img)isset($img)count($img)返回到image.php並將其輸出都可以正常工作,因此在傳輸圖像數據時可能不會出現任何錯誤。

我正在獲取沒有其他問題或錯誤的行(其他列按預期工作)。

另外,當我單擊phpMyAdmin的BLOB列時,它顯示已存儲的圖像沒有問題或錯誤,因此圖像被完全存儲,唯一的問題可能是從db檢索它時。 我還檢查了MySQL配置中的最大允許數據包,它設置為16,777,216,這應該足夠了,因為我的圖像最大為5 MB(我要檢索的圖像約為100 kB)

我花了大約6個小時來嘗試修復它,並瀏覽類似的問題,閱讀PHP文檔和我使用的每個PDO方法的用戶注釋,並嘗試了所有建議的方法來限制列,不同的提取選項等等,但是沒有一個解決了我的問題。 我嘗試以這種方式http://php.net/manual/en/pdo.lobs.php#96311和“官方”方式http://php.net/manual/en/pdo.lobs.php (使用流) ),但在我的情況下都不起作用,並且在兩種情況下$img為空。 我也嘗試過像這樣在這里進行連接,就像在這里的類似問題中所建議的那樣

$dbh = new PDO("mysql:host={$db['host']};dbname={$db['name']}", $db['user'], $db['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

並且沒有SET NAMES命令,這兩個命令都不會對我的問題產生任何影響。

我很拼命,我不知道該怎么辦了,這已經很晚了,所以我現在要睡覺了,我衷心希望我能夢想一個解決方案,或者至少你們中的一些人會知道出什么問題然后寫幫我個忙,或分享一個有用的鏈接:)

PS我知道將圖像存儲在db中似乎並不是一個好主意,但是我決定這樣做是因為我在這個項目上有一個緊迫的截止日期,而且我對文件系統的方式並不了解,因此我認為使用db方法將節省一些時間。 我當然沒有節省時間:)

PDO處理LOB似乎有一個錯誤: https : //bugs.php.net/bug.php? id =40913 該錯誤在撰寫本文時仍懸而未決。

我對您的建議有類似的問題,請執行以下操作:

第一次嘗試:當您將圖像保存在數據庫中以使用base64_encode將其轉換為十六進制時。 要顯示圖像, 在生成圖像之前使用base64_decode執行相反的操作。

如果失敗,則可以嘗試以下操作:打開文件。 記事本++中的 “ PHP”,轉到格式->轉換為UTF-8(無BOM)

由於某些原因,使用UTF-8(帶有BOM)格式化文件會生成無效字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM