Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions ext/pdo/pdo_stmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,9 +276,14 @@ static bool really_register_bound_param(struct pdo_bound_param_data *param, pdo_
}

if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && !Z_ISNULL_P(parameter)) {
zend_bool is_false = (Z_TYPE_P(parameter) == IS_FALSE);
if (!try_convert_to_string(parameter)) {
return 0;
}
/* the pgsql's driver does not handle empty string for false bound parameters */
if (is_false) {
ZVAL_STR(parameter, ZSTR_CHAR('0'));
}
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && (Z_TYPE_P(parameter) == IS_FALSE || Z_TYPE_P(parameter) == IS_TRUE)) {
convert_to_long(parameter);
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(parameter) == IS_LONG) {
Expand Down
27 changes: 23 additions & 4 deletions ext/pgsql/pgsql.c
Original file line number Diff line number Diff line change
Expand Up @@ -1199,7 +1199,17 @@ PHP_FUNCTION(pg_query_params)
if (Z_TYPE_P(tmp) == IS_NULL) {
params[i] = NULL;
} else {
zend_string *param_str = zval_try_get_string(tmp);
zend_string *param_str;
/**
* zval_try_get_string returns an empty zend_string
* for false which is correct in general
* but not adequate for bool values in the db
*/
if (Z_TYPE_P(tmp) == IS_FALSE) {
param_str = ZSTR_CHAR('0');
} else {
param_str = zval_try_get_string(tmp);
}
if (!param_str) {
_php_pgsql_free_params(params, num_params);
RETURN_THROWS();
Expand Down Expand Up @@ -3750,9 +3760,18 @@ PHP_FUNCTION(pg_send_query_params)
if (Z_TYPE_P(tmp) == IS_NULL) {
params[i] = NULL;
} else {
zend_string *tmp_str;
zend_string *str = zval_get_tmp_string(tmp, &tmp_str);

zend_string *str, *tmp_str;
/**
* zval_get_tmp_string returns an empty zend_string
* for false which is correct in general
* but not adequate for bool values in the db
*/
if (Z_TYPE_P(tmp) == IS_FALSE) {
tmp_str = ZSTR_CHAR('0');
str = tmp_str;
} else {
str = zval_get_tmp_string(tmp, &tmp_str);
}
params[i] = estrndup(ZSTR_VAL(str), ZSTR_LEN(str));
zend_tmp_string_release(tmp_str);
}
Expand Down
28 changes: 28 additions & 0 deletions ext/pgsql/tests/33query_params_bool.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
--TEST--
PostgreSQL prepared queries with bool constants
--SKIPIF--
<?php
include("skipif.inc");
if (!function_exists('pg_prepare')) die('skip function pg_prepare() does not exist');
?>
--FILE--
<?php

include('config.inc');

$db = pg_connect($conn_str);

$version = pg_version($db);
if ($version['protocol'] >= 3) {
$result = pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num >= $1;", array(true));
// bug occurs with false as it turns out as empty.
$result = pg_query_params($db, "SELECT * FROM ".$table_name." WHERE num <> $1;", array(false));
pg_free_result($result);
}
pg_close($db);

echo "OK";
?>
--EXPECT--
OK