如何使用SQL查询获取字段标志名称

时间:2015-06-18 10:30:52

标签: php mysql mysqli

实际上我想显示属于表的所有字段的标志名称。这是我们的脚本,我正在执行此操作。

<?php 
mysql_connect("localhost", "root", ""); 
mysql_select_db("DatabaseName"); 
$result = mysql_query("SELECT * FROM Table_Name"); 
$fields = mysql_num_fields($result); 
for ($i=0; $i < $fields; $i++) { 
    $flags = mysql_field_flags($result, $i); echo $flags . "<br>";
} 
mysql_free_result($result); 
mysql_close();
?>

这很好用,但问题是这个脚本是mysql版本但我想要mysqli版本的脚本。有没有办法通过mysqli版本的脚本执行相同的操作。

而且问题是 - 这个脚本在for循环中使用offset值。是否可以在没有flags

的情况下显示offset value

或者我们可以使用offset value来使用字段名称吗?

2 个答案:

答案 0 :(得分:0)

尝试与此内联的内容

if($field_flags == false) {
    for($j=0; $j<$num_fields; $j++) {
        $field_flags[$j] = mysqli_fetch_field_direct($result, $j);
        if(strpos($field_flags[$j]->flags, 'NOT_NULL') !== false) {
           //Do something here
        } else {
           //Do something else
    }
}

或看到这个

How can this be done with the same result using mysqli?

答案 1 :(得分:0)

这将获取标志

$mysqli=new mysqli('localhost','root','','database');
$result=$mysqli->query('SELECT * FROM table');
while($meta = mysqli_fetch_field($result)){
    $flags=$meta->flags;
    echo $flags."<br>";
    print_r(get_flag1($flags));
    echo '<br/>';
    print_r(get_flag2($flags));
    echo '<br/>';
}

function get_flag1($flag_value){
    $result['NOT_NULL_FLAG'] = 1&$flag_value?1:0;
    $result['PRI_KEY_FLAG'] = 2&$flag_value?1:0;
    $result['UNIQUE_KEY_FLAG'] = 4&$flag_value?1:0;
    $result['BLOB_FLAG'] = 16&$flag_value?1:0;
    $result['UNSIGNED_FLAG'] = 32&$flag_value?1:0;
    $result['ZEROFILL_FLAG'] = 64&$flag_value?1:0;
    $result['BINARY_FLAG'] = 128&$flag_value?1:0;
    $result['ENUM_FLAG'] = 256&$flag_value?1:0;
    $result['AUTO_INCREMENT_FLAG'] = 512&$flag_value?1:0;
    $result['TIMESTAMP_FLAG'] = 1024&$flag_value?1:0;
    $result['SET_FLAG'] = 2048&$flag_value?1:0;
    $result['NUM_FLAG'] = 32768&$flag_value?1:0;
    $result['PART_KEY_FLAG'] = 16384&$flag_value?1:0;
    $result['GROUP_FLAG'] = 32768&$flag_value?1:0;
    $result['UNIQUE_FLAG'] = 65536&$flag_value?1:0;
    return $result;
}

function get_flag2($flag_value){
    if(1&$flag_value)
        $result[]='NOT_NULL_FLAG';
    if(2&$flag_value)
        $result[]='PRI_KEY_FLAG';
    if(4&$flag_value)
        $result[]='UNIQUE_KEY_FLAG';
    if(16&$flag_value)
        $result[]='BLOB_FLAG';
    if(32&$flag_value)
        $result[]='UNSIGNED_FLAG';
    if(64&$flag_value)
        $result[]='ZEROFILL_FLAG';
    if(128&$flag_value)
        $result[]='BINARY_FLAG';
    if(256&$flag_value)
        $result[]='ENUM_FLAG';
    if(512&$flag_value)
        $result[]='AUTO_INCREMENT_FLAG';
    if(1024&$flag_value)
        $result[]='TIMESTAMP_FLAG';
    if(2048&$flag_value)
        $result[]='SET_FLAG';
    if(32768&$flag_value)
        $result[]='NUM_FLAG';
    if(16384&$flag_value)
        $result[]='PART_KEY_FLAG';
    if(32768&$flag_value)
        $result[]='GROUP_FLAG';
    if(65536&$flag_value)
        $result[]='UNIQUE_FLAG';
    return $result;
}

如何运作

使用带有这些值的&来检查有用标志,如果标志关闭则输出0,如果标志打开则输出值

例如检查UNIQUE_KEY_FLAG使用$flags_value&4如果关闭它将输出0或如果它打开则输出4

NOT_NULL_FLAG = 1
   PRI_KEY_FLAG = 2
   UNIQUE_KEY_FLAG = 4
   BLOB_FLAG = 16
   UNSIGNED_FLAG = 32
   ZEROFILL_FLAG = 64
   BINARY_FLAG = 128
   ENUM_FLAG = 256
   AUTO_INCREMENT_FLAG = 512
   TIMESTAMP_FLAG = 1024
   SET_FLAG = 2048
   NUM_FLAG = 32768
   PART_KEY_FLAG = 16384
   GROUP_FLAG = 32768
   UNIQUE_FLAG = 65536

<强>解释

该标志是二进制数,如10110011,每个位表示一个标志状态为开或关0表示关闭,1表示开启

例如检查唯一键标志它是第三位,所以当你在100B10110011B之间使用和运算符时,结果将全部为零,除了想要的位

所以如果这个位为零,那么所有的数字都将为零,这对于php来说是错误的

如果它是一个结果将是100B在PHP中任何数字不为零将意味着真的