1--TEST-- 2mysqli_fetch_field() - data types/field->type 3--SKIPIF-- 4<?php 5require_once('skipif.inc'); 6require_once('skipifemb.inc'); 7require_once('skipifconnectfailure.inc'); 8?> 9--FILE-- 10<?php 11 require('table.inc'); 12 13 function mysqli_field_datatypes($link, $sql_type, $php_value, $php_type, $datatypes, $default_charset="latin1") { 14 if (!mysqli_query($link, "DROP TABLE IF EXISTS test")) { 15 printf("[001] %s, [%d] %s\n", $sql_type, 16 mysqli_errno($link), mysqli_error($link)); 17 return false; 18 } 19 20 $create = sprintf("CREATE TABLE test(id %s) DEFAULT CHARSET %s", $sql_type, $default_charset); 21 if (!mysqli_query($link, $create)) { 22 printf("[002] '%s' - '%s', [%d] %s\n", $sql_type, $create, 23 mysqli_errno($link), mysqli_error($link)); 24 return false; 25 } 26 27 if (is_string($php_value)) 28 $sql = sprintf("INSERT INTO test(id) VALUES ('%s')", $php_value); 29 else 30 $sql = sprintf("INSERT INTO test(id) VALUES (%s)", $php_value); 31 32 if (!mysqli_query($link, $sql)) { 33 printf("[003] '%s' - '%s' - '%s', [%d] %s\n", $sql_type, $create, $sql, 34 mysqli_errno($link), mysqli_error($link)); 35 return false; 36 } 37 38 if (!$res = mysqli_query($link, 'SELECT id FROM test')) { 39 printf("[004] %s, [%d] %s\n", $sql_type, 40 mysqli_errno($link), mysqli_error($link)); 41 return false; 42 } 43 44 if (!is_object($field = mysqli_fetch_field($res))) { 45 printf("[004] %s, expecting object got %s, [%d] %s\n", $sql_type, 46 gettype($field), 47 mysqli_errno($link), mysqli_error($link)); 48 return false; 49 } 50 51 if ($field->type != $php_type) { 52 $code_name = 'unknown'; 53 foreach ($datatypes as $k => $v) { 54 if ($k == $field->type) { 55 $code_name = (is_array($v)) ? $v[0] : $v; 56 break; 57 } 58 } 59 printf("[006] Expecting %d for %s got code %d for %s\n", 60 $php_type, $sql_type, $field->type, $code_name); 61 return false; 62 } 63 64 return true; 65 } 66 67 $datatypes = array( 68 MYSQLI_TYPE_TINY => array('TINYINT', 5), 69 MYSQLI_TYPE_SHORT => array('SMALLINT', 10), 70 MYSQLI_TYPE_LONG => 'MYSQLI_TYPE_LONG - TODO add testing', 71 MYSQLI_TYPE_FLOAT => array('FLOAT', '1.3'), 72 MYSQLI_TYPE_DOUBLE => array('DOUBLE', '1.4'), 73 MYSQLI_TYPE_TIMESTAMP => array('TIMESTAMP', '2007-08-20 18:34:00'), 74 MYSQLI_TYPE_LONGLONG => array('BIGINT', 100), 75 MYSQLI_TYPE_INT24 => array('MEDIUMINT', 10), 76 MYSQLI_TYPE_DATE => array('DATE', '2007-08-20'), 77 MYSQLI_TYPE_TIME => array('TIME', '18:41:38'), 78 MYSQLI_TYPE_DATETIME => array('DATETIME', '2007-08-20 18:42:01'), 79 MYSQLI_TYPE_YEAR => array('YEAR', '2007'), 80 MYSQLI_TYPE_ENUM => array('ENUM("everything", "is", "just", "wonderful")', 'is'), 81 // MYSQLI_TYPE_SET => array('SET("I", "smash", "the")', 'I,smash,the'), - string 82 // MYSQLI_TYPE_TINY_BLOB => array("TINYBLOB", "I got a tiny blog"), - blob 83 // MYSQLI_TYPE_MEDIUM_BLOB => array("MEDIUMBLOB", "No blob for masses"), - blob 84 // MYSQLI_TYPE_LONG_BLOB => array("LONGBLOB", "Small is beautiful?"), - blob 85 MYSQLI_TYPE_BLOB => array("LONGBLOB", 'MySQL does not report proper type. Use Length to distinct BLOB types'), 86 MYSQLI_TYPE_BLOB => array("MEDIUMBLOB", 'MySQL does not report proper type. Use Length to distinct BLOB types'), 87 MYSQLI_TYPE_BLOB => array("TINYBLOB", 'MySQL does not report proper type. Use Length to distinct BLOB types'), 88 MYSQLI_TYPE_BLOB => array("BLOB", 'silly'), 89 MYSQLI_TYPE_VAR_STRING => array("VARCHAR(32768)", 'varchar'), 90 MYSQLI_TYPE_STRING => 'MYSQLI_TYPE_STRING - TODO add testing', 91 MYSQLI_TYPE_STRING => array('CHAR(1)', 'a'), 92 MYSQLI_TYPE_STRING => array("SET('I', 'smash', 'the')", 'smash'), 93 MYSQLI_TYPE_NULL => 'MYSQLI_TYPE_NULL - TODO add testing', 94 MYSQLI_TYPE_NEWDATE => 'MYSQLI_TYPE_NEWDATE - TODO add testing', 95 MYSQLI_TYPE_INTERVAL => 'MYSQLI_TYPE_INTERVAL - TODO add testing', 96 MYSQLI_TYPE_GEOMETRY => 'MYSQLI_TYPE_GEOMETRY - TODO add testing', 97 ); 98 99 if ($IS_MYSQLND) { 100 $version = 50007 + 1; 101 } else { 102 $version = mysqli_get_client_version(); 103 } 104 105 if ($version > 50002) { 106 $datatypes[MYSQLI_TYPE_NEWDECIMAL] = array('DECIMAL', '1.1'); 107 $datatypes[MYSQLI_TYPE_BIT] = array('BIT', 0); 108 } else { 109 $datatypes[MYSQLI_TYPE_DECIMAL] = array('DECIMAL', '1.1'); 110 } 111 112 foreach ($datatypes as $php_type => $datatype) { 113 if (is_array($datatype)) 114 mysqli_field_datatypes($link, $datatype[0], $datatype[1], $php_type, $datatypes); 115 } 116 117 mysqli_close($link); 118 119 print "done!"; 120?> 121--CLEAN-- 122<?php 123 require_once("clean_table.inc"); 124?> 125--EXPECTF-- 126done!