home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / phpMyAdmin / libraries / dbi / mysqli.dbi.lib.php < prev   
Encoding:
PHP Script  |  2008-06-23  |  22.1 KB  |  704 lines

  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4.  * Interface to the improved MySQL extension (MySQLi)
  5.  *
  6.  * @version $Id: mysqli.dbi.lib.php 11326 2008-06-17 21:32:48Z lem9 $
  7.  */
  8. if (! defined('PHPMYADMIN')) {
  9.     exit;
  10. }
  11.  
  12. // MySQL client API
  13. if (!defined('PMA_MYSQL_CLIENT_API')) {
  14.     $client_api = explode('.', mysqli_get_client_info());
  15.     define('PMA_MYSQL_CLIENT_API', (int)sprintf('%d%02d%02d', $client_api[0], $client_api[1], intval($client_api[2])));
  16.     unset($client_api);
  17. }
  18.  
  19. /**
  20.  * some older mysql client libs are missing this constants ...
  21.  */
  22. if (! defined('MYSQLI_BINARY_FLAG')) {
  23.    define('MYSQLI_BINARY_FLAG', 128);
  24. }
  25.  
  26. /**
  27.  * @see http://bugs.php.net/36007
  28.  */
  29. if (! defined('MYSQLI_TYPE_NEWDECIMAL')) {
  30.     define('MYSQLI_TYPE_NEWDECIMAL', 246);
  31. }
  32. if (! defined('MYSQLI_TYPE_BIT')) {
  33.     define('MYSQLI_TYPE_BIT', 16);
  34. }
  35.  
  36. /**
  37.  * connects to the database server
  38.  *
  39.  * @uses    $GLOBALS['cfg']['Server']
  40.  * @uses    PMA_auth_fails()
  41.  * @uses    PMA_DBI_postConnect()
  42.  * @uses    MYSQLI_CLIENT_COMPRESS
  43.  * @uses    MYSQLI_OPT_LOCAL_INFILE
  44.  * @uses    strtolower()
  45.  * @uses    mysqli_init()
  46.  * @uses    mysqli_options()
  47.  * @uses    mysqli_real_connect()
  48.  * @uses    defined()
  49.  * @param   string  $user           mysql user name
  50.  * @param   string  $password       mysql user password
  51.  * @param   boolean $is_controluser
  52.  * @return  mixed   false on error or a mysqli object on success
  53.  */
  54. function PMA_DBI_connect($user, $password, $is_controluser = false)
  55. {
  56.     $server_port   = (empty($GLOBALS['cfg']['Server']['port']))
  57.                    ? false
  58.                    : (int) $GLOBALS['cfg']['Server']['port'];
  59.  
  60.     if (strtolower($GLOBALS['cfg']['Server']['connect_type']) == 'tcp') {
  61.         $GLOBALS['cfg']['Server']['socket'] = '';
  62.     }
  63.  
  64.     // NULL enables connection to the default socket
  65.     $server_socket = (empty($GLOBALS['cfg']['Server']['socket']))
  66.                    ? null
  67.                    : $GLOBALS['cfg']['Server']['socket'];
  68.  
  69.     $link = mysqli_init();
  70.  
  71.     mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
  72.  
  73.     $client_flags = 0;
  74.  
  75.     /* Optionally compress connection */
  76.     if ($GLOBALS['cfg']['Server']['compress'] && defined('MYSQLI_CLIENT_COMPRESS')) {
  77.         $client_flags |= MYSQLI_CLIENT_COMPRESS;
  78.     }
  79.  
  80.     /* Optionally enable SSL */
  81.     if ($GLOBALS['cfg']['Server']['ssl'] && defined('MYSQLI_CLIENT_SSL')) {
  82.         $client_flags |= MYSQLI_CLIENT_SSL;
  83.     }
  84.  
  85.     $return_value = @mysqli_real_connect($link, $GLOBALS['cfg']['Server']['host'], $user, $password, false, $server_port, $server_socket, $client_flags);
  86.  
  87.     // Retry with empty password if we're allowed to
  88.     if ($return_value == false && isset($cfg['Server']['nopassword']) && $cfg['Server']['nopassword'] && !$is_controluser) {
  89.         $return_value = @mysqli_real_connect($link, $GLOBALS['cfg']['Server']['host'], $user, '', false, $server_port, $server_socket, $client_flags);
  90.     }
  91.  
  92.     if ($return_value == false) {
  93.         if ($is_controluser) {
  94.             if (! defined('PMA_DBI_CONNECT_FAILED_CONTROLUSER')) {
  95.                 define('PMA_DBI_CONNECT_FAILED_CONTROLUSER', true);
  96.             }
  97.             return false;
  98.         }
  99.         PMA_auth_fails();
  100.     } // end if
  101.  
  102.     PMA_DBI_postConnect($link, $is_controluser);
  103.  
  104.     return $link;
  105. }
  106.  
  107. /**
  108.  * selects given database
  109.  *
  110.  * @uses    $GLOBALS['userlink']
  111.  * @uses    PMA_MYSQL_INT_VERSION
  112.  * @uses    PMA_convert_charset()
  113.  * @uses    mysqli_select_db()
  114.  * @param   string          $dbname database name to select
  115.  * @param   object mysqli   $link   the mysli object
  116.  * @return  boolean         treu or false
  117.  */
  118. function PMA_DBI_select_db($dbname, $link = null)
  119. {
  120.     if (empty($link)) {
  121.         if (isset($GLOBALS['userlink'])) {
  122.             $link = $GLOBALS['userlink'];
  123.         } else {
  124.             return false;
  125.         }
  126.     }
  127.     if (PMA_MYSQL_INT_VERSION < 40100) {
  128.         $dbname = PMA_convert_charset($dbname);
  129.     }
  130.     return mysqli_select_db($link, $dbname);
  131. }
  132.  
  133. /**
  134.  * runs a query and returns the result
  135.  *
  136.  * @uses    PMA_DBI_QUERY_STORE
  137.  * @uses    PMA_DBI_QUERY_UNBUFFERED
  138.  * @uses    PMA_MYSQL_INT_VERSION
  139.  * @uses    $GLOBALS['userlink']
  140.  * @uses    PMA_convert_charset()
  141.  * @uses    MYSQLI_STORE_RESULT
  142.  * @uses    MYSQLI_USE_RESULT
  143.  * @uses    mysqli_query()
  144.  * @uses    defined()
  145.  * @param   string          $query      query to execute
  146.  * @param   object mysqli   $link       mysqli object
  147.  * @param   integer         $options
  148.  * @return  mixed           true, false or result object
  149.  */
  150. function PMA_DBI_try_query($query, $link = null, $options = 0)
  151. {
  152.     if ($options == ($options | PMA_DBI_QUERY_STORE)) {
  153.         $method = MYSQLI_STORE_RESULT;
  154.     } elseif ($options == ($options | PMA_DBI_QUERY_UNBUFFERED)) {
  155.         $method = MYSQLI_USE_RESULT;
  156.     } else {
  157.         $method = 0;
  158.     }
  159.  
  160.     if (empty($link)) {
  161.         if (isset($GLOBALS['userlink'])) {
  162.             $link = $GLOBALS['userlink'];
  163.         } else {
  164.             return false;
  165.         }
  166.     }
  167.     if (defined('PMA_MYSQL_INT_VERSION') && PMA_MYSQL_INT_VERSION < 40100) {
  168.         $query = PMA_convert_charset($query);
  169.     }
  170.     return mysqli_query($link, $query, $method);
  171.  
  172.     // From the PHP manual:
  173.     // "note: returns true on success or false on failure. For SELECT,
  174.     // SHOW, DESCRIBE or EXPLAIN, mysqli_query() will return a result object"
  175.     // so, do not use the return value to feed mysqli_num_rows() if it's
  176.     // a boolean
  177. }
  178.  
  179. /**
  180.  * returns $type array of rows from given $result
  181.  *
  182.  * The following function is meant for internal use only.
  183.  * Do not call it from outside this library!
  184.  *
  185.  * @uses    $GLOBALS['allow_recoding']
  186.  * @uses    $GLOBALS['cfg']['AllowAnywhereRecoding']
  187.  * @uses    PMA_MYSQL_INT_VERSION
  188.  * @uses    PMA_DBI_get_fields_meta()
  189.  * @uses    PMA_convert_display_charset()
  190.  * @uses    mysqli_fetch_array()
  191.  * @uses    mysqli_num_fields()
  192.  * @uses    stristr()
  193.  * @param   object mysqli result    $result
  194.  * @param   integer                 $type   ASSOC, BOTH, or NUMERIC array
  195.  * @return  array                   results
  196.  * @access  protected
  197.  */
  198. function PMA_mysqli_fetch_array($result, $type = false)
  199. {
  200.     if ($type != false) {
  201.         $data = @mysqli_fetch_array($result, $type);
  202.     } else {
  203.         $data = @mysqli_fetch_array($result);
  204.     }
  205.  
  206.     /* No data returned => do not touch it */
  207.     if (! $data) {
  208.         return $data;
  209.     }
  210.  
  211.     if (!defined('PMA_MYSQL_INT_VERSION') || PMA_MYSQL_INT_VERSION >= 40100
  212.       || !(isset($GLOBALS['cfg']['AllowAnywhereRecoding'])
  213.         && $GLOBALS['cfg']['AllowAnywhereRecoding']
  214.         && $GLOBALS['allow_recoding'])) {
  215.         /* No recoding -> return data as we got them */
  216.         return $data;
  217.     }
  218.  
  219.     $ret    = array();
  220.     $num    = mysqli_num_fields($result);
  221.     if ($num > 0) {
  222.         $fields = PMA_DBI_get_fields_meta($result);
  223.     }
  224.     // sometimes, mysqli_fetch_fields() does not return results
  225.     // (as seen in PHP 5.1.0-dev), so for now, return $data unchanged
  226.     if (!$fields) {
  227.         return $data;
  228.     }
  229.     $i = 0;
  230.     for ($i = 0; $i < $num; $i++) {
  231.         if (!isset($fields[$i]->type)) {
  232.             /* No meta information available -> we guess that it should be
  233.              * converted */
  234.             if (isset($data[$i])) {
  235.                 $ret[$i] = PMA_convert_display_charset($data[$i]);
  236.             }
  237.             if (isset($fields[$i]->name) && isset($data[$fields[$i]->name])) {
  238.                 $ret[PMA_convert_display_charset($fields[$i]->name)] =
  239.                     PMA_convert_display_charset($data[$fields[$i]->name]);
  240.             }
  241.         } else {
  242.             /* Meta information available -> check type of field and convert
  243.              * it according to the type */
  244.             if (stristr($fields[$i]->type, 'BLOB')
  245.               || stristr($fields[$i]->type, 'BINARY')) {
  246.                 if (isset($data[$i])) {
  247.                     $ret[$i] = $data[$i];
  248.                 }
  249.                 if (isset($data[$fields[$i]->name])) {
  250.                     $ret[PMA_convert_display_charset($fields[$i]->name)] =
  251.                         $data[$fields[$i]->name];
  252.                 }
  253.             } else {
  254.                 if (isset($data[$i])) {
  255.                     $ret[$i] = PMA_convert_display_charset($data[$i]);
  256.                 }
  257.                 if (isset($data[$fields[$i]->name])) {
  258.                     $ret[PMA_convert_display_charset($fields[$i]->name)] =
  259.                         PMA_convert_display_charset($data[$fields[$i]->name]);
  260.                 }
  261.             }
  262.         }
  263.     }
  264.     return $ret;
  265. }
  266.  
  267. /**
  268.  * returns array of rows with associative and numeric keys from $result
  269.  *
  270.  * @uses    PMA_mysqli_fetch_array()
  271.  * @uses    MYSQLI_BOTH
  272.  * @param   object mysqli result    $result
  273.  * @return  array                   result rows
  274.  */
  275. function PMA_DBI_fetch_array($result)
  276. {
  277.     return PMA_mysqli_fetch_array($result, MYSQLI_BOTH);
  278. }
  279.  
  280. /**
  281.  * returns array of rows with associative keys from $result
  282.  *
  283.  * @uses    PMA_mysqli_fetch_array()
  284.  * @uses    MYSQLI_ASSOC
  285.  * @param   object mysqli result    $result
  286.  * @return  array                   result rows
  287.  */
  288. function PMA_DBI_fetch_assoc($result)
  289. {
  290.     return PMA_mysqli_fetch_array($result, MYSQLI_ASSOC);
  291. }
  292.  
  293. /**
  294.  * returns array of rows with numeric keys from $result
  295.  *
  296.  * @uses    PMA_mysqli_fetch_array()
  297.  * @uses    MYSQLI_NUM
  298.  * @param   object mysqli result    $result
  299.  * @return  array                   result rows
  300.  */
  301. function PMA_DBI_fetch_row($result)
  302. {
  303.     return PMA_mysqli_fetch_array($result, MYSQLI_NUM);
  304. }
  305.  
  306. /**
  307.  * Frees the memory associated with the results
  308.  *
  309.  * @uses    mysqli_result
  310.  * @uses    func_get_args()
  311.  * @uses    is_object()
  312.  * @uses    mysqli_free_result()
  313.  * @param   result  $result,...     one or more mysql result resources
  314.  */
  315. function PMA_DBI_free_result()
  316. {
  317.     foreach (func_get_args() as $result) {
  318.         if ($result instanceof mysqli_result) {
  319.             mysqli_free_result($result);
  320.         }
  321.     }
  322. }
  323.  
  324. /**
  325.  * Returns a string representing the type of connection used
  326.  * @uses    mysqli_get_host_info()
  327.  * @uses    $GLOBALS['userlink']    as default for $link
  328.  * @param   resource        $link   mysql link
  329.  * @return  string          type of connection used
  330.  */
  331. function PMA_DBI_get_host_info($link = null)
  332. {
  333.     if (null === $link) {
  334.         if (isset($GLOBALS['userlink'])) {
  335.             $link = $GLOBALS['userlink'];
  336.         } else {
  337.             return false;
  338.         }
  339.     }
  340.     return mysqli_get_host_info($link);
  341. }
  342.  
  343. /**
  344.  * Returns the version of the MySQL protocol used
  345.  * @uses    mysqli_get_proto_info()
  346.  * @uses    $GLOBALS['userlink']    as default for $link
  347.  * @param   resource        $link   mysql link
  348.  * @return  integer         version of the MySQL protocol used
  349.  */
  350. function PMA_DBI_get_proto_info($link = null)
  351. {
  352.     if (null === $link) {
  353.         if (isset($GLOBALS['userlink'])) {
  354.             $link = $GLOBALS['userlink'];
  355.         } else {
  356.             return false;
  357.         }
  358.     }
  359.     return mysqli_get_proto_info($link);
  360. }
  361.  
  362. /**
  363.  * returns a string that represents the client library version
  364.  * @uses    mysqli_get_client_info()
  365.  * @return  string          MySQL client library version
  366.  */
  367. function PMA_DBI_get_client_info()
  368. {
  369.     return mysqli_get_client_info();
  370. }
  371.  
  372. /**
  373.  * returns last error message or false if no errors occured
  374.  *
  375.  * @uses    PMA_MYSQL_INT_VERSION
  376.  * @uses    PMA_convert_display_charset()
  377.  * @uses    PMA_DBI_convert_message()
  378.  * @uses    $GLOBALS['errno']
  379.  * @uses    $GLOBALS['userlink']
  380.  * @uses    $GLOBALS['strServerNotResponding']
  381.  * @uses    $GLOBALS['strSocketProblem']
  382.  * @uses    mysqli_errno()
  383.  * @uses    mysqli_error()
  384.  * @uses    mysqli_connect_errno()
  385.  * @uses    mysqli_connect_error()
  386.  * @uses    defined()
  387.  * @param   resource        $link   mysql link
  388.  * @return  string|boolean  $error or false
  389.  */
  390. function PMA_DBI_getError($link = null)
  391. {
  392.     $GLOBALS['errno'] = 0;
  393.  
  394.     if (null === $link && isset($GLOBALS['userlink'])) {
  395.         $link =& $GLOBALS['userlink'];
  396.         // Do not stop now. We still can get the error code
  397.         // with mysqli_connect_errno()
  398. //    } else {
  399. //        return false;
  400.     }
  401.  
  402.     if (null !== $link) {
  403.         $error_number = mysqli_errno($link);
  404.         $error_message = mysqli_error($link);
  405.     } else {
  406.         $error_number = mysqli_connect_errno();
  407.         $error_message = mysqli_connect_error();
  408.     }
  409.     if (0 == $error_number) {
  410.         return false;
  411.     }
  412.  
  413.     // keep the error number for further check after the call to PMA_DBI_getError()
  414.     $GLOBALS['errno'] = $error_number;
  415.  
  416.     if (! empty($error_message)) {
  417.         $error_message = PMA_DBI_convert_message($error_message);
  418.     }
  419.  
  420.     if ($error_number == 2002) {
  421.         $error = '#' . ((string) $error_number) . ' - ' . $GLOBALS['strServerNotResponding'] . ' ' . $GLOBALS['strSocketProblem'];
  422.     } elseif (defined('PMA_MYSQL_INT_VERSION') && PMA_MYSQL_INT_VERSION >= 40100) {
  423.         $error = '#' . ((string) $error_number) . ' - ' . $error_message;
  424.     } else {
  425.         $error = '#' . ((string) $error_number) . ' - ' . PMA_convert_display_charset($error_message);
  426.     }
  427.     return $error;
  428. }
  429.  
  430. /**
  431.  * closes given database $link or $GLOBALS['userlink']
  432.  *
  433.  * @uses    $GLOBALS['userlink']
  434.  * @uses    mysqli_close()
  435.  * @param   object mysqli   $link   the mysqli object
  436.  * @return  boolean         treu or false
  437.  */
  438. function PMA_DBI_close($link = null)
  439. {
  440.     if (empty($link)) {
  441.         if (isset($GLOBALS['userlink'])) {
  442.             $link = $GLOBALS['userlink'];
  443.         } else {
  444.             return false;
  445.         }
  446.     }
  447.     return @mysqli_close($link);
  448. }
  449.  
  450. /**
  451.  *
  452.  * @param   object mysqli result    $result
  453.  */
  454. function PMA_DBI_num_rows($result)
  455. {
  456.     // see the note for PMA_DBI_try_query();
  457.     if (!is_bool($result)) {
  458.         return @mysqli_num_rows($result);
  459.     } else {
  460.         return 0;
  461.     }
  462. }
  463.  
  464. /**
  465.  * returns last inserted auto_increment id for given $link or $GLOBALS['userlink']
  466.  *
  467.  * @uses    $GLOBALS['userlink']
  468.  * @uses    mysqli_insert_id()
  469.  * @param   object mysqli   $link   the mysqli object
  470.  * @return  string ineteger
  471.  */
  472. function PMA_DBI_insert_id($link = '')
  473. {
  474.     if (empty($link)) {
  475.         if (isset($GLOBALS['userlink'])) {
  476.             $link = $GLOBALS['userlink'];
  477.         } else {
  478.             return false;
  479.         }
  480.     }
  481.     return mysqli_insert_id($link);
  482. }
  483.  
  484. /**
  485.  * returns the number of rows affected by last query
  486.  *
  487.  * @uses    $GLOBALS['userlink']
  488.  * @uses    mysqli_affected_rows()
  489.  * @param   object mysqli   $link   the mysqli object
  490.  * @return  string integer
  491.  */
  492. function PMA_DBI_affected_rows($link = null)
  493. {
  494.     if (empty($link)) {
  495.         if (isset($GLOBALS['userlink'])) {
  496.             $link = $GLOBALS['userlink'];
  497.         } else {
  498.             return false;
  499.         }
  500.     }
  501.     return mysqli_affected_rows($link);
  502. }
  503.  
  504. /**
  505.  * returns metainfo for fields in $result
  506.  *
  507.  * @todo preserve orignal flags value
  508.  * @uses    PMA_DBI_field_flags()
  509.  * @uses    MYSQLI_TYPE_*
  510.  * @uses    MYSQLI_MULTIPLE_KEY_FLAG
  511.  * @uses    MYSQLI_PRI_KEY_FLAG
  512.  * @uses    MYSQLI_UNIQUE_KEY_FLAG
  513.  * @uses    MYSQLI_NOT_NULL_FLAG
  514.  * @uses    MYSQLI_UNSIGNED_FLAG
  515.  * @uses    MYSQLI_ZEROFILL_FLAG
  516.  * @uses    MYSQLI_NUM_FLAG
  517.  * @uses    MYSQLI_TYPE_BLOB
  518.  * @uses    MYSQLI_BLOB_FLAG
  519.  * @uses    defined()
  520.  * @uses    mysqli_fetch_fields()
  521.  * @uses    is_array()
  522.  * @param   object mysqli result    $result
  523.  * @return  array                   meta info for fields in $result
  524.  */
  525. function PMA_DBI_get_fields_meta($result)
  526. {
  527.     // Build an associative array for a type look up
  528.     $typeAr = array();
  529.     $typeAr[MYSQLI_TYPE_DECIMAL]     = 'real';
  530.     $typeAr[MYSQLI_TYPE_NEWDECIMAL]  = 'real';
  531.     $typeAr[MYSQLI_TYPE_BIT]         = 'int';
  532.     $typeAr[MYSQLI_TYPE_TINY]        = 'int';
  533.     $typeAr[MYSQLI_TYPE_SHORT]       = 'int';
  534.     $typeAr[MYSQLI_TYPE_LONG]        = 'int';
  535.     $typeAr[MYSQLI_TYPE_FLOAT]       = 'real';
  536.     $typeAr[MYSQLI_TYPE_DOUBLE]      = 'real';
  537.     $typeAr[MYSQLI_TYPE_NULL]        = 'null';
  538.     $typeAr[MYSQLI_TYPE_TIMESTAMP]   = 'timestamp';
  539.     $typeAr[MYSQLI_TYPE_LONGLONG]    = 'int';
  540.     $typeAr[MYSQLI_TYPE_INT24]       = 'int';
  541.     $typeAr[MYSQLI_TYPE_DATE]        = 'date';
  542.     $typeAr[MYSQLI_TYPE_TIME]        = 'time';
  543.     $typeAr[MYSQLI_TYPE_DATETIME]    = 'datetime';
  544.     $typeAr[MYSQLI_TYPE_YEAR]        = 'year';
  545.     $typeAr[MYSQLI_TYPE_NEWDATE]     = 'date';
  546.     $typeAr[MYSQLI_TYPE_ENUM]        = 'unknown';
  547.     $typeAr[MYSQLI_TYPE_SET]         = 'unknown';
  548.     $typeAr[MYSQLI_TYPE_TINY_BLOB]   = 'blob';
  549.     $typeAr[MYSQLI_TYPE_MEDIUM_BLOB] = 'blob';
  550.     $typeAr[MYSQLI_TYPE_LONG_BLOB]   = 'blob';
  551.     $typeAr[MYSQLI_TYPE_BLOB]        = 'blob';
  552.     $typeAr[MYSQLI_TYPE_VAR_STRING]  = 'string';
  553.     $typeAr[MYSQLI_TYPE_STRING]      = 'string';
  554.     // MySQL returns MYSQLI_TYPE_STRING for CHAR
  555.     // and MYSQLI_TYPE_CHAR === MYSQLI_TYPE_TINY
  556.     // so this would override TINYINT and mark all TINYINT as string
  557.     // https://sf.net/tracker/?func=detail&aid=1532111&group_id=23067&atid=377408
  558.     //$typeAr[MYSQLI_TYPE_CHAR]        = 'string';
  559.     $typeAr[MYSQLI_TYPE_GEOMETRY]    = 'unknown';
  560.     $typeAr[MYSQLI_TYPE_BIT]         = 'bit';
  561.  
  562.     $fields = mysqli_fetch_fields($result);
  563.  
  564.     // this happens sometimes (seen under MySQL 4.0.25)
  565.     if (!is_array($fields)) {
  566.         return false;
  567.     }
  568.  
  569.     foreach ($fields as $k => $field) {
  570.         $fields[$k]->_type = $field->type;
  571.         $fields[$k]->type = $typeAr[$field->type];
  572.         $fields[$k]->_flags = $field->flags;
  573.         $fields[$k]->flags = PMA_DBI_field_flags($result, $k);
  574.  
  575.         // Enhance the field objects for mysql-extension compatibilty
  576.         //$flags = explode(' ', $fields[$k]->flags);
  577.         //array_unshift($flags, 'dummy');
  578.         $fields[$k]->multiple_key
  579.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_MULTIPLE_KEY_FLAG);
  580.         $fields[$k]->primary_key
  581.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_PRI_KEY_FLAG);
  582.         $fields[$k]->unique_key
  583.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_UNIQUE_KEY_FLAG);
  584.         $fields[$k]->not_null
  585.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_NOT_NULL_FLAG);
  586.         $fields[$k]->unsigned
  587.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_UNSIGNED_FLAG);
  588.         $fields[$k]->zerofill
  589.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_ZEROFILL_FLAG);
  590.         $fields[$k]->numeric
  591.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_NUM_FLAG);
  592.         $fields[$k]->blob
  593.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_BLOB_FLAG);
  594.     }
  595.     return $fields;
  596. }
  597.  
  598. /**
  599.  * return number of fields in given $result
  600.  *
  601.  * @param   object mysqli result    $result
  602.  * @return  integer                 field count
  603.  */
  604. function PMA_DBI_num_fields($result)
  605. {
  606.     return mysqli_num_fields($result);
  607. }
  608.  
  609. /**
  610.  * returns the length of the given field $i in $result
  611.  *
  612.  * @uses    mysqli_fetch_field_direct()
  613.  * @param   object mysqli result    $result
  614.  * @param   integer                 $i      field
  615.  * @return  integer                 length of field
  616.  */
  617. function PMA_DBI_field_len($result, $i)
  618. {
  619.     $info = mysqli_fetch_field_direct($result, $i);
  620.     // stdClass::$length will be integrated in
  621.     // mysqli-ext when mysql4.1 has been released.
  622.     return @$info->length;
  623. }
  624.  
  625. /**
  626.  * returns name of $i. field in $result
  627.  *
  628.  * @uses    mysqli_fetch_field_direct()
  629.  * @param   object mysqli result    $result
  630.  * @param   integer                 $i      field
  631.  * @return  string                  name of $i. field in $result
  632.  */
  633. function PMA_DBI_field_name($result, $i)
  634. {
  635.     $info = mysqli_fetch_field_direct($result, $i);
  636.     return $info->name;
  637. }
  638.  
  639. /**
  640.  * returns concatenated string of human readable field flags
  641.  *
  642.  * @uses    MYSQLI_UNIQUE_KEY_FLAG
  643.  * @uses    MYSQLI_NUM_FLAG
  644.  * @uses    MYSQLI_PART_KEY_FLAG
  645.  * @uses    MYSQLI_TYPE_SET
  646.  * @uses    MYSQLI_TIMESTAMP_FLAG
  647.  * @uses    MYSQLI_AUTO_INCREMENT_FLAG
  648.  * @uses    MYSQLI_TYPE_ENUM
  649.  * @uses    MYSQLI_ZEROFILL_FLAG
  650.  * @uses    MYSQLI_UNSIGNED_FLAG
  651.  * @uses    MYSQLI_BLOB_FLAG
  652.  * @uses    MYSQLI_MULTIPLE_KEY_FLAG
  653.  * @uses    MYSQLI_UNIQUE_KEY_FLAG
  654.  * @uses    MYSQLI_PRI_KEY_FLAG
  655.  * @uses    MYSQLI_NOT_NULL_FLAG
  656.  * @uses    MYSQLI_TYPE_TINY_BLOB 
  657.  * @uses    MYSQLI_TYPE_BLOB
  658.  * @uses    MYSQLI_TYPE_MEDIUM_BLOB  
  659.  * @uses    MYSQLI_TYPE_LONG_BLOB 
  660.  * @uses    MYSQLI_TYPE_VAR_STRING  
  661.  * @uses    MYSQLI_TYPE_STRING
  662.  * @uses    mysqli_fetch_field_direct()
  663.  * @uses    PMA_convert_display_charset()
  664.  * @param   object mysqli result    $result
  665.  * @param   integer                 $i      field
  666.  * @return  string                  field flags
  667.  */
  668. function PMA_DBI_field_flags($result, $i)
  669. {
  670.     // This is missing from PHP 5.2.5, see http://bugs.php.net/bug.php?id=44846
  671.     if (! defined('MYSQLI_ENUM_FLAG')) {
  672.         define('MYSQLI_ENUM_FLAG', 256); // see MySQL source include/mysql_com.h
  673.     }
  674.     $f = mysqli_fetch_field_direct($result, $i);
  675.     $type = $f->type;
  676.     $charsetnr = $f->charsetnr;
  677.     $f = $f->flags;
  678.     $flags = '';
  679.     if ($f & MYSQLI_UNIQUE_KEY_FLAG)     { $flags .= 'unique ';}
  680.     if ($f & MYSQLI_NUM_FLAG)            { $flags .= 'num ';}
  681.     if ($f & MYSQLI_PART_KEY_FLAG)       { $flags .= 'part_key ';}
  682.     if ($f & MYSQLI_SET_FLAG)            { $flags .= 'set ';}
  683.     if ($f & MYSQLI_TIMESTAMP_FLAG)      { $flags .= 'timestamp ';}
  684.     if ($f & MYSQLI_AUTO_INCREMENT_FLAG) { $flags .= 'auto_increment ';}
  685.     if ($f & MYSQLI_ENUM_FLAG)           { $flags .= 'enum ';}
  686.     // See http://dev.mysql.com/doc/refman/6.0/en/c-api-datatypes.html:
  687.     // to determine if a string is binary, we should not use MYSQLI_BINARY_FLAG
  688.     // but instead the charsetnr member of the MYSQL_FIELD
  689.     // structure. Watch out: some types like DATE returns 63 in charsetnr
  690.     // so we have to check also the type.
  691.     // Unfortunately there is no equivalent in the mysql extension.
  692.     if (($type == MYSQLI_TYPE_TINY_BLOB || $type == MYSQLI_TYPE_BLOB || $type == MYSQLI_TYPE_MEDIUM_BLOB || $type == MYSQLI_TYPE_LONG_BLOB || $type == MYSQLI_TYPE_VAR_STRING || $type == MYSQLI_TYPE_STRING) && 63 == $charsetnr)                { $flags .= 'binary ';}
  693.     if ($f & MYSQLI_ZEROFILL_FLAG)       { $flags .= 'zerofill ';}
  694.     if ($f & MYSQLI_UNSIGNED_FLAG)       { $flags .= 'unsigned ';}
  695.     if ($f & MYSQLI_BLOB_FLAG)           { $flags .= 'blob ';}
  696.     if ($f & MYSQLI_MULTIPLE_KEY_FLAG)   { $flags .= 'multiple_key ';}
  697.     if ($f & MYSQLI_UNIQUE_KEY_FLAG)     { $flags .= 'unique_key ';}
  698.     if ($f & MYSQLI_PRI_KEY_FLAG)        { $flags .= 'primary_key ';}
  699.     if ($f & MYSQLI_NOT_NULL_FLAG)       { $flags .= 'not_null ';}
  700.     return PMA_convert_display_charset(trim($flags));
  701. }
  702.  
  703. ?>
  704.