php 数据库字段复用的基本原理与示例

一、逻辑代数基础:
  1,数字用二进制表示,所有可能出现的数只有0和1两个。
  2,基本运算只有“与”、“或”、“非”三种。
  与运算定义为:(用 & 表示与运算)
  0 & 0 = 0
  0 & 1 = 0
  1 & 0 = 0
  1 & 1 = 1
  可以简单理解为:只要有一个0,结果就是0,和乘法类似。
  或运算定义为:(用 表示与运算)
  0 0 = 0
  0 1 = 1
  1 0 = 1
  1 1 = 1
  可以简单理解为:只要有一个1,结果就是1,和加法类似。
  二、逻辑运算示例:
  01111010101010101111111111111111 & 1100000 = 1100000
  一般可以理解为:
  如果要获取一个数字某N位的数值,只需要将这个数字与2的N-1次方(掩码)进行与运算即可。
  三、数据库字段定义:
  以数据表 binary_sample为例:
  create table binary_sample(
  uid int unsigned not null,
  status int unsigned not null default 0,
  primary key(uid),
  key i_s(status)
  )engine=innodb;
  status字段定义:
  status字段数据类型为32bit的整数,为了尽可能的存储多个属性,我们将其进行如下定义:
  以下所有“位”的描述顺序按照从低到高(从右到左)顺序表示。
  0-2位表示用户注册状态:
  000 表示新注册未被批准
  001 表示注册被批准
  010 表示位高级用户
  011 表示管理员
  100 表示超级管理员
  101 保留
  110 保留
  111 掩码
  3-5位用户性别:
  000 表示性别不确定
  001 表示性别为男
  010 表示性别为女
  011 保留
  100 保留
  101 保留
  110 保留
  111 掩码
  如果我们要查询所有 男用户 则:
  select * from binary_sample where status & b'111000' = b'001000';
  如果我们要查询所有 管理员用户 则:
  select * from binary_sample where status & b'111' = b'011';
  如果我们要查询所有 男管理员用户 则:
  select * from binary_sample where status & b'111111' = b'001011';
  如果我们要查询所有 非 新注册未被批准用户 则:
  select * from binary_sample where status & b'111' != b'000';
  四,使用PHP程序进行此类计算:
  define("USER_NEW",0);//000
  define("USER_NORMAL",1);//001
  define("USER_ADVANCE",2);//010
  define("USER_MANAGE",3);//011
  define("USER_SUPER",4);//100
  define("USER_MASK",7);//111
  define("GENDER_UNKNOWN",0);// 000000
  define("GENDER_MALE",8);// 001000
  define("GENDER_FEMALE",9);// 010000
  define("GENDER_MASK",56);// 111000
  如果我们要查询所有 男用户 则:
  $status=GENDER_MALE;
  $mask=GENDER_MASK;
  $sql="select * from binary_sample where status & ${mask}' = ${status}";
  如果我们要查询所有 管理员用户 则:
  $status=USER_MANAGE;
  $mask=USER_MASK;
  $sql="select * from binary_sample where status & ${mask}' = ${status}";
  如果我们要查询所有 男管理员用户 则:
  $status=GENDER_MALE & USER_MANAGE;
  $mask = GENDER_MASK & GENDER_MASK;
  $sql="select * from binary_sample where status & ${mask}' = ${status}";
  如果我们要查询所有 非 新注册未被批准用户 则:
  $status = USER_NEW;
  $mask = USER_MASK;
  $sql="select * from binary_sample where status & ${mask} != ${status}";
  依此类推,只要定义好每个值的含义,查询基本上就定了。

(0)

