php 图片 byte数组,php – 将图像存储在PostgreSQL数据库的bytea字段中
TL; DR:
刪除addslashes($data).這里多余.
雙重逃避..兩次
$data=fread($p,filesize($fi));
$data=addslashes($data);
$dat= pg_escape_bytea($data);
您讀取數據,將其轉義為字符串文字,然后將其轉換為bytea八進制或十六進制轉義.即使pg_escape_bytea是理智的,它也不會那樣,但事實并非如此.
PHP的pg_escape_bytea似乎雙重轉義輸出,因此可以將其插入到字符串文字中.這非常難看,但似乎沒有一個替代方法不會進行雙重轉義,所以你似乎無法在PHP中使用參數化語句來實現bytea.你還應該為其他一切做到這一點.
在這種情況下,只需刪除從文件讀入的數據的addslashes行就足夠了.
測試用例顯示pg_escape_bytea雙重轉義(并且總是使用舊的,低效的八進制轉義):
# oh-the-horror.php
print pg_escape_bytea("Blah binary\x00\x01\x02\x03\x04 blah");
?>
跑:
php oh-the-horror.php
結果:
Blah binary\\000\\001\\002\\003\\004 blah
看到加倍的反斜杠?那是因為它假設你要將它作為一個字符串插入到SQL中,這是一個非常低效,丑陋和非常糟糕的習慣.但是你似乎沒有任何其他選擇.
除此之外,這意味著:
pg_unescape_bytea(pg_escape_bytea("\x01\x02\x03"));
…產生錯誤的結果,因為pg_unescape_bytea實際上與pg_escape_bytea不相反.它也使得無法將pg_escape_bytea的輸出作為參數提供給pg_query_params,你必須將其插入.
解碼
如果你使用的是現代的PostgreSQL,它可能會默認將bytea_output設置為十六進制.這意味著如果我將數據寫入bytea字段然后將其取回,它將看起來像這樣:
craig=> CREATE TABLE byteademo(x bytea);
CREATE TABLE
craig=> INSERT INTO byteademo(x) VALUES ('Blah binary\\000\\001\\002\\003\\004 blah');
INSERT 0 1
craig=> SELECT * FROM byteademo ;
x
----------------------------------------------------------------------------
\x426c61682062696e6172795c3030305c3030315c3030325c3030335c30303420626c6168
(1 row)
“嗯,什么”,你可能會說?這很好,它只是PostgreSQL稍微更緊湊的bytea十六進制表示. pg_unescape_bytea將處理它并產生與輸出相同的原始字節…如果你有一個現代的PHP和libpq.在舊版本中,您將獲得垃圾,并且需要設置bytea_output以逃避pg_unescape_bytea來處理它.
你應該做什么
使用PDO.
它對bytea有理智(ish)支持.
$sth = $pdo->prepare('INSERT INTO mytable(somecol, byteacol) VALUES (:somecol, :byteacol)');
$sth->bindParam(':somecol', 'bork bork bork');
$sth->bindParam(':byteacol', $thebytes, PDO::PARAM_LOB);
$sth->execute();
看到:
您可能還想查看PostgreSQL的lob(大對象)支持,它提供了一個仍然完全事務性的流式可搜索接口.
現在,到我的肥皂盒
如果PHP在“字節字符串”和“文本字符串”類型之間有真正的區別,您甚至不需要pg_escape_bytea,因為數據庫驅動程序可以為您完成.這些丑陋都不是必需的.不幸的是,PHP中沒有單獨的字符串和字節類型.
請盡可能使用PDO和參數化語句.
在你不能的地方,至少使用pg_query_params和參數化語句. PHP的addslashes不是替代品,它效率低,難看,并且不了解數據庫特定的轉義規則.如果你因為icky歷史原因沒有使用PDO,你仍然需要手動轉義bytea,但其他一切都應該通過參數化語句.
有關pg_query_params的指導:
總結
以上是生活随笔為你收集整理的php 图片 byte数组,php – 将图像存储在PostgreSQL数据库的bytea字段中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux18.04循环登陆,ubunt
- 下一篇: 【OpenCV 例程200篇】13. 图