. Added array input support to mb_convert_encoding(). (Yasuo)
. Added array input support to mb_check_encoding(). (Yasuo)
+- PDO_DBlib:
+ . Fixed bug #73234 (Emulated statements let value dictate parameter type).
+ (Adam Baratz)
+
<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
}
plc->freeq = 1;
} else {
- zval tmp_param;
- ZVAL_DUP(&tmp_param, parameter);
- switch (Z_TYPE(tmp_param)) {
- case IS_NULL:
- plc->quoted = "NULL";
- plc->qlen = sizeof("NULL")-1;
+ zend_string *buf = NULL;
+
+ switch (param->param_type) {
+ case PDO_PARAM_BOOL:
+ plc->quoted = zend_is_true(parameter) ? "1" : "0";
+ plc->qlen = sizeof("1")-1;
plc->freeq = 0;
break;
- case IS_FALSE:
- case IS_TRUE:
- convert_to_long(&tmp_param);
- /* fall through */
- case IS_LONG:
- case IS_DOUBLE:
- convert_to_string(&tmp_param);
- plc->qlen = Z_STRLEN(tmp_param);
- plc->quoted = estrdup(Z_STRVAL(tmp_param));
+ case PDO_PARAM_INT:
+ buf = zend_long_to_str(zval_get_long(parameter));
+
+ plc->qlen = ZSTR_LEN(buf);
+ plc->quoted = estrdup(ZSTR_VAL(buf));
plc->freeq = 1;
break;
+ case PDO_PARAM_NULL:
+ plc->quoted = "NULL";
+ plc->qlen = sizeof("NULL")-1;
+ plc->freeq = 0;
+ break;
+
default:
- convert_to_string(&tmp_param);
- if (!stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL(tmp_param),
- Z_STRLEN(tmp_param), &plc->quoted, &plc->qlen,
+ buf = zval_get_string(parameter);
+ if (!stmt->dbh->methods->quoter(stmt->dbh, ZSTR_VAL(buf),
+ ZSTR_LEN(buf), &plc->quoted, &plc->qlen,
param->param_type)) {
/* bork */
ret = -1;
strncpy(stmt->error_code, stmt->dbh->error_code, 6);
+ if (buf) {
+ zend_string_release(buf);
+ }
goto clean_up;
}
plc->freeq = 1;
}
- zval_dtor(&tmp_param);
+
+ if (buf) {
+ zend_string_release(buf);
+ }
}
} else {
zval *parameter;
}
plc->freeq = 1;
} else {
- zval tmp_param;
- ZVAL_DUP(&tmp_param, parameter);
- switch (Z_TYPE(tmp_param)) {
- case IS_NULL:
- plc->quoted = "NULL";
- plc->qlen = sizeof("NULL")-1;
+ zend_string *buf = NULL;
+
+ switch (param->param_type) {
+ case PDO_PARAM_BOOL:
+ plc->quoted = zend_is_true(parameter) ? "1" : "0";
+ plc->qlen = sizeof("1")-1;
plc->freeq = 0;
break;
- case IS_FALSE:
- case IS_TRUE:
- convert_to_long(&tmp_param);
- /* fall through */
- case IS_LONG:
- case IS_DOUBLE:
- convert_to_string(&tmp_param);
- plc->qlen = Z_STRLEN(tmp_param);
- plc->quoted = estrdup(Z_STRVAL(tmp_param));
+ case PDO_PARAM_INT:
+ buf = zend_long_to_str(zval_get_long(parameter));
+
+ plc->qlen = ZSTR_LEN(buf);
+ plc->quoted = estrdup(ZSTR_VAL(buf));
plc->freeq = 1;
break;
+ case PDO_PARAM_NULL:
+ plc->quoted = "NULL";
+ plc->qlen = sizeof("NULL")-1;
+ plc->freeq = 0;
+ break;
+
default:
- convert_to_string(&tmp_param);
- if (!stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL(tmp_param),
- Z_STRLEN(tmp_param), &plc->quoted, &plc->qlen,
+ buf = zval_get_string(parameter);
+ if (!stmt->dbh->methods->quoter(stmt->dbh, ZSTR_VAL(buf),
+ ZSTR_LEN(buf), &plc->quoted, &plc->qlen,
param->param_type)) {
/* bork */
ret = -1;
strncpy(stmt->error_code, stmt->dbh->error_code, 6);
+ if (buf) {
+ zend_string_release(buf);
+ }
goto clean_up;
}
plc->freeq = 1;
}
- zval_dtor(&tmp_param);
+
+ if (buf) {
+ zend_string_release(buf);
+ }
}
} else {
zval *parameter;
$db->exec('INSERT INTO test VALUES(1)');
switch ($db->getAttribute(PDO::ATTR_DRIVER_NAME)) {
case 'dblib':
- // if :limit is used, the value will be quoted as '1', which is invalid syntax
- // this is a bug, to be addressed separately from adding these tests to pdo_dblib
- $sql = 'SELECT TOP 1 * FROM test';
+ $sql = 'SELECT TOP :limit * FROM test';
break;
case 'firebird':
$sql = 'SELECT FIRST :limit * FROM test';
--- /dev/null
+--TEST--
+PDO Common: Bug #73234 (Emulated statements let value dictate parameter type)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo')) die('skip');
+$dir = getenv('REDIR_TEST_DIR');
+if (false == $dir) die('skip no driver');
+require_once $dir . 'pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.dirname(__FILE__) . '/../../pdo/tests/');
+require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
+
+$db = PDOTest::factory();
+$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
+$db->exec('CREATE TABLE test(id INT NULL)');
+
+$stmt = $db->prepare('INSERT INTO test VALUES(:value)');
+
+$stmt->bindValue(':value', 0, PDO::PARAM_NULL);
+$stmt->execute();
+
+$stmt->bindValue(':value', null, PDO::PARAM_NULL);
+$stmt->execute();
+
+$stmt = $db->query('SELECT * FROM test');
+var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ array(1) {
+ ["id"]=>
+ NULL
+ }
+ [1]=>
+ array(1) {
+ ["id"]=>
+ NULL
+ }
+}
echo "===INSERT===\n";
$stmt = $db->prepare('INSERT INTO test VALUES(:id, :classtype, :val)');
-$stmt->bindParam(':id', $idx);
-$stmt->bindParam(':classtype', $ctype);
-$stmt->bindParam(':val', $val);
foreach($objs as $idx => $obj)
{
$ctype = $ctypes[get_class($obj)];
- if (method_exists($obj, 'serialize'))
- {
- $val = $obj->serialize();
- }
- else
- {
- $val = '';
- }
- $stmt->execute();
+
+ $stmt->bindValue(':id', $idx);
+ $stmt->bindValue(':classtype', $ctype, $ctype === null ? PDO::PARAM_NULL : PDO::PARAM_INT);
+ $stmt->bindValue(':val', method_exists($obj, 'serialize') ? $obj->serialize() : '');
+
+ $stmt->execute();
}
unset($stmt);
$stmt = $db->prepare('insert into test (id, name) values(0, :name)');
$name = NULL;
$before_bind = $name;
-$stmt->bindParam(':name', $name);
+$stmt->bindParam(':name', $name, PDO::PARAM_NULL);
if ($name !== $before_bind) {
echo "bind: fail\n";
} else {