数据库操作类是所有程序都可以实现的一个功能,下面我来分享一个PHP mysql数据库操作类,这个数据库操作类的特点是对所有保存到数据库的内容进入了过滤,可以很好的处理sql注入了。
代码如下 |
复制代码 |
<?php
//数据库处理类
class db
{
//SQL执行后的数据保存变量;
var $db;
//读取或设置当前数据的位置
var $position=0;
//执行SQL语句并把结果保存为db变量中;
function sub_sql($str)
{
global $prefix;//全局函数,表前缀
return str_replace("#@__",$prefix,$str);
}
function Sql($str)
{
$str=$this->sub_sql($str);
$result = mysql_query($str);
$i=0;
while($row = mysql_fetch_array($result))
{
$str_array[$i]=$row;
$i++;
}
if(empty($str_array))
{
$str_array=array();
}
$this->db=$str_array;
}
//读取一条数据并把数据往后移一位,如果数据为空则返回为null;
function Get_One()
{
$re=empty($this->db[$this->position])?null:$this->db[$this->position];
$this->position=$re?$this->position+1:$this->position;
return $re;
}
//判断是否数据读取到结尾了
function Judge()
{
$re=empty($this->db[$this->position])?true:false;
return $re;
}
//取得db里面的个数
function Get_Num()
{
return count($this->db);
}
//更新数据库里面的数据,$t为表名,$v格式为数组格式,上标为字段名,下标为数据;$w为条件上标为字段名下标为数据,$p为条件0为等号,1为大于,-1为小于;
function Set_Updata($t,$v,$w,$p=0)
{
$this->Sql($t);
$v_str="";
$w_str="";
$f="";
foreach($v as $key=>$vaule)
{
if(!is_numeric($key))
{
if(empty($v_str))
{
$v_str=htmlspecialchars($key)."='".htmlspecialchars($vaule)."'";
}else
{
$v_str=$v_str.",".htmlspecialchars($key)."='".htmlspecialchars($vaule)."'";
}
}
}
switch($p)
{
case 0:
$f="=";
break;
case 1:
$f=">";
break;
case -1:
$f="<";
break;
}
if(!empty($f))
{
foreach($w as $key=>$vaule)
{
if(!is_numeric($key))
{
if(empty($v_str))
{
$w_str=htmlspecialchars($key).$f.htmlspecialchars($vaule)."'";
}else
{
$w_str=$w_str.",".htmlspecialchars($key).$f.htmlspecialchars($vaule)."'";
}
}
}
}
$sql="UPDATE ".$t." SET ".$v_str." where ".$w_str;
return $result = mysql_query($sql);
}
//删除一数据$w为条件上标为字段名下标为数据,$p为条件0为等号,1为大于,-1为小于;
function Set_Del($t,$w,$p=0)
{
$this->sub_sql($t);
$w_str="";
$f="";
switch($p)
{
case 0:
$f="=";
break;
case 1:
$f=">";
break;
case -1:
$f="<";
break;
}
if(!empty($f))
{
foreach($w as $key=>$vaule)
{
if(!is_numeric($key))
{
if(empty($v_str))
{
$w_str=htmlspecialchars($key).$f.htmlspecialchars($vaule)."'";
}else
{
$w_str=$w_str.",".htmlspecialchars($key).$f.htmlspecialchars($vaule)."'";
}
}
}
}
$str="DELETE FROM ".$t." WHERE ".$w_str;
return $result = mysql_query($str);
}
function Add($t,$v)
{
$this->sub_sql($t);
$k_str="";
$v_str="";
foreach($v as $key=>$vaule)
{
if(!is_numeric($key)){
if(empty($k_str))
{
$k_str=htmlspecialchars($key);
$v_str="'".htmlspecialchars($vaule)."'";
}else
{
$k_str=$k_str.",".htmlspecialchars($key);
$v_str=$v_str.","."'".htmlspecialchars($vaule)."'";
}
}
}
$str="INSERT INTO ".$t."(".$k_str.")"."value(".$v_str.")";
return $result = mysql_query($str);
}
}
?>
|
下面来分享一个带缓存数据功能的mysqli类,有需要的同学可看看。
代码如下 |
复制代码 |
<?php
/**
* Mysqli类
*
* @author 废墟
* @version v1.0 2009-08-18
*/
class db_mysqli {
protected $mysqli;
protected $sql;
protected $rs;
protected $query_num = 0;
protected $fetch_mode = MYSQLI_ASSOC;
protected $cache_dir = './cache/';
protected $cache_time = 1800;
public function __construct($dbhost, $dbuser, $dbpass, $dbname) {
$this->mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if(mysqli_connect_errno()) {
$this->mysqli = false;
echo '<h2>'.mysqli_connect_error().'</h2>';
die();
} else {
$this->mysqli->set_charset("utf8");
}
}
public function __destruct() {
$this->free();
$this->close();
}
protected function free() {
@$this->rs->free();
}
protected function close() {
$this->mysqli->close();
}
protected function fetch() {
return $this->rs->fetch_array($this->fetch_mode);
}
protected function getQuerySql($sql, $limit = null) {
if (@preg_match("/[0-9]+(,[ ]?[0-9]+)?/is", $limit) && !preg_match("/ LIMIT [0-9]+(,[ ]?[0-9]+)?$/is", $sql)) {
$sql .= " LIMIT " . $limit;
}
return $sql;
}
protected function get_cache($sql,$method) {
include_once './cache.php';//若框架中使用__autoload(),这里可以不用加载文件
$cache = new cache($this->cache_dir,$this->cache_time);
$cache_file = md5($sql.$method);
$res = $cache->get_cache($cache_file);
if(!$res) {
$res = $this->$method($sql);
$cache->set_cache($cache_file, $res);
}
return $res;
}
public function query_num() {
return $this->query_num;
}
public function set_cache_dir($cache_dir) {
$this->cache_dir = $cache_dir;
}
public function set_cache_time($cache_time) {
$this->cache_time = $cache_time;
}
public function query($sql, $limit = null) {
$sql = $this->getQuerySql($sql, $limit);
$this->sql = $sql;
$this->rs = $this->mysqli->query($sql);
if (!$this->rs) {
echo "<h2>".$this->mysqli->error."</h2>";
die();
} else {
$this->query_num++;
return $this->rs;
}
}
public function getOne($sql) {
$this->query($sql, 1);
$this->fetch_mode = MYSQLI_NUM;
$row = $this->fetch();
$this->free();
return $row[0];
}
public function get_one($sql) {
return $this->getOne($sql);
}
public function cache_one($sql) {
$sql = $this->getQuerySql($sql, 1);
return $this->get_cache($sql, 'getOne');
}
public function getRow($sql, $fetch_mode = MYSQLI_ASSOC) {
$this->query($sql, 1);
$this->fetch_mode = $fetch_mode;
$row = $this->fetch();
$this->free();
return $row;
}
public function get_row($sql, $fetch_mode = MYSQLI_ASSOC) {
return $this->getRow($sql);
}
public function cache_row($sql) {
$sql = $this->getQuerySql($sql, 1);
return $this->get_cache($sql, 'getRow');
}
public function getAll($sql, $limit = null, $fetch_mode = MYSQLI_ASSOC) {
$this->query($sql, $limit);
$all_rows = array();
$this->fetch_mode = $fetch_mode;
while($rows = $this->fetch()) {
$all_rows[] = $rows;
}
$this->free();
return $all_rows;
}
public function get_all($sql, $limit = null, $fetch_mode = MYSQLI_ASSOC) {
return $this->getAll($sql);
}
public function cache_all($sql, $limit = null) {
$sql = $this->getQuerySql($sql, $limit);
return $this->get_cache($sql, 'getAll');
}
public function insert_id() {
return $this->mysqli->insert_id();
}
public function escape($str) {
if(is_array($str)) {
foreach($str as $key=>$val) {
$str[$key] = $this->escape($val);
}
} else {
$str = addslashes(trim($str));
}
return $str;
}
}
//用法
$db = new db_mysqli('localhost', 'root', 111222, 'dict');
$db->set_cache_time(10);
$db->set_cache_dir('./cache/sql/');
$sql = "select * from words order by word_id limit 10,10";
$res1 = $db->get_all($sql);
$res2 = $db->cache_all($sql);
echo $db->query_num(),'<br>';
?>
|
scws这样的中文分词插件比较不错,简单的学习了一下。它包涵一些专有名称、人名、地名、数字年代等规则集合,可以直接将语句按这些规则分开成一个一个关键词,准确率在90%-95%之间。按照安装说明把scws的扩展放入php的扩展目录里,下载规则文件和词典文件,并在php配置文件中引用它们,就可以用scws进行分词了
1) 修改 php 扩展代码以兼容支持 php 5.4.x
2) 修正 php 扩展中 scws_get_tops 的 limit 参数不允许少于 10 的问题
3) libscws 增加 scws_fork() 从既有的 scws 实例产生分支并共享词典/规则集,主要用于多线程开发。
4) 新增部分版本的 win32 的 dll 扩展
代码如下 |
复制代码 |
<?php
//实例化分词插件核心类
$so = scws_new();
//设置分词时所用编码
$so->set_charset(‘utf-8’);
//设置分词所用词典(此处使用utf8的词典)
$so->set_dict('/path/dict.utf8.xdb');
//设置分词所用规则
$so->set_rule('/path/rules.utf8.ini ');
//分词前去掉标点符号
$so->set_ignore(true);
//是否复式分割,如“中国人”返回“中国+人+中国人”三个词。
$so->set_multi(true);
//设定将文字自动以二字分词法聚合
$so->set_duality(true);
//要进行分词的语句
$so->send_text(“欢迎来到火星时代IT开发”);
//获取分词结果,如果提取高频词用get_tops方法
while ($tmp = $so->get_result())
{
print_r($tmp);
}
$so->close();
?>
|
注:如以上例子,输入的文字,词典,规则文件这三者的字符集必须统一;另外mysql 4.XX有的是不支持中文全文搜索的,可以存入关键字对应的区位码以方便全文搜索。
版本列表
版本 类型 平台 性能 其它
SCWS-1.1.x C 代码 *Unix*/*PHP* 准确: 95%, 召回: 91%, 速度: 1.2MB/sec
PHP扩展分词速度: 250KB/sec [下载] [文档] [安装说明]
php_scws.dll(1) PHP扩展库 Windows/PHP 4.4.x 准确: 95%, 召回: 91%,
php_scws.dll(2) PHP扩展库 Windows/PHP 5.2.x 准确: 95%, 召回: 91%,
php_scws.dll(3) PHP扩展库 Windows/PHP 5.3.x 准确: 95%, 召回: 91%,
php_scws.dll(4) PHP扩展库 Windows/PHP 5.4.x 准确: 95%, 召回: 91%,
PSCWS23 PHP源代码 不限 (不支持UTF-8) 准确: 93%, 召回: 89%,
PSCWS4 PHP源代码 不限 准确: 95%, 召回: 91%,
我们知道新版的php5.3是不支持mysql自带的mssql_connect这个数据连接函数,如果需要连接sqlserver数据库,我们只能使用了com 接口来做哦。
1.Com链接,ADODB.Connection
代码如下 |
复制代码 |
$conn = new Com(“ADODB.Connection”); //实例化一个Connection对象
$connstr = “provider=sqloledb;datasource=.;uid=sa;pwd=123456;database=jnold;”;
$conn->Open($connstr);
$rs = new Com(“ADODB.Recordset”); //实例化一个Recordcount对象
$rs->Open(‘select * from News where bigclassid = 59 And LeadPostil is null’, $conn, 1, 1);
$count = $rs->RecordCount;
echo “共有{$count}条纪录<br />”;
for($i = 0; $i < $count ; $i++){
$arr_result[$i]['Title'] = addslashes($rs->Fields(‘Title’)->Value);//标题
$arr_result[$i]['Color'] = addslashes($rs->Fields(‘titlecolor’)->Value?$rs->Fields(‘titlecolor’)->Value:”);//标题颜色
$arr_result[$i]['WenHao'] = addslashes($rs->Fields(‘OtherText’)->Value);//文号
}
|
2.ODBC连接mssql
代码如下 |
复制代码 |
$dbhost = ”;
$dbuser = ”; //你的mssql用户名
$dbpass = ”; //你的mssql密码
$dbname = ”; //你的mssql库名
$connect=odbc_connect(“Driver={SQL Server};Server=$dbhost;Database=$dbname”,”$dbuser”,”$dbpass”);
$sql=”select * from content”;
$exec=odbc_exec($connect,$sql);
while($row = (odbc_fetch_array($exec)))
{
$row['id'] //?取字段值
…
}
|
我们知道mssql不像php那样可以使用time哦,他生成的是时间格式DateTime这样就显示不对了,如下
代码如下 |
复制代码 |
while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC))
{
print_r($row['datetime']);//这个字段是mssql的时间格式
}
结果是
DateTime Object
(
[date] => 2011-10-20 00:00:00
[timezone_type] => 3
[timezone] => Asia/Chongqing
)
|
解决办法
第一个方法:php文档开头定义ini_set(”mssql.datetimeconvert”,0);
第二个方法:修改php.ini,找到;mssql.datetimeconvert = On ,去掉前面的分号,修改on为off。
第三个方法:只有把mssql的时间字段用convert函数转换成字符串。
比如 SELECT *,convert(char,datetime字段,120) as str_datetime FROM 表名
这个str_datetime就是字符串了。第三个参数为120,刚好是我们需要的格式 yyyy-mm-dd hh:ii:ss