Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PDO - postgres bytes
hettmix
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 10.03.2012

Ostrzeżenie: (0%)
-----


Witam.

Próbuję pobrać z bazy postgres dane typu bytes (zdjęcie w formacie jpeg):
  1. <?php
  2.  
  3. try{
  4. $db = new PDO('pgsql:host=173.225.xx.xx;dbname=xxxxxx', 'postgres', 'xxxxxxxxxxx');
  5. $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6. $db->exec("SET CLIENT_ENCODING TO 'UTF8'");
  7. }
  8. catch (PDOException $e)
  9. {
  10. print "Błąd połączenia z bazą!: " . $e->getMessage() . "<br/>";
  11. die();
  12. }
  13.  
  14. $bif_id = trim($_GET['bif_id']);
  15.  
  16.  
  17. if ($_GET['bif_id']) {
  18.  
  19. $sql="SELECT jpeg_zdjecie from zdjecia_p where (bif_id='".$bif_id."')";
  20. $sqh=$db->query($sql);
  21. $sqh->execute(array($_GET['bif_id']));
  22. $data=$sqh->fetchAll(PDO::FETCH_NUM);
  23. $data=$data[0][0]; // print($data) here will just return "Resource id #"
  24. //print $data;
  25. //header('Content-Type: image/jpeg');
  26. $data=fgets($data);
  27. print $data;
  28.  
  29. }
  30.  
  31. ?>

W efekcie otrzymuję tylko fragment danych
[txt]
����JFIF``��C 
[/txt]
Jak to ugryźć ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




$data=fgets($data);
A co to?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
hettmix
post
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 10.03.2012

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 12.11.2013, 14:56:34 ) *
$data=fgets($data);
A co to?

Cytuje
[txt]
$data=fgets($data); //The data are returned as a stream handle gulp all of it in in one go, again, this may need some serious rework for too large files
[/txt]
Przerabiam kod, który znalazłem w necie. Próbowałem też w ten sposób
  1. if($_GET['bif_id']){
  2. $sql="SELECT jpeg_zdjecie from zdjecia_p where (bif_id='".$bif_id."')";
  3. $sqh=$db->query($sql);
  4. $sqh->execute(array($_GET['bif_id']));
  5. $data=$sqh->fetchAll(PDO::FETCH_NUM);
  6. $data=$data[0][0]; // print($data) here will just return "Resource id # ..."
  7. //print $data;
  8. //header('Content-Type: image/jpeg');
  9. $data=file_get_contents($data);
  10. print $data;
  11. }

ale dostaję komunikat o błędzie
[txt]
file_get_contents() expects parameter 1 to be string, resource given...
[/txt]
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ty mi nie cytuj manuala, bo ja wiem co te funkcje robią. Ja sie pytam po grzyba ty je tam wkladasz? przeciez kolumna jpeg_zdjecie zawiera juz dane w postaci bytow i jedyne co musisz zrobic to je wyswietlic, a nie cudowac z funkcjami do obslugi plikow.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
hettmix
post
Post #5





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 10.03.2012

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 12.11.2013, 16:37:17 ) *
Ty mi nie cytuj manuala, bo ja wiem co te funkcje robią. Ja sie pytam po grzyba ty je tam wkladasz? przeciez kolumna jpeg_zdjecie zawiera juz dane w postaci bytow i jedyne co musisz zrobic to je wyswietlic, a nie cudowac z funkcjami do obslugi plikow.

I tu jest pies pogrzebany, bo gdy zrobię to tak
  1. if($_GET['bif_id']){
  2. $sql="SELECT jpeg_zdjecie from zdjecia_p where (bif_id='".$bif_id."')";
  3. $sqh=$db->query($sql);
  4. $sqh->execute(array($_GET['bif_id']));
  5. $data=$sqh->fetchAll(PDO::FETCH_NUM);
  6. $data=$data[0][0];
  7. print $data;
  8. }

