PHP二分查找法应用之IP查找
前段时间做数据分析,需要大量的IP地址查询(每秒钟近万次检索),首先考虑到使用数据库。数据库大概存储几十万条IP记录,记录集如下:
+----------+----------+------------+---------+---------+--------+--------+
| ip_begin | ip_end | country_id | prov_id | city_id | isp_id | netbar |
+----------+----------+------------+---------+---------+--------+--------+
| 0| 16777215 | 2 | 0 | 0 | 0 | 0 |
| 16777216 | 33554431 | 2 | 0 | 0 | 0 | 0 |
| 33554432 | 50331647 | 2 | 0 | 0 | 0 | 0 |
| 50331648 | 67108863 | 3 | 0 | 0 | 0 | 0 |
| 67108864 | 67829759 | 3 | 0 | 0 | 0 | 0 |
+----------+----------+------------+---------+---------+--------+--------+
这样做查询需要用到如下SQL:
前段时间做数据分析,需要大量的IP地址查询(每秒钟近万次检索),首先考虑到使用数据库。数据库大概存储几十万条IP记录,记录集如下:
+----------+----------+------------+---------+---------+--------+--------+
| ip_begin | ip_end | country_id | prov_id | city_id | isp_id | netbar |
+----------+----------+------------+---------+---------+--------+--------+
| 0| 16777215 | 2 | 0 | 0 | 0 | 0 |
| 16777216 | 33554431 | 2 | 0 | 0 | 0 | 0 |
| 33554432 | 50331647 | 2 | 0 | 0 | 0 | 0 |
| 50331648 | 67108863 | 3 | 0 | 0 | 0 | 0 |
| 67108864 | 67829759 | 3 | 0 | 0 | 0 | 0 |
+----------+----------+------------+---------+---------+--------+--------+
这样做查询需要用到如下SQL:
MySQL复制表结构和数据SQL语句 MySQL SQL语句
1.复制表结构及数据到新表
CREATE TABLE 新表
SELECT * FROM 旧表
2.只复制表结构到新表
CREATE TABLE 新表
SELECT * FROM 旧表 WHERE 1=2
即:让WHERE条件不成立.
方法二:(低版本的mysql不支持,mysql4.0.25 不支持,mysql5已经支持了)
CREATE TABLE 新表
LIKE 旧表
3.复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表
SELECT * FROM 旧表
4.复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,.......)
SELECT 字段1,字段2,...... FROM 旧表
1.复制表结构及数据到新表
CREATE TABLE 新表
SELECT * FROM 旧表
2.只复制表结构到新表
CREATE TABLE 新表
SELECT * FROM 旧表 WHERE 1=2
即:让WHERE条件不成立.
方法二:(低版本的mysql不支持,mysql4.0.25 不支持,mysql5已经支持了)
CREATE TABLE 新表
LIKE 旧表
3.复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表
SELECT * FROM 旧表
4.复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,.......)
SELECT 字段1,字段2,...... FROM 旧表
Mysql 中的嵌套查询
低版本的mysql对嵌套查询支持的不够好,在mysql5中,如果要使用嵌套查询,如:
select count(*) from (select * from table where 1=1) as tmp_table;
这里要说明的是,对于子select需要as成一个临时表,否则就语法错误。
低版本的mysql对嵌套查询支持的不够好,在mysql5中,如果要使用嵌套查询,如:
select count(*) from (select * from table where 1=1) as tmp_table;
这里要说明的是,对于子select需要as成一个临时表,否则就语法错误。
sql常用命令方法
(1) 数据记录筛选:
sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 like ''%字段值%'' order by 字段名 [desc]"
sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 in (''值1'',''值2'',''值3'')"
sql="select * from 数据表 where 字段名 between 值1 and 值2"
(1) 数据记录筛选:
sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 like ''%字段值%'' order by 字段名 [desc]"
sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 in (''值1'',''值2'',''值3'')"
sql="select * from 数据表 where 字段名 between 值1 and 值2"
js自适应图片宽和高
代码:
<script type="text/javascript" language="javascript">
function fixImage(i,w,h){
var ow = i.width;
var oh = i.height;
var rw = w/ow;
var rh = h/oh;
var r = Math.min(rw,rh);
if (w ==0 && h == 0){
r = 1;
}else if (w == 0){
r = rh<1?rh:1;
}else if (h == 0){
r = rw<1?rw:1;
}
if (ow!=0 && oh!=0){
i.width = ow * r;
i.height = oh * r;
}else{
var __method = this, args = $A(arguments);
window.setTimeout(function() {
fixImage.apply(__method, args);
}, 200);
}
i.onload = function(){}
}
</script>
用法:
<img src="" onload="fixImage(this,100,100)">
代码:
<script type="text/javascript" language="javascript">
function fixImage(i,w,h){
var ow = i.width;
var oh = i.height;
var rw = w/ow;
var rh = h/oh;
var r = Math.min(rw,rh);
if (w ==0 && h == 0){
r = 1;
}else if (w == 0){
r = rh<1?rh:1;
}else if (h == 0){
r = rw<1?rw:1;
}
if (ow!=0 && oh!=0){
i.width = ow * r;
i.height = oh * r;
}else{
var __method = this, args = $A(arguments);
window.setTimeout(function() {
fixImage.apply(__method, args);
}, 200);
}
i.onload = function(){}
}
</script>
用法:
<img src="" onload="fixImage(this,100,100)">
PHP&MYSQL分页原理及实现
假设我们要处理1000条数据,要在每页中显示10条,这样的话就会分100页来显示,咱们先看一看在mysql里提取10条信息是如何操作的。
Select * from table limit 0,10
上面是一句很简单的mysql查询语句,它的作用是从一个名叫table的表里提取10条数据,并且把所有字段的值都获得。
关键的地方就在这段“limit 0,10”,它其中的0是以0为起始点,后面的10则是显示10条数据,那么我们要以10为起始点,显示到第20条数据该怎么写呢?
可能很多大大会心直口快的说“limit 10,20”嘛!啊哦,这样可就错误了哦,正确的写法是“limit 10,10”它后面的参数并非是结束点而是要提取的数目,记住哦。
懂得了如何提取10条数据,那么提取1000条也就是做100次这种查询呀,就是说要做如下的查询:
假设我们要处理1000条数据,要在每页中显示10条,这样的话就会分100页来显示,咱们先看一看在mysql里提取10条信息是如何操作的。
Select * from table limit 0,10
上面是一句很简单的mysql查询语句,它的作用是从一个名叫table的表里提取10条数据,并且把所有字段的值都获得。
关键的地方就在这段“limit 0,10”,它其中的0是以0为起始点,后面的10则是显示10条数据,那么我们要以10为起始点,显示到第20条数据该怎么写呢?
可能很多大大会心直口快的说“limit 10,20”嘛!啊哦,这样可就错误了哦,正确的写法是“limit 10,10”它后面的参数并非是结束点而是要提取的数目,记住哦。
懂得了如何提取10条数据,那么提取1000条也就是做100次这种查询呀,就是说要做如下的查询:
// 验证字符串
function checkstr($l1, $l2=array()){
// $l1: $var $l2:标题|0-不为空,1-限制字符,num-整数|最少字符|最多字符
if(!$l2) { return true;}
if(!is_array($l2)){
$l2 = explode('|', $l2);
}
$l1 = trim($l1);
$len = len($l1);
$msg = '';
if(strpos($l2[1],',')!==false){ // 多重验证
$type = explode(',', $l2[1]);
foreach($type as $val){
$l2[1] = $val;
checkstr($l1, $l2);
}
return true;
}
switch($l2[1]){
case '0': // 不能为空
$msg = $l1 != '' ? '' : '不能为空!';
break;
case '1': // 字符数
if($l2[2] && $len < $l2[2]){
$msg = "不能小于{$l2[2]}个字符!";
} elseif($l2[3] && $len > $l2[3]){
$msg = "不能大于{$l2[3]}个字符!";
}
break;
case 'num': // 必须为整数
$msg = valid::check($l1,'int') ? '' : '只能是数字!';
break;
case 'email':
$msg = valid::check($l1,'email') ? '' : 'email地址不正确!';
break;
case 'eng':
$msg = valid::check($l1,'english') ? '' : '只能是字母!';
break;
default:
break;
}
if($msg){
alert($l2[0].$msg);
} else{
return true;
}
}
function checkstr($l1, $l2=array()){
// $l1: $var $l2:标题|0-不为空,1-限制字符,num-整数|最少字符|最多字符
if(!$l2) { return true;}
if(!is_array($l2)){
$l2 = explode('|', $l2);
}
$l1 = trim($l1);
$len = len($l1);
$msg = '';
if(strpos($l2[1],',')!==false){ // 多重验证
$type = explode(',', $l2[1]);
foreach($type as $val){
$l2[1] = $val;
checkstr($l1, $l2);
}
return true;
}
switch($l2[1]){
case '0': // 不能为空
$msg = $l1 != '' ? '' : '不能为空!';
break;
case '1': // 字符数
if($l2[2] && $len < $l2[2]){
$msg = "不能小于{$l2[2]}个字符!";
} elseif($l2[3] && $len > $l2[3]){
$msg = "不能大于{$l2[3]}个字符!";
}
break;
case 'num': // 必须为整数
$msg = valid::check($l1,'int') ? '' : '只能是数字!';
break;
case 'email':
$msg = valid::check($l1,'email') ? '' : 'email地址不正确!';
break;
case 'eng':
$msg = valid::check($l1,'english') ? '' : '只能是字母!';
break;
default:
break;
}
if($msg){
alert($l2[0].$msg);
} else{
return true;
}
}




2009
11:22
1723
0


