php-src/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_non_select.phpt
Johannes Schlüter be0793d2e7 MFH: Add mysqlnd support for PDO_mysql, fixes at least bug#41997,#42499,
pecl#12794, pecl#12401

# Running the tests:
# (Note: Doesn't work currnetly on HEAD, see:
#  http://news.php.net/php.qa/64378)
#
#  PDO_MYSQL_TEST_DSN  - DSN
#    For example: mysql:dbname=test;host=localhost;port=3306
#
#  PDO_MYSQL_TEST_HOST    - database host
#  PDO_MYSQL_TEST_DB      - database (schema) name
#  PDO_MYSQL_TEST_SOCKET  - database server socket
#  PDO_MYSQL_TEST_ENGINE  - storage engine to use
#  PDO_MYSQL_TEST_USER    - database user
#  PDO_MYSQL_TEST_PASS    - database user password
#  PDO_MYSQL_TEST_CHARSET - database charset
#
#  NOTE: if any of PDO_MYSQL_TEST_[HOST|DB|SOCKET|ENGINE|CHARSET] is
#  part of PDO_MYSQL_TEST_DSN, the values must match. That is, for example,
#  for PDO_MYSQL_TEST_DSN = mysql:dbname=test you MUST set PDO_MYSQL_TEST_DB=test.
2008-07-21 13:09:28 +00:00

187 lines
6.0 KiB
PHP

--TEST--
MySQL PDOStatement->execute()/fetch(), Non-SELECT
--SKIPIF--
<?php
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
MySQLPDOTest::skip();
?>
--FILE--
<?php
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
MySQLPDOTest::createTestTable($db);
try {
// Emulated PS first
$db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 1);
if (1 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
printf("[002] Unable to turn on emulated prepared statements\n");
if (!is_object($stmt = $db->query('DESCRIBE test id')))
printf("[003] Emulated PS, DESCRIBE failed, %s\n", var_export($db->errorInfo(), true));
$describe = array();
$valid = false;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$describe[] = $row;
foreach ($row as $column => $value)
if (isset($row['field']) && ($row['field'] == 'id'))
$valid = true;
}
if (empty($describe))
printf("[004] Emulated PS, DESCRIBE returned no results\n");
else if (!$valid)
printf("[005] Emulated PS, DESCRIBE, returned data seems wrong, dumping %s\n",
var_export($describe, true));
if (!is_object($stmt = $db->query('SHOW ENGINES')))
printf("[006] Emulated PS, SHOW failed, %s\n", var_export($db->errorInfo(), true));
$show = array();
$valid = false;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$show[] = $row;
foreach ($row as $column => $value)
// MyISAM engine should be part of _every_ MySQL today
if ($value == 'MyISAM')
$valid = true;
}
if (empty($show))
printf("[007] Emulated PS, SHOW returned no results\n");
else if (!$valid)
printf("[008] Emulated PS, SHOW data seems wrong, dumping %s\n",
var_export($show, true));
if (!is_object($stmt = $db->query("EXPLAIN SELECT id FROM test")))
printf("[009] Emulated PS, EXPLAIN returned no results\n");
$explain = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
$explain[] = $row;
if (empty($explain))
printf("[010] Emulated PS, EXPLAIN returned no results\n");
// And now native PS
$db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 0);
if (0 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
printf("[011] Unable to turn off emulated prepared statements\n");
$native_support = 'no';
if ($db->exec('PREPARE mystmt FROM "DESCRIBE test id"')) {
$native_support = 'yes';
$db->exec('DEALLOCATE PREPARE mystmt');
}
if (!is_object($stmt = $db->query('DESCRIBE test id')))
printf("[012] Native PS (native support: %s), DESCRIBE failed, %s\n",
$native_support,
var_export($db->errorInfo(), true));
$describe_native = array();
$valid = false;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$describe_native[] = $row;
foreach ($row as $column => $value)
if (isset($row['field']) && ($row['field'] == 'id'))
$valid = true;
}
if (empty($describe_native))
printf("[013] Native PS (native support: %s), DESCRIBE returned no results\n",
$native_support);
else if (!$valid)
printf("[014] Native PS (native support: %s), DESCRIBE, returned data seems wrong, dumping %s\n",
$native_support,
var_export($describe_native, true));
if ($describe != $describe_native)
printf("[015] Emulated and native PS (native support: %s) results of DESCRIBE differ: %s vs. %s\n",
$native_support,
var_export($describe, true),
var_export($describe_native, true));
$native_support = 'no';
if ($db->exec('PREPARE mystmt FROM "SHOW ENGINES"')) {
$native_support = 'yes';
$db->exec('DEALLOCATE PREPARE mystmt');
}
if (!is_object($stmt = $db->query('SHOW ENGINES')))
printf("[016] Native PS (native support: %s), SHOW failed, %s\n",
$native_support,
var_export($db->errorInfo(), true));
$show_native = array();
$valid = false;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$show_native[] = $row;
foreach ($row as $column => $value)
// MyISAM engine should be part of _every_ MySQL today
if ($value == 'MyISAM')
$valid = true;
}
if (empty($show_native))
printf("[017] Native PS (native support: %s), SHOW returned no results\n",
$native_support);
else if (!$valid)
printf("[018] Native PS (native support: %s), SHOW data seems wrong, dumping %s\n",
var_export($show_native, true));
if ($show != $show_native)
printf("Native PS (native support: %s) and emulated PS returned different data for SHOW: %s vs. %s\n",
$native_support,
var_export($show, true),
var_export($show_native, true));
$native_support = 'no';
if ($db->exec('PREPARE mystmt FROM "EXPLAIN SELECT id FROM test"')) {
$native_support = 'yes';
$db->exec('DEALLOCATE PREPARE mystmt');
}
if (!is_object($stmt = $db->query("EXPLAIN SELECT id FROM test")))
printf("[012] Native PS (native support: %s), EXPLAIN failed, %s\n",
$native_support,
var_export($db->errorInfo(), true));
$explain_native = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
$explain_native[] = $row;
if (empty($explain_native))
printf("[013] Native PS (native support: %s), EXPLAIN returned no results\n",
$native_support);
if ($explain != $explain_native)
printf("Native PS (native support: %s) and emulated PS returned different data for EXPLAIN: %s vs. %s\n",
$native_support,
var_export($explain, true),
var_export($explain_native, true));
$stmt->execute();
$explain_native = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($explain != $explain_native)
printf("Native PS (native support: %s) and emulated PS returned different data for EXPLAIN: %s vs. %s\n",
$native_support,
var_export($explain, true),
var_export($explain_native, true));
$stmt->execute();
$stmt->execute();
// libmysql needs this - otherwise we get a 2015 error
if (!MYSQLPDOTest::isPDOMySQLnd())
$stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
printf("[001] %s [%s] %s\n",
$e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo()));
}
$db->exec('DROP TABLE IF EXISTS test');
print "done!\n";
?>
--EXPECTF--
done!