php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #52637 bug in prepare statement
Submitted: 2010-08-18 18:18 UTC Modified: 2013-10-15 11:54 UTC
Votes:1
Avg. Score:5.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: angelo dot courtel at laposte dot net Assigned:
Status: No Feedback Package: PDO related
PHP Version: 5.2.6-1+lenny6 OS: Debian Lenny
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2010-08-18 18:18 UTC] angelo dot courtel at laposte dot net
Description:
------------
Hi

when I execute a prepared query which use twice, or more, a same parameters, it 
returns an error : in french : ERREUR:  n'a pas pu déterminer le type de données 
du paramètres $3

ie. : this query don't works
$sReq = 'select *
	from categorie
	left join budget on bud_cat = cat_cod and bud_moi = :month and bud_ann = 
:year
	left join operation on ope_cat = cat_cod and ope_moi = :month and 
ope_ann = :year
	where cat_cod = :categorie';
$rCategorie = $oAppli->getDb()->prepare($sReq);
$rCategorie->bindParam(':month', date('m'));
$rCategorie->bindParam(':categorie', $sCategorie);
$rCategorie->bindParam(':year', date('Y'));
if ($rCategorie->execute())

but if I add "--  :year :categorie :month" at the beginning of the query, it 
works !!!
I thinks PDO don't like seeing a repeated parameter before seens all the 
parameters (the :month appears twice before :categorie, almost with the comment 
at the beginning, PDO see all parameters at start)

Sorry for my english I'm french guy.

Thks

Test script:
---------------
//don't work
$sReq = 'select *
	from categorie
	left join budget on bud_cat = cat_cod and bud_moi = :month and bud_ann = :year
	left join operation on ope_cat = cat_cod and ope_moi = :month and ope_ann = :year
	where cat_cod = :categorie';
$rCategorie = $oAppli->getDb()->prepare($sReq);
$rCategorie->bindParam(':month', date('m'));
$rCategorie->bindParam(':categorie', $sCategorie);
$rCategorie->bindParam(':year', date('Y'));
if ($rCategorie->execute())

//works fine

$sReq = '--  :year :categorie :month
	select *
	from categorie
	left join budget on bud_cat = cat_cod and bud_moi = :month and bud_ann = :year
	left join operation on ope_cat = cat_cod and ope_moi = :month and ope_ann = :year
	where cat_cod = :categorie';
$rCategorie = $oAppli->getDb()->prepare($sReq);
$rCategorie->bindParam(':month', date('m'));
$rCategorie->bindParam(':categorie', $sCategorie);
$rCategorie->bindParam(':year', date('Y'));
if ($rCategorie->execute())



Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-08-19 01:17 UTC] felipe@php.net
-Status: Open +Status: Feedback
 [2010-08-19 01:17 UTC] felipe@php.net
What PDO driver are you using?
 [2010-08-19 06:55 UTC] angelo dot courtel at laposte dot net
-Status: Feedback +Status: Open
 [2010-08-19 06:55 UTC] angelo dot courtel at laposte dot net
Hi, I use PostGreSql Pdo driver
Thks
 [2010-08-19 10:06 UTC] angelo dot courtel at laposte dot net
-PHP Version: 5.2.14 +PHP Version: 5.2.6-1+lenny6
 [2010-08-19 10:06 UTC] angelo dot courtel at laposte dot net
A little example for explain my bug :
This source works correctly on an Windows WAMP PHP5.2.6
But not on Debian :(

<?php
//running on PHP Version 5.2.6-1+lenny6
try {
    $dbh = new PDO('pgsql:host=localhost;port=5432;dbname=db;user=user;password=pass');
} catch (PDOException $e) {
    echo 'Connexion failed : ' . $e->getMessage();exit;
}
//list or parameters
$id = 40;
$id2 = 40;
$param = array (':id' => $id, ':id2' => $id2);

//query failed
$sReq = '
	select * from t1
	left join t2 on t2.id = :id
	left join t3 on t3.id = :id
	where t1.id = :id2';

$rTest1 = $dbh->prepare($sReq);
if ($rTest1->execute($param))
	echo 'OK';
else
	var_dump($rTest1->errorInfo());
// --> array(3) { [0]=>  string(5) "42P18" [1]=>  int(7) [2]=>  string(69) "ERREUR: n'a pas pu déterminer le type de données du paramètres $2" } 

$rTest2 = $dbh->prepare($sReq);
$rTest2->bindParam(':id', $id);
$rTest2->bindParam(':id2', $id2);
if ($rTest2->execute())
	echo 'OK';
else
	var_dump($rTest2->errorInfo());
// --> array(3) { [0]=>  string(5) "42P18" [1]=>  int(7) [2]=>  string(69) "ERREUR: n'a pas pu déterminer le type de données du paramètres $2" } 

//query success
$sReq = '
	-- :id :id2
	select * from t1
	left join t2 on t2.id = :id
	left join t3 on t3.id = :id
	where t1.id = :id2';

$rTest3 = $dbh->prepare($sReq);
if ($rTest3->execute($param))
	echo 'OK';
else
	var_dump($rTest3->errorInfo());
// --> OK

$rTest4 = $dbh->prepare($sReq);
$rTest4->bindParam(':id', $id);
$rTest4->bindParam(':id2', $id2);
if ($rTest4->execute())
	echo 'OK';
else
	var_dump($rTest4->errorInfo());
// --> OK
?>
 [2010-09-06 15:13 UTC] uw@php.net
Well, if you comment out your SQL statement, it should work fine regardless what it may look like... "-- " starts a single line SQL comment.
 [2010-09-07 21:44 UTC] angelo dot courtel at laposte dot net
Well, but I want find a way to use a prepared statement, without need to 
predeclare all paramètres on a sql comment ! It s not a very optimized solution.
 [2010-09-10 13:40 UTC] uw@php.net
Your "//works fine" code sample should do exactly nothing because there is no SQL statement run. The SQL statement is commented out. No "predifining" of any kind should happen.
 [2010-09-10 14:38 UTC] angelo dot courtel at laposte dot net
I ve commented only first line of my sql statement, not entire statement.
 [2010-10-12 12:09 UTC] ddebernardy at yahoo dot com
I ran into this one too a long time ago, and it was due to the presence of 
multiple occurrences of named parameters in the query.

If you change the two occurrences of :month to :month and :month2, then bind the 
parameters accordingly, the bug will go away.

The workaround is not optimal, but it works.
 [2013-06-12 03:59 UTC] ssufficool@php.net
-Status: Open +Status: Feedback
 [2013-06-12 03:59 UTC] ssufficool@php.net
Thank you for this bug report. To properly diagnose the problem, we
need a short but complete example script to be able to reproduce
this bug ourselves. 

A proper reproducing script starts with <?php and ends with ?>,
is max. 10-20 lines long and does not require any external 
resources such as databases, etc. If the script requires a 
database to demonstrate the issue, please make sure it creates 
all necessary tables, stored procedures etc.

Please avoid embedding huge scripts into the report.

Some drivers implement their own parameter binding.

Which database driver does this pertain to? MySQL, PostrgreSQL, Oracle, DBLIB??
 [2013-10-15 11:54 UTC] php-bugs at lists dot php dot net
No feedback was provided. The bug is being suspended because
we assume that you are no longer experiencing the problem.
If this is not the case and you are able to provide the
information that was requested earlier, please do so and
change the status of the bug back to "Re-Opened". Thank you.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Apr 28 23:01:32 2024 UTC