1--TEST-- 2PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY vs access allowed 3--EXTENSIONS-- 4pdo_mysql 5--SKIPIF-- 6<?php 7require_once __DIR__ . '/inc/mysql_pdo_test.inc'; 8MySQLPDOTest::skip(); 9MySQLPDOTest::skipInfileNotAllowed(); 10if (!defined('PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY')) { 11 die("skip No MYSQL_ATTR_LOCAL_INFILE_DIRECTORY support"); 12} 13?> 14--FILE-- 15<?php 16 function exec_and_count($offset, &$db, $sql, $exp) { 17 try { 18 $ret = $db->exec($sql); 19 if ($ret !== $exp) { 20 printf("[%03d] Expecting '%s'/%s got '%s'/%s when running '%s', [%s] %s\n", 21 $offset, $exp, gettype($exp), $ret, gettype($ret), $sql, 22 $db->errorCode(), implode(' ', $db->errorInfo())); 23 return false; 24 } 25 } catch (PDOException $e) { 26 printf("[%03d] '%s' has failed, [%s] %s\n", 27 $offset, $sql, $db->errorCode(), implode(' ', $db->errorInfo())); 28 return false; 29 } 30 31 return true; 32 } 33 34 require_once __DIR__ . '/inc/mysql_pdo_test.inc'; 35 $db = MySQLPDOTest::factoryWithAttr([ 36 PDO::MYSQL_ATTR_LOCAL_INFILE=>false, 37 PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY=>__DIR__."/foo", 38 ]); 39 40 try { 41 exec_and_count(2, $db, sprintf('CREATE TABLE test_local_inifile_dir_allowed(id INT NOT NULL PRIMARY KEY, col1 CHAR(10)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE), 0); 42 43 $filepath = str_replace('\\', '/', __DIR__.'/foo/bar/bar.data'); 44 45 $sql = sprintf("LOAD DATA LOCAL INFILE %s INTO TABLE test_local_inifile_dir_allowed FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'", $db->quote($filepath)); 46 if (exec_and_count(3, $db, $sql, 3)) { 47 $stmt = $db->query('SELECT id, col1 FROM test_local_inifile_dir_allowed ORDER BY id ASC'); 48 $expected = array( 49 array("id" => 97, "col1" => "first"), 50 array("id" => 98, "col1" => "second"), 51 array("id" => 99, "col1" => "third"), 52 ); 53 $ret = $stmt->fetchAll(PDO::FETCH_ASSOC); 54 foreach ($expected as $offset => $exp) { 55 foreach ($exp as $key => $value) { 56 $actual_value = trim(strval($ret[$offset][$key])); 57 if ($actual_value != $value) { 58 printf("Results seem wrong, check manually\n"); 59 echo "------ EXPECTED OUTPUT ------\n"; 60 var_dump($expected); 61 echo "------ ACTUAL OUTPUT ------\n"; 62 var_dump($ret); 63 break 2; 64 } 65 } 66 } 67 } 68 } catch (PDOException $e) { 69 printf("[001] %s, [%s] %s\n", 70 $e->getMessage(), 71 $db->errorCode(), implode(' ', $db->errorInfo())); 72 } 73 74 print "done!"; 75?> 76--CLEAN-- 77<?php 78require_once __DIR__ . '/inc/mysql_pdo_test.inc'; 79$db = MySQLPDOTest::factory(); 80$db->exec('DROP TABLE IF EXISTS test_local_inifile_dir_allowed'); 81?> 82--EXPECT-- 83done! 84