相关推荐

  • php获取字段名示例分享

    复制代码 代码如下: <?php$link = mysql_connect('localhost', 'username', 'password');$fields = mysql_list_fields("database", "table", $link);$columns = mysql_num_fields($fields);$field = false;for ($i = 0; $i < $columns; $i++) {    $field

  • php mssql扩展SQL查询中文字段名解决方法

    一.问题: 数据库是MS SQLServer2000,要把SQLServer2000里的一张表的数据导入MySQL5,其中SQLServer2000表的字段以简体中文命名(强烈建议不要以中文做为字段名).其实操作就是对SQLServer查询记录,插入到MySQL里.选择的脚本语言是PHP,PHP打开MSSQL和MySQL扩展,对这两个数据库操作都是很容易的问题. 问题就出现在SQLServer中表的字段名是中文,写好的查询语句在SQLServe里测试是通过有记录返回,用PHP的MSSQL扩展查询

  • php使用sql数据库 获取字段问题介绍

    在PB开发过程中,由于数据库中使用了 ntext字段,出现以下提示错误,郁闷了很长时间找不到解决方案,后查阅大量资料,终于明白:PB报错: 不能用 DB-Library(如 ISQL)或 ODBC 3.7 或更早版本将 ntext 数据或仅使用 Unicode 排序规则的 Unicode 数据发送到客户端.----------------由于sql server中,ntext和nvarchar字段是用unicode编码存储内容的,因此php通过mssql扩展读取带ntext和nvarchar类型

  • PHP以指定字段为索引返回数据库所取的数据数组

    很多情况下,我们从接触一个新的项目到开发完成,再回过头来仔细浏览一下自己写的代码,很多都是我们以前用熟练的代码.所以,在完成每个新项目的时 候,适当的做些项目总结.代码总结,或许你会在以后的项目中用得着,极有可能获得意外的收获,比如:代码优化,想到了更好.速度更快的实现方法等等. 牛逼的程序开发者有时候不在于代码量的多少,而是程序的代码简洁性.逻辑复杂但实现的方便性,这些才说明是否是一位好的程序员.我们不做日夜加班到深夜,拼代码量的程序员! 这篇和大家分享几个使用得PHP编程技巧,有些技巧是在看

  • PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)

    根据 Mysql 里的字段 自动生成 类文件: 但需要导入: require_once ./db/ez_sql_core.php;require_once ./db/ez_sql_mysql.php; 帮助文档:http://jvmultimedia.com/docs/ezsql/ez_sql_help.htm 上图 : 核心代码: 复制代码 代码如下: <?php class db{ /******************************************************

  • php判断输入不超过mysql的varchar字段的长度范围

    但是如果在utf-8编码下,一个汉字是占3个字符长度的,比如字符串$str="你好啊!!"; 如果你用strlen函数来判断,长度是11,正好超过了varchar的长度,但实际上确不是这样,如果直接到phpmyadmin里面执行insert语句,这条字符串是可以插入的! 对于数据库来说,它的长度是5,那么我们如何用PHP来得到这个长度呢?使用iconv_strlen()函数! echo iconv_strlen($str,'utf-8′); 注意第二个参数,是当前字符集,这样根据不同的

  • php面向对象 字段的声明与使用

    字段是用于描述类的么个方面的性质. 字段是用于描述类的某个方面的性质.它与一般的PHP 变量非常相似,只是有一些细微的差别,本节将介绍这些差别.这一节还将讨论如何声明和使用字段,下一节则介绍如何使用字段的作用域来进行访问限制. 声明字段 字段声明的有关规则与变量声明的规则非常类似:实际上,可以说没有区别.因为PHP 是松散类型的语言,字段甚至不需要声明:可以由类对象同时创建和赋值,但很少会这样做.相反,常见的做法是在类开始处声明字段.此时可以为字段赋初值.示例如下: 复制代码 代码如下: cla

  • mysql下创建字段并设置主键的php代码

    复制代码 代码如下: mysql_select_db("hills_database_test",$dbcon); $alterpkadd="alter table hills_testcreatetable add id int(32) not null auto_increment primary key;"; mysql_query($alterpkadd,$dbcon); mysql_close($dbcon); 嘿嘿..好容易哟..一句话搞定

  • PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法

    Author: Wenlong Wu 一.针对MS SQL SERVER数据库 有两种解决方案,如下: 修改php.ini来实现: 打开php.ini,可看到mssql.textsize,mssql.textlimit两个选项: ; Valid range 0 - 2147483647. Default = 4096. ;mssql.textlimit = 4096 ; Valid range 0 - 2147483647. Default = 4096. ;mssql.textsize = 4

  • php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串

    数据库脚本: -- -------------------------------------------------------- -- -- 表的结构 `highot_attachment` -- 复制代码 代码如下: CREATE TABLE IF NOT EXISTS `highot_attachment` ( `id` int(11) NOT NULL auto_increment, `phone_number_id` int(11) NOT NULL COMMENT 'phone_n

随机推荐