PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL डेटाबेस में बाइटा फ़ील्ड में छवियों को संग्रहीत करना

TL;DR:

addslashes($data) हटाएं . यह यहाँ बेमानी है।

डबल एस्केपिंग .. दो बार

$data=fread($p,filesize($fi));
$data=addslashes($data);
$dat= pg_escape_bytea($data); 

आप डेटा को पढ़ते हैं, इससे बच जाते हैं जैसे कि यह एक स्ट्रिंग अक्षर था, फिर इसे बाइटा ऑक्टल या हेक्स एस्केप में परिवर्तित करें। यह उस तरह से काम नहीं कर सकता, भले ही pg_escape_bytea समझदार था, जो नहीं है।

PHP का pg_escape_bytea ऐसा लगता है कि डबल-एस्केप आउटपुट ताकि इसे एक स्ट्रिंग अक्षर में डाला जा सके। यह अविश्वसनीय रूप से बदसूरत है, लेकिन ऐसा कोई विकल्प प्रतीत नहीं होता है जो यह डबल-एस्केपिंग नहीं करता है, इसलिए आप PHP में बाइटा के लिए पैरामीटरयुक्त कथन का उपयोग नहीं कर सकते हैं। आपको अभी भी बाकी सब चीजों के लिए ऐसा करना चाहिए।

इस मामले में, बस addslashes को हटा दें फ़ाइल से पढ़े गए डेटा के लिए लाइन पर्याप्त है।

टेस्ट केस दिखा रहा है कि pg_escape_bytea डबल-एस्केप (और हमेशा पुराने, अक्षम ऑक्टल एस्केप का भी उपयोग करता है):

<?php
# 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

डबल बैकस्लैश देखें? ऐसा इसलिए है क्योंकि यह माना जा रहा है कि आप इसे एक स्ट्रिंग के रूप में एसक्यूएल में इंटरपोलेट करने जा रहे हैं, जो बेहद मेमोरी अक्षम, बदसूरत और बहुत बुरी आदत है। हालांकि, आपको कोई विकल्प नहीं दिख रहा है।

अन्य बातों के अलावा इसका अर्थ यह है कि:

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

... गलत परिणाम उत्पन्न करता है , चूंकि pg_unescape_bytea वास्तव में pg_escape_bytea . का उल्टा नहीं है . यह pg_escape_bytea . के आउटपुट को फीड करना भी असंभव बना देता है pg_query_params . में एक पैरामीटर के रूप में, आपको इसे इंटरपोलेट करना होगा।

डिकोडिंग

यदि आप आधुनिक PostgreSQL का उपयोग कर रहे हैं, तो यह संभवत:bytea_output . सेट करता है करने के लिए hex डिफ़ॉल्ट रूप से। इसका मतलब है कि अगर मैं अपना डेटा 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 . सेट करना होगा escape . के लिए pg_unescape_bytea . के लिए इसे संभालने के लिए।

इसके बजाय आपको क्या करना चाहिए

पीडीओ का प्रयोग करें।

इसमें 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();

देखें:

  • PHP:बड़ी वस्तुएँ, जिनमें ठीक वही उदाहरण होता है जो आप चाहते हैं;
  • पीडीओस्टेटमेंट::बिंदपरम
  • pdo php का उपयोग करके डेटाबेस में नेमस्पेस के साथ क्रमबद्ध वस्तु को कैसे स्टोर करें
  • BYTEA को PHP5 में PGSQL PDO तैयार स्टेटमेंट से बाइंड करें

आप पोस्टग्रेएसक्यूएल के लॉब (बड़ी वस्तु) समर्थन में भी देखना चाह सकते हैं, जो एक स्ट्रीमिंग, तलाशने योग्य इंटरफ़ेस प्रदान करता है जो अभी भी पूरी तरह से लेनदेन है।

अब, मेरे साबुन के डिब्बे पर जाएं

यदि PHP में "बाइट स्ट्रिंग" और "टेक्स्ट स्ट्रिंग" प्रकारों के बीच वास्तविक अंतर होता, तो आपको pg_escape_bytea की भी आवश्यकता नहीं होती। जैसा कि डेटाबेस ड्राइवर आपके लिए कर सकता है। इस कुरूपता की कोई आवश्यकता नहीं होगी। दुर्भाग्य से, PHP में कोई अलग स्ट्रिंग और बाइट्स प्रकार नहीं हैं।

कृपया, जितना संभव हो सके पैरामीटरयुक्त कथनों के साथ पीडीओ का प्रयोग करें।

जहां आप नहीं कर सकते, कम से कम pg_query_params . का उपयोग करें और पैरामीटरयुक्त बयान। PHP का addslashes एक विकल्प नहीं है, यह अक्षम है, बदसूरत है, और डेटाबेस विशिष्ट भागने के नियमों को नहीं समझता है। आपको अभी भी मैन्युअल रूप से bytea से बचना होगा यदि आप ऐतिहासिक कारणों से पीडीओ का उपयोग नहीं कर रहे हैं, लेकिन बाकी सब कुछ पैरामीटरयुक्त बयानों के माध्यम से जाना चाहिए।

pg_query_params . पर मार्गदर्शन के लिए :

  • बॉबी टेबल, PHP सेक्शन।
  • पीएचपी मैनुअल pg_query_params . पर


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqlalchemy में चेतावनी बंद करें

  2. PostgreSQL में JSON डेटा प्रकार की आकार सीमा

  3. PostgreSQL क्वेरी में पंक्ति संख्या कैसे दिखाएं?

  4. पोस्टग्रेज़ में दिनांक समय को यूनिक्स युग मान में कैसे परिवर्तित करें?

  5. सिंक से बाहर होने पर पोस्टग्रेज के प्राथमिक कुंजी अनुक्रम को कैसे रीसेट करें?