- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
该代码是一个cms的基本php代码,它读取Mysql内容以根据三种不同的方法呈现网页,通过id,名称或特殊类型(索引页面,站点地图页面......)。但我不能理解这一行“$r=dbRow("select * from pages where special&$v limit 1");”按位 AND 应该做什么?
<?php
class Page{
static $instances = array();
static $instancesByName = array();
static $instancesBySpecial = array();
function __construct($v,$byField=0,$fromRow=0,$pvq=0){
# byField: 0=ID; 1=Name; 3=special
if (!$byField && is_numeric($v)){ // by ID
$r=$fromRow?$fromRow:($v?dbRow("select * from pages where id=$v limit 1"):array());
}
else if ($byField == 1){ // by name
$name=strtolower(str_replace('-','_',$v));
$fname='page_by_name_'.md5($name);
$r=dbRow("select * from pages where name like '".addslashes($name)."' limit 1");
}
else if ($byField == 3 && is_numeric($v)){ // by special
$fname='page_by_special_'.$v;
$r=dbRow("select * from pages where special&$v limit 1");
}
else return false;
if(!count($r || !is_array($r)))return false;
if(!isset($r['id']))$r['id']=0;
if(!isset($r['type']))$r['type']=0;
if(!isset($r['special']))$r['special']=0;
if(!isset($r['name']))$r['name']='NO NAME SUPPLIED';
foreach ($r as $k=>$v) $this->{$k}=$v;
$this->urlname=$r['name'];
$this->dbVals=$r;
self::$instances[$this->id] =& $this;
self::$instancesByName[preg_replace('/[^a-z0-9]/','-',strtolower($this->urlname))] =& $this;
self::$instancesBySpecial[$this->special] =& $this;
if(!$this->vars)$this->vars='{}';
$this->vars=json_decode($this->vars);
}
function getInstance($id=0,$fromRow=false,$pvq=false){
if (!is_numeric($id)) return false;
if (!@array_key_exists($id,self::$instances)) self::$instances[$id]=new Page($id,0,$fromRow,$pvq);
return self::$instances[$id];
}
function getInstanceByName($name=''){
$name=strtolower($name);
$nameIndex=preg_replace('#[^a-z0-9/]#','-',$name);
if(@array_key_exists($nameIndex,self::$instancesByName))return self::$instancesByName[$nameIndex];
self::$instancesByName[$nameIndex]=new Page($name,1);
return self::$instancesByName[$nameIndex];
}
function getInstanceBySpecial($sp=0){
if (!is_numeric($sp)) return false;
if (!@array_key_exists($sp,$instancesBySpecial)) $instancesBySpecial[$sp]=new Page($sp,3);
return $instancesBySpecial[$sp];
}
}
最佳答案
看来 pages.special
包含一个 bit field (也就是说,其值中的每个位位置都会标记一些特定于应用程序的属性)。
然后,要查找具有特定属性的记录,可以使用所需的“掩码”执行按位 AND
运算——结果中的位位置仅当在值和掩码中都设置了相同的位置。 2 位值的完整真值表如下所示:
+---------+------+------------+| value | mask | value&mask |+---------+------+------------+| 0b00 | 0b00 | 0b00 || 0b01 | 0b00 | 0b00 || 0b10 | 0b00 | 0b00 || 0b11 | 0b00 | 0b00 || 0b00 | 0b01 | 0b00 || 0b01 | 0b01 | 0b01 || 0b10 | 0b01 | 0b00 || 0b11 | 0b01 | 0b01 || 0b00 | 0b10 | 0b00 || 0b01 | 0b10 | 0b00 || 0b10 | 0b10 | 0b10 || 0b11 | 0b10 | 0b10 || 0b00 | 0b11 | 0b00 || 0b01 | 0b11 | 0b01 || 0b10 | 0b11 | 0b10 || 0b11 | 0b11 | 0b11 |+---------+------+------------+
For example, suppose the lowest-order bit is a flag that the respective page "is readonly"; and the next bit that the page "requires moderation"—a value of (decimal) 2, or 0b10
, would indicate that the page is not readonly but does require moderation. So, to find all pages that either are readonly or require moderation, one could do:
SELECT * FROM pages WHERE (special & 0b11) != 0
因为 MySQL 没有真正的 bool 类型(而是将零视为假,将非零视为真),过滤器表达式可以缩写为:
SELECT * FROM pages WHERE special & 0b11
我们也可以用十进制而不是二进制形式表示掩码:
SELECT * FROM pages WHERE special & 3
并且,如果需要,将 LIMIT
应用于查询(尽管在没有 ORDER BY
子句的情况下,结果是不确定的):
SELECT * FROM pages WHERE special&3 LIMIT 1
鉴于这就是我们所要做的(根据您显示的代码),我们只能说以下内容:
查询从 pages
表中选择不确定记录的所有列,其中 special
的值至少设置了一个与掩码 $v
。
由于 special
和 $v
的语义(以及它们中的位位置)是特定于应用程序的,所以如果没有更深入的了解就不可能再说什么了了解您的应用程序。
请注意,虽然紧凑,但在位字段上使用掩码进行过滤是不可搜索的——因此这往往是非常糟糕的数据库设计。
关于php - 这个按位 AND 运算符的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27501220/
我是一名优秀的程序员,十分优秀!