Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO - postgres bytes
Forum PHP.pl > Forum > PHP
hettmix
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źć ?
nospor
$data=fgets($data);
A co to?
hettmix
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]
nospor
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.
hettmix
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 ) )
nospor
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
hettmix
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ą).
Turson
  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. }
hettmix
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
nospor
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.
hettmix
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 #...
nospor
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
no_face
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.
nospor
@no_face to nie w tym problem, skoro ciagle uparcie mu wyswietla Resource id znaczy ze to problem z odbieraniem danych z bazy.
hettmix
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. }
nospor
czyli db_fetch_row() konwertowala resource na byte jak wspomnialem?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.