文章介绍了二种数据库备案的代码,一种是我们php写的常用的数据库备份类,另一种是为linux朋友提供的一个自动定时备份mysql数据库的代码,有需要的同学可以参考一下。
把下面php代码保存成backdata.class.php文件
代码如下 |
复制代码 |
<?php
/*
*
*简单的一个Mysql备份数据类
*
*/
class backupData{
private $mysql_link;//链接标识
private $dbName; //数据库名
private $dataDir; //数据所要存放的目录
private $tableNames;//表名
public function __construct($mysql_link){
$this->mysql_link = $mysql_link;
}
public function backupTables($dbName,$dataDir,$tableNames){//开始备份
$this->dbName = $dbName;
$this->dataDir = $dataDir;
$this->tableNames = $tableNames;
$tables=$this->delarray($this->tableNames);
$sqls='';
foreach($tables as $tablename){
if($tablename==''){//表不存在时
continue;
}
//************************以下是形成SQL的前半部分**************
//如果存在表,就先删除
$sqls .= "DROP TABLE IF EXISTS $tablename;n";
//读取表结构
$rs = mysql_query("SHOW CREATE TABLE $tablename",$this->mysql_link);
$row=mysql_fetch_row($rs);
//获得表结构组成SQL
$sqls.=$row['1'].";nn";
unset($rs);
unset($row);
//************************以下是形成SQL的后半部分**************
//查寻出表中的所有数据
$rs=mysql_query("select * from $tablename",$this->mysql_link);
//表的字段个数
$field=mysql_num_fields($rs);
//形成此种SQL语句:"INSERT INTO `groups` VALUES('1499e0ca25988d','主任','','0');"
while($rows=mysql_fetch_row($rs)){
$comma='';//逗号
$sqls.="INSERT INTO `$tablename` VALUES(";
for($i=0;$i<$field;$i++){
$sqls.=$comma."'".$rows[$i]."'";
$comma=',';
}
$sqls.=");nnn";
}
}
$backfilepath=$this->dataDir.date("Ymdhis",time()).'.sql';
//写入文件
$filehandle = fopen($backfilepath, "w");
fwrite($filehandle, $sqls);
fclose($filehandle);
}
private function delarray($array){ //处理传入进来的数组
foreach($array as $tables){
if($tables=='*'){ //所有的表(获得表名时不能按常规方式来组成一个数组)
$newtables=mysql_list_tables($this->dbName,$this->mysql_link);
$tableList = array();
for ($i = 0; $i < mysql_numrows($newtables); $i++){
array_push($tableList,mysql_tablename($newtables, $i));
}
$tableList=$tableList;
}else{
$tableList=$array;
break;
}
}
return $tableList;
}
}
?>
|
我们再创建一个新的文件与backdata.class.php保存在同一目录
使用方法:
代码如下 |
复制代码 |
require_once("backdata.class.php");
$link = @mysql_connect("localhost","数据库名","密码") or die ('Could not connect to server.');
mysql_query("use cms",$link);
mysql_query("set names utf8",$link);
$dbbck=new backupData($link);//实例化它,只要一个链接标识就行了
//备份数据时,如想备份一个数据库中的所有表,你可这样写:
$dbbck->backupTables("cms","./",array('*'));
//备份数据时,如想备份一个数据库中的仅一个表时,你可这样写:
$dbbck->backupTables("cms","./",array('user'));
//备份数据时,如想备份一个数据库中的多个表时,你可这样写:
$dbbck->backupTables("cms","./",array('user','acl','informatoin'));
//注解:$dbbck->backupTables("参1","参2",array());中,
|
参1为:数据库名,
参2为:要存放备份数据的位置(即目录地址)
第三个为:你要保存那些表
下面为linux中的自动定时备份的代码
参考了网上的很多教程,外加自己的测试,以下脚本经测试可用。
代码如下 |
复制代码 |
#!/bin/bash
#Shell Command For Backup MySQL Database Everyday Automatically By Crontab
#Author : Carlos Wong
#Date : 2010-08-24
#配置参数
USER=root #数据库用户名" >用户名
PASSWORD=××××× #数据库用户密码
DATABASE=TIENIUZAI #数据库名称
WEBMASTER=tieniuzai@qq.com #管理员邮箱地址,用以发送备份失败消息提醒
BACKUP_DIR=/var/www/Data_Backup/topons/ #备份文件存储路径
LOGFILE=/var/www/Data_Backup/topons/data_backup.log #日记文件路径
DATE=`date ‘+%Y%m%d-%H%M’` #日期格式(作为文件名)
DUMPFILE=$DATE.sql #备份文件名
ARCHIVE=$DATE.sql.tgz #压缩文件名
OPTIONS=”-u$USER -p$PASSWORD –opt –extended-insert=false –triggers=false -R –hex-blob –flush-logs –delete-master-logs -B $DATABASE” #mysqldump 参数 详情见帮助 mysqldump -help
#判断备份文件存储目录是否存在,否则创建该目录
if [ ! -d $BACKUP_DIR ] ;
then
mkdir -p “$BACKUP_DIR”
fi
#开始备份之前,将备份信息头写入日记文件
echo ” ” >> $LOGFILE
echo ” ” >> $LOGFILE
echo “———————————————–” >> $LOGFILE
echo “BACKUP DATE:” $(date +”%y-%m-%d %H:%M:%S”) >> $LOGFILE
echo “———————————————– ” >> $LOGFILE
#切换至备份目录
cd $BACKUP_DIR
#使用mysqldump 命令备份制定数据库,并以格式化的时间戳命名备份文件
mysqldump $OPTIONS > $DUMPFILE
#判断数据库备份是否成功
if [[ $? == 0 ]]; then
#创建备份文件的压缩包
tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1
#输入备份成功的消息到日记文件
echo “[$ARCHIVE] Backup Successful!” >> $LOGFILE
#删除原始备份文件,只需保 留数据库备份文件的压缩包即可
rm -f $DUMPFILE
else
echo “Database Backup Fail!” >> $LOGFILE
#备份失败后向网站管理者发送邮件提醒,需要mailutils或者类似终端下发送邮件工具的支持
#mail -s “Database:$DATABASE Daily Backup Fail” $WEBMASTER
fi
#输出备份过程结束的提醒消息
echo “Backup Process Done”
|
使用:
将以上代码保存到: /usr/sbin/DataBackup (文件名随意,只要不跟系统原有的命令同名即可;代码可以放到任何地方,放在sbin目录下只是为了方便执行,sbin目录下的文件/目录可在终端直接调 用,类似于windows下PATH变量指定的目录)
为脚本添加可执行权限: sudo chmod +x /usr/sbin/DataBackup
执行脚本: sudo DataBackup
如果需要定时执行备份命令的,只需将下面这段代码放到crontab 文件(sudo vim /etc/crontab)中去就可以了:
01 3 * * * root /usr/sbin/DataBackup #它代表着将于每天3点执行DataBackup脚本
小注意一下下:
linux 下的shell脚本定义变量的格式为: key=value ,注意他们两者之间的” = “前后不能出现空格,否则系统无法确认该变量。
用红色标注的那行,第一个类似单引号的字符”`”其实不是单引号,它的输入键在键盘ESC键下方。
这个脚本只适合用于一些小站点的备份,因为它是对数据库进行全部备份而不是增量备份,不适合大容量的数据库备份。
相对于两种方法定时备份算是最好的方法了,这样可以节省时间让机器在最少人访问时自动备案,而php备份类需要人为操作,当然在windows下也可以利用计划任务来实现了。
这是一很基础的东西我们能过构造函数来实现创建类就自动与mysql服务器进行连接,我们只要设置好 $name,$pass,$table三个变量的值就好了。
代码如下 |
复制代码 |
<?php
class ConnectionMySQL{
//主机
private $host="localhost";
//数据库的username
private $name="root";
//数据库的password
private $pass="";
//数据库名称
private $table="phptest";
//编码形式
private $ut="utf-8";
//构造函数
function __construct(){
$this->ut=$ut;
$this->connect();
}
//数据库的链接
function connect(){
$link=mysql_connect($this->host,$this->name,$this->pass) or die ($this->error());
mysql_select_db($this->table,$link) or die("没该数据库:".$this->table);
mysql_query("SET NAMES '$this->ut'");
}
function query($sql, $type = '') {
if(!($query = mysql_query($sql))) $this->show('Say:', $sql);
return $query;
}
function show($message = '', $sql = '') {
if(!$sql) echo $message;
else echo $message.'<br>'.$sql;
}
function affected_rows() {
return mysql_affected_rows();
}
function result($query, $row) {
return mysql_result($query, $row);
}
function num_rows($query) {
return @mysql_num_rows($query);
}
function num_fields($query) {
return mysql_num_fields($query);
}
function free_result($query) {
return mysql_free_result($query);
}
function insert_id() {
return mysql_insert_id();
}
function fetch_row($query) {
return mysql_fetch_row($query);
}
function version() {
return mysql_get_server_info();
}
function close() {
return mysql_close();
}
//向$table表中插入值
function fn_insert($table,$name,$value){
$this->query("insert into $table ($name) value ($value)");
}
//根据$id值删除表$table中的一条记录
function fn_delete($table,$id,$value){
$this->query("delete from $table where $id=$value");
echo "id为". $id." 的记录被成功删除!";
}
}
//调用方法
$db = new ConnectionMySQL();
$db->fn_insert('test','id,name,sex',"'','hongtenzone','M'");
$db->fn_delete('test', 'id', 1);
?>
|
这里我要讲述一下关于构造函数
代码如下 |
复制代码 |
//构造函数
function __construct(){
$this->ut=$ut;
$this->connect();
} |
这个页面使用了构造函数特别要主要在函数中不要调用数据库连接类了,否则在当前页面会有多连接连接如果访问过大服务器就会出mysql has gone的提法哦。
应该说介绍了利用phpexcel插件来实现数据库的导入与导入功能,本文章主要是告诉你把excel导入到mysql数据库的方法.
先下载
下载phpexcel文件,地址:phpexcel.codeplex.com/
在reader.php文件中找到以下类似代码(第一行既是),改成正确的oleread.php路径即可:require_once 'oleread.php';
然后新建一个php文件引入reader.php,
代码如下:
代码如下 |
复制代码 |
<?php
require_once 'Excel/reader.php';
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('gbk');//此处设置编码,一般都是gbk模式
$data->read('Book1.xls');//文件路径
error_reporting(E_ALL ^ E_NOTICE);
//这里我就只循环输出excel文件的内容了,要入库,只要把输出的地方,写一段mysql语句即可~
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
echo """.$data->sheets[0]['cells'][$i][$j]."",";
}
echo "n";
}
?>
|
代码示例
代码如下 |
复制代码 |
require_once 'phpexcel/Classes/PHPExcel.php';
require_once 'phpexcel/Classes/PHPExcel/IOFactory.php';
require_once 'phpexcel/Classes/PHPExcel/Reader/Excel5.php';
$objReader = PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format
$objPHPExcel = $objReader->load($filename); //$filename可以是上传的文件,或者是指定的文件
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow(); // 取得总行数
$highestColumn = $sheet->getHighestColumn(); // 取得总列数
$k = 0;
//循环读取excel文件,读取一条,插入一条
for($j=2;$j<=$highestRow;$j++)
{
$a = $objPHPExcel->getActiveSheet()->getCell("A".$j)->getValue();//获取A列的值
$b = $objPHPExcel->getActiveSheet()->getCell("B".$j)->getValue();//获取B列的值
$sql = "INSERT INTO table VALUES(".$a.",".$b.")";
mysql_query($sql);
}
|
代码实例cvs导入到数据库
把csv导入到数据库。
代码如下 |
复制代码 |
function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
$time_start = getmicrotime();
include ("connectdb.php");
function insert_data ($id,$summary,$description,$additional_information,$category)
{
$my_query1 = "insert into mantis_bug_text_table (id,description,additional_information)
values ('$id','$description','$additional_information')";
$first = mysql_query($my_query1);
$my_query2 = "insert into mantis_bug_table (id,project_id,summary,bug_text_id) values ('$id','$category','$summary','$id')";
$second = mysql_query($my_query2);
return;
}
$fp = fopen("test.csv","r");
while($data = fgetcsv($fp,'1000',',')){
insert_data ($data[0],$data[1],$data[2],$data[3],$data[4]);
echo "<font color = #ff0000 size = 20>数据导入成功!</font><br><br>";
}
fclose ($fp);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo "程序执行时间:".$time."秒";
|
更多详细内容请查看:http://www.111cn.net/phper/php-database/excel-mysql.htm
文章利用了二个实例来分析介绍了关于php 日期和mysql日期的用法及格式还有包括了mysql使用日期时所用的字段类型及查询效率测试。
php
int值:
time():是返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
我们想要获得1970 年 1 月 1 日到 2012-2-10的秒数可以通过strtotime()来实现:即:strtotime('2012-2-10');
date值:
string date ( string format [, int timestamp] )
关于date()函数可参考 http://www.111cn.net/phper/php-function/38146.htm
比如:直接date()返回的的实现当前的时间,当然我们可以指定的他的格式:
例如date('Y-m-d',strtotime('2012-2-10'));
时间操作:
代码如下 |
复制代码 |
date('Y-m-d h:i:s',strtotime('+1 week'));
date('Y-m-d h:i:s',strtotime('+5 hours'));
date('Y-m-d h:i:s',strtotime('next Monday));
date('Y-m-d h:i:s',strtotime('last Sunday'));
date('Y-m-d h:i:s',strtotime('+ 1 day',12313223));!!详见 int strtotime ( string time [, int now] )
|
date的参数
每一个参数的格式分别表示:
a - "am" 或是 "pm"
a - "am" 或是 "pm"
d - 几日,二位数字,若不足二位则前面补零; 如: "01" 至 "31"
d - 星期几,三个英文字母; 如: "fri"
f - 月份,英文全名; 如: "january"
h - 12 小时制的小时; 如: "01" 至 "12"
h - 24 小时制的小时; 如: "00" 至 "23"
g - 12 小时制的小时,不足二位不补零; 如: "1" 至 12"
g - 24 小时制的小时,不足二位不补零; 如: "0" 至 "23"
i - 分钟; 如: "00" 至 "59"
j - 几日,二位数字,若不足二位不补零; 如: "1" 至 "31"
l - 星期几,英文全名; 如: "friday"
m - 月份,二位数字,若不足二位则在前面补零; 如: "01" 至 "12"
n - 月份,二位数字,若不足二位则不补零; 如: "1" 至 "12"
m - 月份,三个英文字母; 如: "jan"
s - 秒; 如: "00" 至 "59"
s - 字尾加英文序数,二个英文字母; 如: "th","nd"
t - 指定月份的天数; 如: "28" 至 "31"
u - 总秒数
w - 数字型的星期几,如: "0" (星期日) 至 "6" (星期六)
y - 年,四位数字; 如: "1999"
y - 年,二位数字; 如: "99"
z - 一年中的第几天; 如: "0" 至 "365"
其它不在上列的字符则直接列出该字符
(2)mysql:
代码如下 |
复制代码 |
int->datetime
select from_unixtime(int_time) from table;
datetime->int;
select unix_timestamp(date_time) from table;
|
时间操作:
代码如下 |
复制代码 |
select dayofweek('2012-2-2');返回一个星期的第几天
select dayofmonth('2012-2-2');返回一月中的第几天
select dayofyear('2012-2-2');返回一年中的第几天
|
类似函数: month() day() hour() week()......
+几天 date_add(date,interval 2 days);
-几天 date_sub(date,interval 2 days);
时间格式:
date_format(date,format)
select DATE_FORMAT('1997-10-04 22:23:00','%W %M %Y');
其他函数:TIME_TO_SEC() SEC_TO_TIME()...
最后我们总结一下关于在使用时间时在数据库是是用int ,varchar ,datetime这几种的查询效率比较吧。
测试四个表的更新,分别update 100条记录,并记录时间:北京PHP资源分享门户d*V.~x G/QO
表一:页面运行时间: 2.62180089951 秒(非定长,int时间)北京PHP资源分享门户
表二:页面运行时间: 2.5475358963 秒(定长,int时间)
表三:页面运行时间: 2.45077300072 秒(varchar,datetime时间)
表四:页面运行时间: 2.82798409462 秒(char,datetime时间)
大数据量下,如果存在大量的select * from table where 时间>XX这样的查询,在MySQL5.1时使用int换datetime是有意义的。
php mysql日期比较代码
更多更好详细http://www.111cn.net/phper/21/d40b994ac43e630f316940ea4976564c.htm
这是一篇利用php的mysql_connect函数来实现连接mysql数据库提示条件要你的php有php_mysql.dll和libmysql.dll及php.ini中的;extension=php_mysql,去掉前面的“;”了哦。
代码如下 |
复制代码 |
<?php
mysql_connect("localhost", "root","1981427") //连接位于localhost的服务器,用户名为root
?>
|
连接再选择数据库
代码如下 |
复制代码 |
<?php
@mysql_select_db("test") //选择数据库mydb
?>
|
这样我们就可以实现连接到数据库了
可能碰到的问题
运行代码出现:Call to undefined function 'mysql_connect()'… 失败
这个提示function undefined是说没有mysql_connect()函数,
解决方法如下
将php_mysql.dll和libmysql.dll文件拷贝至c:winntsystem32中(我漏了libmysql.dll)
找到php.ini中的;extension=php_mysql,去掉前面的";" 重启服务器
好了万事具备了,现在我们就差一个简单的连接实例
例1
conn.php文件代码如下:
代码如下 |
复制代码 |
<?php
$conn = @mysql_connect("localhost", "root", "root") or die("数据库链接错误");
mysql_select_db("data", $conn);//data为数据库名称
mysql_query("set names 'GBK'"); //使用GBK中文编码;
?>
|
index.php文件代码如下:
代码如下 |
复制代码 |
<?php
include("conn.php");//引入conn.php文件
$SQL="SELECT * FROM `table` order by id desc";
$query=mysql_query($SQL);
while($row=mysql_fetch_array($query)){
?>
显示数据内容:
<?=$row[user]?>
<?
}
?>
|
这样我们就实现的简单的php mysql连接并查询出我们需要的数据了。
更多关于php mysql数据连接
http://www.111cn.net/phper/18/60db56d779d2a21cfc4c596e1c3880e4.htm
标签:[!--infotagslink--]