1--TEST-- 2mysqli_debug() - mysqlnd only control strings 3--EXTENSIONS-- 4mysqli 5--SKIPIF-- 6<?php 7require_once 'skipifconnectfailure.inc'; 8 9if (!function_exists('mysqli_debug')) 10 die("skip mysqli_debug() not available"); 11 12if (!defined('MYSQLI_DEBUG_TRACE_ENABLED')) 13 die("skip: can't say for sure if mysqli_debug works"); 14 15if (defined('MYSQLI_DEBUG_TRACE_ENABLED') && !MYSQLI_DEBUG_TRACE_ENABLED) 16 die("skip: debug functionality not enabled"); 17?> 18--FILE-- 19<?php 20 require_once 'table.inc'; 21 22 function try_control_string($link, $control_string, $trace_file, $offset) { 23 24 @unlink($trace_file); 25 if (true !== ($tmp = @mysqli_debug($control_string))) { 26 printf("[%03d][control string '%s'] Expecting boolean/true, got %s/%s.\n", 27 $offset + 1, 28 $control_string, 29 gettype($tmp), 30 $tmp); 31 return false; 32 } 33 34 if (!$res = mysqli_query($link, 'SELECT * FROM test')) { 35 printf("[%03d][control string '%s'] [%d] %s.\n", 36 $offset + 2, 37 $control_string, 38 mysqli_errno($link), 39 mysqli_error($link)); 40 return false; 41 } 42 while ($row = mysqli_fetch_assoc($res)) 43 ; 44 mysqli_free_result($res); 45 46 clearstatcache(); 47 if (!file_exists($trace_file)) { 48 printf("[%03d][control string '%s'] Trace file has not been written.\n", 49 $offset + 3, 50 $control_string, 51 gettype($tmp), 52 $tmp); 53 return false; 54 } 55 56 return trim(substr(file_get_contents($trace_file), 0, 100024)); 57 } 58 59 $memory_funcs = array( 60 '_mysqlnd_ecalloc', 61 '_mysqlnd_emalloc', 62 '_mysqlnd_palloc_free_thd_cache_reference', 63 '_mysqlnd_pecalloc', 64 '_mysqlnd_pefree', 65 '_mysqlnd_pemalloc', 66 '_mysqlnd_perealloc', 67 ); 68 $trace_file = sprintf('%s%s%s', sys_get_temp_dir(), DIRECTORY_SEPARATOR, 'mysqli_debug_phpt.trace'); 69 70 $trace = try_control_string($link, 't:m:O,' . $trace_file, $trace_file, 10); 71 if (!strstr($trace, 'SELECT * FROM test') && !strstr($trace, 'mysql_real_query')) 72 printf("[015] SELECT query cannot be found in trace. Trace contents seems wrong.\n"); 73 74 $lines_trace = explode("\n", $trace); 75 $functions_trace = array(); 76 foreach ($lines_trace as $k => $line) { 77 $line = trim($line); 78 if (preg_match("@^[|\s]*>([\w:]+)@ism", $line, $matches)) { 79 $functions_trace[$matches[1]] = $matches[1]; 80 } 81 } 82 83 $found = 0; 84 foreach ($memory_funcs as $k => $name) 85 if (isset($functions_trace[$name])) 86 $found++; 87 88 if ($found < 1) { 89 printf("[016] Only %d memory functions have been found, expecting at least %d.\n", 90 $found, 1); 91 var_dump($trace); 92 } 93 94 $trace = try_control_string($link, 't:O,' . $trace_file, $trace_file, 20); 95 if (!strstr($trace, 'SELECT * FROM test') && !strstr($trace, 'mysql_real_query')) 96 printf("[025] SELECT query cannot be found in trace. Trace contents seems wrong.\n"); 97 98 $lines_trace = explode("\n", $trace); 99 $functions_trace = array(); 100 foreach ($lines_trace as $k => $line) { 101 $line = trim($line); 102 if (preg_match("@^[|\s]*>([\w:]+)@ism", $line, $matches)) { 103 $functions_trace[$matches[1]] = $matches[1]; 104 } 105 } 106 107 $found = 0; 108 foreach ($memory_funcs as $k => $name) 109 if (isset($functions_trace[$name])) 110 $found++; 111 112 if ($found > 2) { 113 printf("[026] More than %d memory functions have been recorded, that's strange.\n", 114 $found); 115 var_dump($trace); 116 } 117 118 mysqli_close($link); 119 @unlink($trace_file); 120 print "done!"; 121?> 122--CLEAN-- 123<?php 124require_once "clean_table.inc"; 125?> 126--EXPECT-- 127done! 128