本节内容:
php mysql实现无限分类
1,简单的通过递归查询加目录path字段的无限分类
缺点:查询数据库次数太多,不方便其他操作,比如删除节点。添加节点,移动节点。
2,左右值无限分类,预排序二叉树
缺点:操作繁琐,数据库冗余,且添加删除修改都要进行左右值更新
本分类方法的优势:
1,数据库结构简单,只有 cid parentid name 三个字段,无任何冗余字段
2,不使用递归查询,所有操作只需一条sql语句
3,所有数据在读取一次数据库后,在数组内进行分析处理,节省数据库服务器资源
一,创建数据库以及表:
CREATE TABLE IF NOT EXISTS `class` (
`cid` mediumint(8) unsigned NOT NULL auto_increment,
`pid` mediumint(8) unsigned NOT NULL,
`cname` varchar(50) NOT NULL,
PRIMARY KEY (`cid`),
KEY `pid` (`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
二,处理文件的例子
<?php
/**
* 无限分类的例子
* by www.
*/
header("Content-type: text/html; charset=utf-8");
//连接数据库
$link = mysql_connect()('localhost','root','eric') or die(mysql_error());
mysql_select_db('sortclass',$link);
//无限分类类库
class SortClass{
var $data = array();
var $child = array(-1=>array());
var $layer = array(-1=>-1);
var $parent = array();
var $link;
var $table;
function SortClass($link, $table){
$this->setNode(0, -1, '顶极节点');
$this->link = $link;
$this->table = $table;
$node = array();
$results = mysql_query()('select * from '.$this->table.'',$this->link);
while($node = mysql_fetch_assoc($results)){
$this->setNode($node['cid'],$node['pid'],$node['cname']);
}
}
function setNode ($id, $parent, $value){
$parent = $parent?$parent:0;
$this->data[$id] = $value;
$this->child[$id] = array();
$this->child[$parent][] = $id;
$this->parent[$id] = $parent;
$this->layer[$id] = !isset()($this->layer[$parent])? 0 : $this->layer[$parent] + 1;
}
function getList (&$tree, $root= 0){
foreach ($this->child[$root] as $key=>$id){
$tree[] = $id;
if ($this->child[$id]) $this->getList($tree, $id);
}
}
function getValue ($id){return $this->data[$id];}
function getLayer ($id, $space = false){
return $space?str_repeat($space, $this->layer[$id]):$this->layer[$id];
}
function getParent ($id){return $this->parent[$id];}
function getParents ($id){
while ($this->parent[$id] != -1){
$id = $parent[$this->layer[$id]] = $this->parent[$id];
}
ksort($parent);
reset($parent);
return $parent;
}
function getChild ($id){return $this->child[$id];}
function getChilds ($id = 0){
$child = array($id);
$this->getList($child, $id);
return $child;
}
function addNode($name,$pid){
mysql_query("insert into $this->table (`pid`,`cname`) values ('$pid','$name')",$this->link);
}
function modNode($cid, $newName){
mysql_query("update $this->table set `cname`='$newName' where `cid` = $cid",$this->link);
}
function delNode($cid){
$allChilds = $this->getChilds($cid);
$sql ='';
if(empty($allChilds)){
$sql = "delete from $this->table where `cid` = $cid";
}else{
$sql = 'delete from '.$this->table.' where `cid` in ('.implode(',',$allChilds).','.$cid.')';
}
mysql_query($sql,$this->link);
}
function moveNode($cid, $topid){
mysql_query("update $this->table set `pid`=$topid where `cid` = $cid", $this->link);
}
}
//函数
function back(){
echo '<script language="javascript">window.location.href="/blog_article/test/.html"+new Date().getTime();</script>';
exit;
}
//声成select
function makeSelect($array,$formName){
global $tree;
$select = '<select name="'.$formName.'">';
foreach ($array as $id){
$select.='<option value="'.$id.'">'.$tree->getLayer($id, '|-').$tree->getValue($id)."</option>";
}
return $select.'</select>';
}
$tree = new SortClass($link,'`class`');
$op = !empty($_POST['op']) ? $_POST['op'] : $_GET['op'];
if(!empty($op)){
if($op=='add'){
$tree->addNode($_POST['cname'],$_POST['pid']);
back();
}
if($op=='mod'){
$tree->modNode($_POST['cid'],$_POST['cname']);
back();
}
if($op=='del'){
$tree->delNode($_GET['cid']);
back();
}
if($op=='move'){
$tree->moveNode($_POST['who'],$_POST['to']);
back();
}
}
$category = $tree->getChilds();
?>
<style type="text/css">
body{font-size:12px;}
ul{list-style:none;}
a{cursor:pointer;}
</style>
<script language="javascript">
function $(e){return document.getElementById(e);}
function mod(cid){
$('cid').value=cid;
$('op').value='mod';
$('name').style.border='1px solid red';
}
</script>
<form action="/blog_article/test.html" method="post">
名称:<input type="text" id="name" name="cname" /> 添加到:<?=makeSelect($category,'pid')?><br />
<input type="hidden" id="op" name="op" value="add" />
<input type="hidden" id="cid" name="cid" />
<input type="submit" value="Submit" />
</form>
<h3>移动分类</h3>
<form action="/blog_article/test.html" method="post">
<?=makeSelect($category,'who')?>移动到:<?=makeSelect($category,'to')?>
<input type="hidden" id="op" name="op" value="move" />
<input type="submit" value="Submit" />
</form>
<ul>
<?php
foreach ($category as $id){
echo '<li>'.$tree->getLayer($id, '|- ').$tree->getValue($id).' <a href="/blog_article/test/op/del/amp;cid/.html'.$id.'">Del</a> <a onclick="mod('.$id.')">Edit</a> </li>';
}
?>
</ul>
本节内容:
phpmyadmin导入大于2M的SQL文件
一、修改c:/windows/php.ini文件。
如果是Win2000的机器,应该是c/winnt/php.ini,用写字板打开php.ini文件:
1 、查找post_max_size,指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值,默认为8M,看你自己需要进行改变。
2 、查找File Uploads,首先确认file_uploads = on ;是否允许通过HTTP上传文件的开关,默认为ON即是开。 upload_tmp_dir ;
查找upload_max_filesize ;即允许上传文件大小的最大值。默认为2M。
3 、如果要上传 > 8M的文件,那么只设置上述四项还不定一定可以。最好对下面的参数也进行设置:
max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒 。
memory_limit = 8M ;每个PHP页面所吃掉的最大内存,默认8M。
二、修改c:/phpmyadmin/import.php文件。
用写字板打开import.php文件:
1 、查找$memory_limit,默认为$memory_limit = 2 * 1024 * 1024 ;自己修改。
2 、下边三四行的位置有同样的语句,自己修改。
三、到这里还不行,IIS的问题。
1 )解决在 IIS 6.0 中,无法上传大容量文件的办法:
1 、先在服务里关闭 iis admin service 服务。
2 、找到 windows/system32/inetsrv/ 下的 metabase.xml 文件。
3 、用写字板打开,找到 ASPMaxRequestEntityAllowed 把它修改为需要的值(默认为: 204800 ,即:200K)。
4 、存盘,然后重启 iis admin service 服务,重启IIS。
2 )解决在 IIS 6.0 中,无法下载超过4M的附件步骤:
1 、先在服务里关闭 iis admin service 服务。
2 、找到 windows/system32/inetsrv/ 下的 metabase.xml 文件。
3 、用写字板打开,找到 AspBufferingLimit 把它修改为需要的值(默认为: 4194304 ,即:4MB)。
4 、存盘,然后重启 iis admin service 服务,重启IIS
附,另外的一种导入大文件的方法。
二、数据备份和恢复
默认的数据导出、和导入最大文件有2M的最大限制。如果要操作大于2M的数据库备份文件就需要预先将文件上传到phpmyadmin的某个目录。
1 .首先在phpmyadmin个跟目录建立一个目录,比如叫ports
2 .在config. default .php中搜$cfg [ 'UploadDir' ] ,这个变量定义保存导入文件存放的目录,它下面的$cfg [ 'SaveDir' ] 定义的是数据导出文件的存放目录,我们都定义为ports
$cfg [ 'SaveDir' ] = ' ports ' ;
注意:ports目录的权限,saveDir只要能让php脚本往里边写东西。最后的就是操作完了,务必清空改目录,防止数据被别有用心的人下载
再分享一个方法,MYSQL导入导出.sql文件。
一,MYSQL的命令行模式的设置:
桌面->我的电脑->属性->环境变量->新建->
PATH=“;path/mysql/bin;”其中path为MYSQL的安装路径。
二,命令行进入MYSQL的方法:
1.C:/>mysql -h hostname -u username -p
按ENTER键,等待然后输入密码。这里hostname为服务器的名称,如localhost,username为MYSQL的用户名,如root。
进入命令行后可以直接操作MYSQL了。
2.简单介绍一下MYSQL命令:
mysql->CREATE TABLE tablename;//创建表
mysql->SHOW DATABASES;//显示数据库信息,有那些可用的数据库。
mysql->USE dbname;//选择数据库
mysql->SHOW TABLES;//显示表信息,有那些可用的表
mysql->DESCRIBE tablename;//显示创建的表的信息
三,从数据库导出数据库文件:
1.将数据库mydb导出到e:/mysql/mydb.sql文件中:
打开开始->运行->输入cmd 进入命令行模式
c:/>mysqldump -h localhost -u root -p mydb >e:/mysql/mydb.sql
然后输入密码,等待一会导出就成功了,可以到目标文件中检查是否成功。
2.将数据库mydb中的mytable导出到e:/mysql/mytable.sql文件中:
c:/>mysqldump -h localhost -u root -p mydb mytable>e:/mysql/mytable.sql
3.将数据库mydb的结构导出到e:/mysql/mydb_stru.sql文件中:
c:/>mysqldump -h localhost -u root -p mydb --add-drop-table >e:/mysql/mydb_stru.sql
四,从外部文件导入数据到数据库中:
从e:/mysql/mydb2.sql中将文件中的SQL语句导入数据库中:
1.从命令行进入mysql,然后用命令CREATE DATABASE mydb2;创建数据库mydb2。
2.退出mysql 可以输入命令exit;或者quit;
3.在CMD中输入下列命令:
c:/>mysql -h localhost -u root -p mydb2 < e:/mysql/mydb2.sql
然后输入密码,就OK了。
五,导入文件大小限制问题的解决:
默认情况下:mysql 对导入文件大小有限制的,最大为2M,所以当文件很大时候,直接无法导入。
解决方法:
1.在php.ini中修改相关参数:
影响mysql导入文件大小的参数有三个:
memory_limit=128M,upload_max_filesize=2M,post_max_size=8M
修改upload_max_filesize=200 M 这里修改满足你需要的大小,
可以同时修改其他两项memory_limit=250M post_max_size=200M
如此,即可导入200M以下的.sql文件了。
您可能感兴趣的文章:
phpMyAdmin导入和恢复大容量sql文件的方法
解决Phpmyadmin导入导出时中文乱码的问题
phpmyadmin 不能导入大SQL文件的解决方法
phpmyadmin导入大数据库文件时问题的解决方法
本节内容:
网站流量统计
1.如何统计停留时间
具体参考“客户统计”相关程序。大致说来,一般有3个表:日表,月表,年表
日表基本设计:IP,进来时间,离开时间,目前时间,停留页面,客户ID(如果登陆),SESSIONID等等
客户访问页面,查询日表有数据没有(SESSIONID),有就更新目前时间和停留页面,没有就新建
判断客户离开时间,可以在前台用JS实现。可以预先定义目前时间和真实时间差多少为离线
年表和月表实际是统计用表,每天使用计划任务按照规则分类统计日表数据
2.有的统计只有一个图片也能实现是什么原理?
实际不是一个图片!!而是一个统计程序(写日表的),最后返回一个图片而已!!!
3.网站热力图又是怎么实现?
这个,一般使用AJAX实现即时存储。AJAX监视鼠标点击事件,有点击行为发生,传输到后台处理(鼠标坐标,点击文字等等)
4.比如站长统计只是引入了一个PHP文件,是如何统计出分辨率这些东西的呢?
JAVASCRIPT有专门的函数取屏幕分辨率的。只是最后通过AJAX传回后台处理!
附,php网站访问统计的相关文章:
php网站访问统计代码
php统计网站访问次数
php 统计页面浏览次数(文本缓存)的代码
统计在线人数的php代码