日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php 图片 byte数组,php – 将图像存储在PostgreSQL数据库的bytea字段中

發(fā)布時間:2025/3/15 php 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 图片 byte数组,php – 将图像存储在PostgreSQL数据库的bytea字段中 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

TL; DR:

刪除addslashes($data).這里多余.

雙重逃避..兩次

$data=fread($p,filesize($fi));

$data=addslashes($data);

$dat= pg_escape_bytea($data);

您讀取數(shù)據(jù),將其轉(zhuǎn)義為字符串文字,然后將其轉(zhuǎn)換為bytea八進制或十六進制轉(zhuǎn)義.即使pg_escape_bytea是理智的,它也不會那樣,但事實并非如此.

PHP的pg_escape_bytea似乎雙重轉(zhuǎn)義輸出,因此可以將其插入到字符串文字中.這非常難看,但似乎沒有一個替代方法不會進行雙重轉(zhuǎn)義,所以你似乎無法在PHP中使用參數(shù)化語句來實現(xiàn)bytea.你還應(yīng)該為其他一切做到這一點.

在這種情況下,只需刪除從文件讀入的數(shù)據(jù)的addslashes行就足夠了.

測試用例顯示pg_escape_bytea雙重轉(zhuǎn)義(并且總是使用舊的,低效的八進制轉(zhuǎn)義):

# oh-the-horror.php

print pg_escape_bytea("Blah binary\x00\x01\x02\x03\x04 blah");

?>

跑:

php oh-the-horror.php

結(jié)果:

Blah binary\\000\\001\\002\\003\\004 blah

看到加倍的反斜杠?那是因為它假設(shè)你要將它作為一個字符串插入到SQL中,這是一個非常低效,丑陋和非常糟糕的習(xí)慣.但是你似乎沒有任何其他選擇.

除此之外,這意味著:

pg_unescape_bytea(pg_escape_bytea("\x01\x02\x03"));

…產(chǎn)生錯誤的結(jié)果,因為pg_unescape_bytea實際上與pg_escape_bytea不相反.它也使得無法將pg_escape_bytea的輸出作為參數(shù)提供給pg_query_params,你必須將其插入.

解碼

如果你使用的是現(xiàn)代的PostgreSQL,它可能會默認(rèn)將bytea_output設(shè)置為十六進制.這意味著如果我將數(shù)據(jù)寫入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將處理它并產(chǎn)生與輸出相同的原始字節(jié)…如果你有一個現(xiàn)代的PHP和libpq.在舊版本中,您將獲得垃圾,并且需要設(shè)置bytea_output以逃避pg_unescape_bytea來處理它.

你應(yīng)該做什么

使用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(大對象)支持,它提供了一個仍然完全事務(wù)性的流式可搜索接口.

現(xiàn)在,到我的肥皂盒

如果PHP在“字節(jié)字符串”和“文本字符串”類型之間有真正的區(qū)別,您甚至不需要pg_escape_bytea,因為數(shù)據(jù)庫驅(qū)動程序可以為您完成.這些丑陋都不是必需的.不幸的是,PHP中沒有單獨的字符串和字節(jié)類型.

請盡可能使用PDO和參數(shù)化語句.

在你不能的地方,至少使用pg_query_params和參數(shù)化語句. PHP的addslashes不是替代品,它效率低,難看,并且不了解數(shù)據(jù)庫特定的轉(zhuǎn)義規(guī)則.如果你因為icky歷史原因沒有使用PDO,你仍然需要手動轉(zhuǎn)義bytea,但其他一切都應(yīng)該通過參數(shù)化語句.

有關(guān)pg_query_params的指導(dǎo):

總結(jié)

以上是生活随笔為你收集整理的php 图片 byte数组,php – 将图像存储在PostgreSQL数据库的bytea字段中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。