dostaję tylko: Resource id #2
print_r($data) wyrzuca natomiast: Array ( [0] => Array ( [0] => Resource id #2 ) )
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Bo panie kolego do bazy wstawiles totalnie zle dane smile.gif Kod na pobieranie danych z bazy jest ok. To kod na dodawanie danych do bazy jest zly


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
hettmix
post
Post #7





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 10.03.2012

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 12.11.2013, 18:18:26 ) *
Bo panie kolego do bazy wstawiles totalnie zle dane smile.gif Kod na pobieranie danych z bazy jest ok. To kod na dodawanie danych do bazy jest zly

To niemożliwe - pobieram dane z bazy na innym serwerze w sieci, na którym działa aplikacja wyświetlająca w oknie przeglądarki poprawnie obraz zapisany w polu 'jpeg_zdjecie'.
Zrobiłbym to w proceduralnym MySQLi, ale póki co mogę się połączyć z drugim serwerem w sieci tylko poprzez PDO (mój serwerek Synology ma jakiś problem z konfiguracją).
Go to the top of the page
+Quote Post
Turson
post
Post #8





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


  1. if($_GET['bif_id']){

Do sprawdzenia czy zmienna istnieje służy isset()

  1. $sql="SELECT jpeg_zdjecie from zdjecia_p where (bif_id='".$bif_id."')";
  2. $sqh=$db->query($sql);
  3. $sqh->execute(array($_GET['bif_id']));

Najpierw się przygotowuje zapytanie, a potem wykonuje. Ty dałeś query a potem execute co mija się z celem.

  1. $data=$sqh->fetchAll(PDO::FETCH_NUM);
  2. $data=$data[0][0];

Strasznie komplikujesz sobie życie.


Ja bym zrobił to tak:
  1. if(isset($_GET['bif_id'])){
  2. $sqh=$db->prepare("SELECT jpeg_zdjecie from zdjecia_p where bif_id=:bif_id");
  3. $sqh->bindValue(':bif_id', $_GET['bif_id'], PDO::PARAM_INT); //Jak mniemam ID=integer dlatego INT
  4. $data=$sqh->fetch();
  5. $data=file_get_contents($data["jpeg_zdjecie"]);
  6. echo $data;
  7. }
Go to the top of the page
+Quote Post
hettmix
post
Post #9





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 10.03.2012

Ostrzeżenie: (0%)
-----


Cytat(Turson @ 13.11.2013, 00:21:18 ) *
  1. if($_GET['bif_id']){

Do sprawdzenia czy zmienna istnieje służy isset()

  1. $sql="SELECT jpeg_zdjecie from zdjecia_p where (bif_id='".$bif_id."')";
  2. $sqh=$db->query($sql);
  3. $sqh->execute(array($_GET['bif_id']));

Najpierw się przygotowuje zapytanie, a potem wykonuje. Ty dałeś query a potem execute co mija się z celem.

  1. $data=$sqh->fetchAll(PDO::FETCH_NUM);
  2. $data=$data[0][0];

Strasznie komplikujesz sobie życie.


Ja bym zrobił to tak:
  1. if(isset($_GET['bif_id'])){
  2. $sqh=$db->prepare("SELECT jpeg_zdjecie from zdjecia_p where bif_id=:bif_id");
  3. $sqh->bindValue(':bif_id', $_GET['bif_id'], PDO::PARAM_INT); //Jak mniemam ID=integer dlatego INT
  4. $data=$sqh->fetch();
  5. $data=file_get_contents($data["jpeg_zdjecie"]);
  6. echo $data;
  7. }

Niestety, ale w dalszym ciągu dostaję komunikat: file_get_contents(): Filename cannot be empty

Cytat(nospor @ 12.11.2013, 18:18:26 ) *
Bo panie kolego do bazy wstawiles totalnie zle dane smile.gif Kod na pobieranie danych z bazy jest ok. To kod na dodawanie danych do bazy jest zly

Poniżej działający kod z aplikacji, która obsługuje bazę postgres:
  1. <?
  2.  
  3.  
  4. $dbh = db_connect("host=".$host." dbname=".$database." user=".$_SESSION['username']." password=".$_SESSION['password']);
  5.  
  6.  
  7. $res=db_query($dbh,"SELECT length(jpeg_zdjecie) from zdjecia_p where (bif_id='".$bif_id."');");
  8. $r=db_fetch_row($res);
  9.  
  10. if ($r[0]>0) {
  11.  
  12. $res=db_query($dbh,"SELECT jpeg_zdjecie from zdjecia_p where (bif_id='".$bif_id."');");
  13. $res=db_fetch_row($res);
  14. $bif=stripcslashes($res[0]);
  15.  
  16. $jpeg=$bif;
  17.  
  18. }
  19.  
  20.  
  21. header("Content-Disposition: inline; filename=".$bif_id.".jpeg");
  22. header("Content-type: image/jpeg");
  23.  
  24. print $jpeg;
  25.  
  26. db_close($dbh);
  27. ?>

oraz zrzut pola jpeg_zdjecie z programu phpPgAdmin:
dump postgres - jpeg_zdjecie
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




W bazie trzymane są bajty. Nie mozesz wiec uparcie na nich robic file_get_contents czy innych rzeczy operujacyh na plikach.

Masz podany poprawny kod do odczytu. W czym wiec problem? Chcesz go miec w PDO? No to poczytaj jak sa odpowiedniki w pdo funkcji ktorych uzywasz, bo kod PDO co wstawiles na poczatku to faktycznie sieczka, nie zwrocilem wczesniej na to uwagi.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
hettmix
post
Post #11





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 10.03.2012

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 13.11.2013, 08:30:04 ) *
W bazie trzymane są bajty. Nie mozesz wiec uparcie na nich robic file_get_contents czy innych rzeczy operujacyh na plikach.

Masz podany poprawny kod do odczytu. W czym wiec problem? Chcesz go miec w PDO? No to poczytaj jak sa odpowiedniki w pdo funkcji ktorych uzywasz, bo kod PDO co wstawiles na poczatku to faktycznie sieczka, nie zwrocilem wczesniej na to uwagi.


Nie tyle chcę, co na razie muszę mieć w PDO. I z tym własnie nie mogę sobie poradzić
  1. if(isset($_GET['bif_id'])){
  2. $res = $db->query("SELECT * from zdjecia_p where (bif_id='".$bif_id."')");
  3. $r = $res->fetch( PDO::FETCH_ASSOC );
  4.  
  5. print_r ($r);
  6. }

Powyższy kod ładnie wyrzuca dane z tabeli zdjecia_p za wyjątkiem pól typu bytea, dla których wynik to Resource id #...
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




1) Łaczysz sie do tej samej bazy co w kodzie bez PDO?
2) Jedyna roznica to brak u Ciebie stripcslashes, ktore jest w kodzie bez PDO.

