List:Commits« Previous MessageNext Message »
From:uwendel Date:February 4 2008 2:29pm
Subject:PHP mysqlnd svn commit: r1248 - trunk/tests/ext/pdo
View as plain text  
Author: uwendel
Date: 2008-02-04 15:29:37 +0100 (Mon, 04 Feb 2008)
New Revision: 1248

Added:
   trunk/tests/ext/pdo/pdo_stmt_bindparam.phpt
Log:
bindParam() says it binds a reference but it seems one
can fool it.

$in = 1
bindParam(..., $in)
execute()   --> correct results

$other = 0;
$in =& $other;

print $in   --> in = 0
execute()   --> results for in = 1 



Added: trunk/tests/ext/pdo/pdo_stmt_bindparam.phpt
===================================================================
--- trunk/tests/ext/pdo/pdo_stmt_bindparam.phpt	                        (rev 0)
+++ trunk/tests/ext/pdo/pdo_stmt_bindparam.phpt	2008-02-04 14:29:37 UTC (rev 1248)
@@ -0,0 +1,140 @@
+--TEST--
+PDO Common: PDOStatement->bindParam()
+--SKIPIF--
+<?php # vim:ft=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->exec('CREATE TABLE test(id int NOT NULL PRIMARY KEY, val VARCHAR(10), grp
VARCHAR(10))');
+$db->exec('INSERT INTO test VALUES(1, \'A\', \'Group1\')');
+$db->exec('INSERT INTO test VALUES(2, \'B\', \'Group2\')');
+
+try {
+
+	$stmt = $db->prepare('SELECT id FROM test WHERE id > ? ORDER BY id ASC');
+
+	if (false !==	($tmp = @$stmt->bindParam()))
+		printf("[001] Expecting boolean false got %s\n", var_export($tmp, true));
+
+	if (false !==	($tmp = @$stmt->bindParam(1)))
+		printf("[002] Expecting boolean false got %s\n", var_export($tmp, true));
+
+	if (false !==	($tmp = @$stmt->bindParam(array())))
+		printf("[003] Expecting boolean false got %s\n", var_export($tmp, true));
+
+	$stmt = $db->prepare('SELECT id FROM test WHERE id > ? ORDER BY id ASC');
+	$in = 1;
+
+	if (true !== ($tmp = $stmt->bindParam(1, $in)))
+		printf("[004] Expecting boolean false got %s\n", var_export($tmp, true));
+
+	if (false !==	($tmp = @$stmt->bindParam(0, $in)))
+		printf("[005] Expecting boolean false got %s\n", var_export($tmp, true));
+
+	// Invalid offset
+	$stmt = $db->prepare('SELECT id FROM test WHERE id > ? ORDER BY id ASC');
+	if (false !==	($tmp = @$stmt->bindParam(PHP_INT_MAX, $in)))
+		printf("[006] Expecting boolean false got %s\n", var_export($tmp, true));
+
+	if (false !==	($tmp = @$stmt->bindParam(':unknown', $in)))
+		printf("[007] Expecting boolean false got %s\n", var_export($tmp, true));
+
+	// Invalid data type
+	$valid = array(PDO::PARAM_BOOL, PDO::PARAM_NULL,
+		PDO::PARAM_INT, PDO::PARAM_STR, PDO::PARAM_LOB);
+	do {
+		$invalid = mt_rand(-1 * PHP_INT_MAX + 1, PHP_INT_MAX);
+	} while (in_array($invalid, $valid));
+
+	if (false !==	($tmp = @$stmt->bindParam(1, $in, $invalid)))
+		printf("[008] Expecting boolean false got %s\n", var_export($tmp, true));
+
+	$stmt = $db->prepare('SELECT id FROM test WHERE id > ? ORDER BY id ASC');
+		if (true !== ($tmp = $stmt->bindParam(1, $in)))
+		printf("[009] Expecting boolean false got %s\n", var_export($tmp, true));
+
+	$stmt = $db->prepare('SELECT id FROM test WHERE id > ? ORDER BY id ASC');
+	$in = $out = 1;
+	if (true !== ($tmp = $stmt->bindParam(1, $in)))
+		printf("[010] Expecting boolean true got %s, %s %s\n",
+			var_export($tmp, true),
+			var_export($stmt->errorCode(), true),	var_export($stmt->errorInfo(), true));
+
+	if (true !== ($tmp = $stmt->bindColumn(1, $out, PDO::PARAM_STR)))
+		printf("[011] %s %s\n",
+			var_export($stmt->errorCode(), true),	var_export($stmt->errorInfo(), true));
+
+	$stmt->execute();
+	while ($stmt->fetch(PDO::FETCH_BOUND))
+		printf("in = %d, id = %s (%s)\n", $in, var_export($out, true), gettype($out));
+
+	printf("Executing statement again with in =& in2, in2 = 0 (SELECT id FROM test WHERE
id > 0 ORDER BY id ASC -> 2 rows) \n");
+	$in2 = 0;
+	$in =& $in2;
+	$stmt->execute();
+	while ($stmt->fetch(PDO::FETCH_BOUND))
+		printf("in = %d, id = %s (%s)\n", $in, var_export($out, true), gettype($out));
+
+	// Manual: "Unlike PDOStatement->bindValue(), the variable is bound as a reference
and will only be evaluated at the time that PDOStatement->execute() is called."
+	printf("New bind with in2 = 0; in =& in2 (SELECT id FROM test WHERE id > 0 ORDER
BY id ASC -> 2 rows) \n");
+
+	$stmt = $db->prepare('SELECT id FROM test WHERE id > ? ORDER BY id ASC');
+	$in2 = 1;
+	$in =& $in2;
+	$out = 1;
+	if (true !== ($tmp = $stmt->bindParam(1, $in)))
+		printf("[012] Expecting boolean true got %s, %s %s\n",
+			var_export($tmp, true),
+			var_export($stmt->errorCode(), true),	var_export($stmt->errorInfo(), true));
+
+	if (true !== ($tmp = $stmt->bindColumn(1, $out, PDO::PARAM_STR)))
+		printf("[013] %s %s\n",
+			var_export($stmt->errorCode(), true),	var_export($stmt->errorInfo(), true));
+
+	$in2 = 0;
+	$stmt->execute();
+	while ($stmt->fetch(PDO::FETCH_BOUND))
+		printf("in = %d, id = %s (%s)\n", $in, var_export($out, true), gettype($out));
+
+	$in2 = 1;
+	printf("Executing statement again with in2 = 1 [= in = 1] (SELECT id FROM test WHERE id
> 1 ORDER BY id ASC -> 1 row) \n");
+	$stmt->execute();
+	while ($stmt->fetch(PDO::FETCH_BOUND))
+		printf("in = %d, id = %s (%s)\n", $in, var_export($out, true), gettype($out));
+
+	$in = 0;
+	printf("Executing statement again with in = 0 (SELECT id FROM test WHERE id > 0 ORDER
BY id ASC -> 2 rows) \n");
+	$stmt->execute();
+	while ($stmt->fetch(PDO::FETCH_BOUND))
+		printf("in = %d, id = %s (%s)\n", $in, var_export($out, true), gettype($out));
+
+} catch (PDOException $e) {
+	// we should never get here, we use warnings, but never trust a system...s
+	printf("[001] %s, [%s} %s\n",
+		$e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo()));
+}
+print "done!";
+?>
+--EXPECTF--
+in = 1, id = '2' (string)
+Executing statement again with in =& in2, in2 = 0 (SELECT id FROM test WHERE id >
0 ORDER BY id ASC -> 2 rows)
+in = 0, id = '1' (string)
+in = 0, id = '2' (string)
+New bind with in2 = 0; in =& in2 (SELECT id FROM test WHERE id > 0 ORDER BY id ASC
-> 2 rows)
+in = 0, id = '1' (string)
+in = 0, id = '2' (string)
+Executing statement again with in2 = 1 [= in = 1] (SELECT id FROM test WHERE id > 1
ORDER BY id ASC -> 1 row)
+in = 1, id = '2' (string)
+Executing statement again with in = 0 (SELECT id FROM test WHERE id > 0 ORDER BY id
ASC -> 2 rows)
+in = 0, id = '1' (string)
+in = 0, id = '2' (string)
+done!
\ No newline at end of file

Thread
PHP mysqlnd svn commit: r1248 - trunk/tests/ext/pdouwendel4 Feb