php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #35338 PDO freezes while retreiving binary data from postgres
Submitted: 2005-11-22 20:57 UTC Modified: 2005-11-26 18:28 UTC
From: f dot engelhardt at 21torr dot com Assigned: wez (profile)
Status: Not a bug Package: PDO related
PHP Version: 5CVS-2005-11-22 (CVS) OS: Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: f dot engelhardt at 21torr dot com
New email:
PHP Version: OS:

 

 [2005-11-22 20:57 UTC] f dot engelhardt at 21torr dot com
Description:
------------
I tried to write binary data into a postgresql table, that work, but i can not get this data out the table anymore.

Reproduce code:
---------------
<?php

$dbh = new PDO('pgsql:host=localhost;dbname=test','root','fo0224');

$q = 'SELECT data FROM foobar';
$stmt = $dbh->prepare($q);
if ($stmt) 
{
  $stmt->bindColumn('DATA',$sData);
  if (!$stmt->execute())
  {
    print_r($stmt->errorInfo());
    die('DAMN');
  }
  if (!$stmt->fetch(PDO::FETCH_BOUND))
  {
    print_r($stmt->errorInfo());
    die('DAMN');
  }
  header('Content-Type: image/jpeg');
  echo $sData;
} else {
  print_r($dbh->errorInfo());
}

?>


Table foobar only has a bytea column named data

Expected result:
----------------
should display the image

Actual result:
--------------
the php-process does not do anything, the browser waits for an answer (i waited 5 minutes, but nothing happened)

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2005-11-22 22:36 UTC] tony2001@php.net
Are you able to reproduce it with something different than PgSQL? Sqlite, for example?
Are you able to reproduce it with PHP CLI?

 [2005-11-23 12:25 UTC] f dot engelhardt at 21torr dot com
Exact the same script (replacing pgsql by mysql in the new PDO line) it works with mysql.
I also tried it with CLI, the same error.

And i found out another bug. I tried to insert data into the table with pdo into a postgresql database, but there are only some bytes inserted, not all.

Script: 

<?php

$dbh = new PDO('pgsql:host=localhost;dbname=test','root','fo0224');

$sData = file_get_contents('/home/bowman/.fluxbox/backgrounds/NVA-91.jpg');

$q = 'INSERT INTO foobar (data) VALUES (:data)';
$stmt = $dbh->prepare($q);
if ($stmt) 
{
  $stmt->bindParam(':data',$sData);
  if (!$stmt->execute())
  {
    print_r($stmt->errorInfo());
    die('DAMN');
  }
  //header('Content-Type: image/jpeg');
  echo $sData;
  flush();
  exit;
} else {
  print_r($dbh->errorInfo());
}

?>


This script is working with MySQL, but not with Postgresql
 [2005-11-23 12:28 UTC] f dot engelhardt at 21torr dot com
Sorry, i forgot to give you another hint:
The data in the postgresql database in the first script was added with the pg_-functions into a bytea field.
As explained some minutes ago, inserting binary data into a bytea field in postgres via pdo failes with no error output.
Maybe i am using the wrong datatype for binary data in postgres, but i only found bytea for binary puroses.
 [2005-11-23 13:53 UTC] tony2001@php.net
Assigned to the maintainer.
 [2005-11-25 04:38 UTC] wez@php.net
Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip

I've made some adjustments in CVS; please try the next PHP 5.1 snapshot and let me know how it goes.
 [2005-11-25 11:05 UTC] f dot engelhardt at 21torr dot com
I am sorry, but i have to tell you, that nothing changed.
After executing the insert script, there was only the following in the database:
id 	data
4	\377\330\377\340

There has to more data.
I know, that when using the pg_ functions i have to pg_escape_bytea() function on the binary data, and when i
read it, i have to use the pg_unescape_bytea() function.
Maybe this isn?t done.
 [2005-11-25 11:12 UTC] f dot engelhardt at 21torr dot com
It works, if i specify PDO::PARAM_LOB with the bindParam() call in the insert script:

$stmt->bindParam(':data',$sData,PDO::PARAM_LOB);

I am not sure, if it should work without this, but it is working on postgresql if i do it like this.
It also works with mysql, but that was working also without the PDO::PARAM_LOB parameter.

So my question is:
Is it desired that binary data can be inserted into a table without PDO::PARAM_LOB or not?
 [2005-11-26 18:28 UTC] iliaa@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

When using binary data you must specify the param as LOB via PDO::PARAM_LOB. This is necessary to allow the underlying layer to realize the data is binary and use a binary escaping function, rather then a string escaping function. In PostgreSQL using a string escaping function or binary data results in data loss.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 10:01:29 2024 UTC