3) Albo jakims cudem ktos w funkciji db_fetch_row() dodal konwersje resource na dane z pliku smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
no_face
post
Post #13





Grupa: Zarejestrowani
Postów: 346
Pomógł: 23
Dołączył: 28.11.2004

Ostrzeżenie: (0%)
-----


Przegladarka chcialaby wiedziec jaki to typ danych, wiec jak juz doszlismy do samego print to odhashuj lub dodaj linijke z headerem, moze w tym tkwi problem.
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@no_face to nie w tym problem, skoro ciagle uparcie mu wyswietla Resource id znaczy ze to problem z odbieraniem danych z bazy.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
hettmix
post
Post #15





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 10.03.2012

Ostrzeżenie: (0%)
-----


Ok - poniżej działający kod, może się komuś przyda:
  1. if(isset($_GET['bif_id'])){
  2.  
  3. $stmt = $db->prepare("select jpeg_zdjecie from zdjecia_p where bif_id=:bif_id");
  4. $stmt->execute(array($_GET['bif_id']));
  5. $stmt->bindColumn(1, $lob, PDO::PARAM_LOB);
  6. $stmt->fetch(PDO::FETCH_BOUND);
  7.  
  8. header('Content-Type: image/jpeg; charset=UTF-8');
  9. fpassthru($lob);
  10. }
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




czyli db_fetch_row() konwertowala resource na byte jak wspomnialem?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 03:10