1--TEST-- 2MySQL PDO->exec(), affected rows 3--SKIPIF-- 4<?php 5require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); 6require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); 7MySQLPDOTest::skip(); 8 9// Run test only locally - not against remote hosts 10$db = MySQLPDOTest::factory(); 11$stmt = $db->query('SELECT USER() as _user'); 12$row = $stmt->fetch(PDO::FETCH_ASSOC); 13$tmp = explode('@', $row['_user']); 14if (count($tmp) < 2) 15 die("skip Cannot detect if test is run against local or remote database server"); 16if (($tmp[1] !== 'localhost') && ($tmp[1] !== '127.0.0.1')) 17 die("skip Test cannot be run against remote database server"); 18 19?> 20--FILE-- 21<?php 22 function exec_and_count($offset, &$db, $sql, $exp) { 23 24 try { 25 26 $ret = $db->exec($sql); 27 if ($ret !== $exp) { 28 printf("[%03d] Expecting '%s'/%s got '%s'/%s when running '%s', [%s] %s\n", 29 $offset, $exp, gettype($exp), $ret, gettype($ret), $sql, 30 $db->errorCode(), implode(' ', $db->errorInfo())); 31 return false; 32 } 33 34 } catch (PDOException $e) { 35 36 if (42000 == $db->errorCode()) { 37 // Error: 1148 SQLSTATE: 42000 (ER_NOT_ALLOWED_COMMAND) 38 // Load data infile not allowed 39 return false; 40 } 41 42 printf("[%03d] '%s' has failed, [%s] %s\n", 43 $offset, $sql, $db->errorCode(), implode(' ', $db->errorInfo())); 44 return false; 45 } 46 47 return true; 48 } 49 50 require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); 51 putenv('PDOTEST_ATTR='.serialize([PDO::MYSQL_ATTR_LOCAL_INFILE=>true])); 52 $db = MySQLPDOTest::factory(); 53 MySQLPDOTest::createTestTable($db, MySQLPDOTest::detect_transactional_mysql_engine($db)); 54 55 /* affected rows related */ 56 try { 57 58 exec_and_count(2, $db, 'DROP TABLE IF EXISTS test', 0); 59 exec_and_count(3, $db, sprintf('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, col1 CHAR(10)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE), 0); 60 61 $stmt = $db->query("SHOW VARIABLES LIKE 'secure_file_priv'"); 62 if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) && ($row['value'] != '')) { 63 $filename = $row['value'] . DIRECTORY_SEPARATOR . "pdo_mysql_exec_load_data.csv"; 64 } else { 65 $filename = MySQLPDOTest::getTempDir() . DIRECTORY_SEPARATOR . "pdo_mysql_exec_load_data.csv"; 66 } 67 68 $fp = fopen($filename, "w"); 69 fwrite($fp, b"1;foo\n"); 70 fwrite($fp, b"2;bar"); 71 fclose($fp); 72 73 $sql = sprintf("LOAD DATA LOCAL INFILE %s INTO TABLE test FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'", $db->quote($filename)); 74 75 if (exec_and_count(4, $db, $sql, 2)) { 76 77 $stmt = $db->query('SELECT id, col1 FROM test ORDER BY id ASC'); 78 $expected = array(array("id" => 1, "col1" => "foo"), array("id" => 2, "col1" => "bar")); 79 $ret = $stmt->fetchAll(PDO::FETCH_ASSOC); 80 foreach ($expected as $offset => $exp) { 81 foreach ($exp as $key => $value) { 82 if ($ret[$offset][$key] != $value) { 83 printf("Results seem wrong, check manually\n"); 84 var_dump($ret); 85 var_dump($expected); 86 break 2; 87 } 88 } 89 } 90 } 91 92 unlink($filename); 93 94 } catch (PDOException $e) { 95 printf("[001] %s, [%s] %s\n", 96 $e->getMessage(), 97 $db->errorCode(), implode(' ', $db->errorInfo())); 98 } 99 100 print "done!"; 101?> 102--CLEAN-- 103<?php 104require dirname(__FILE__) . '/mysql_pdo_test.inc'; 105$db = MySQLPDOTest::factory(); 106$db->exec('DROP TABLE IF EXISTS test'); 107?> 108--EXPECTF-- 109done! 110