이 기사의 예에서는 mysql 데이터베이스를 작동하기 위한 간단하고 실용적인 PHP 클래스를 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 내용은 다음과 같습니다. 코드 복사 코드는 다음과 같습니다. /* 이 데이터베이스 연결 클래스는 SQL 주입 방지 기능을 자동으로 로드하고, 일부 민감한 SQL 쿼리 키워드를 필터링하며, 데이터베이스의 모든 테이블 이름을 얻기 위해 표시 테이블 상태 및 표시 테이블 클래스의 특성과 같은 판단 필드를 추가할 수도 있습니다. . */ @ini_set('mysql.trace_mode','off') 클래스 mysql { 공개 $dblink 공개 $pconnect 개인 $search = array('/union(s*(/*.**/)?s*) select/i', '/load_file(s*(/*.**/)?s*) (/i ', '/into(s*(/*.**/)?s*) 출력파일/i') private $replace = array('union select', 'load_file (', 'outfile로'); 비공개 $rs 함수 __construct($hostname,$username,$userpwd,$database,$pconnect=false,$charset='utf8') { 정의('allowed_htmltags', ' ; '); $this->pconnect=$pconnect $this->dblink=$pconnect?mysql_pconnect($hostname,$username,$userpwd):mysql_connect($hostname,$username,$userpwd) (!$this->dblink||!is_resource($this->dblink)) && fatal_error("데이터베이스 연결에 실패했습니다!"); @mysql_unbuffered_query("세트 이름 {$charset}"); if($this->version()>'5.0.1') { @mysql_unbuffered_query("set sql_mode = ''") } @mysql_select_db($database) or fatal_error("테이블을 선택할 수 없습니다!") $this->dblink 반환 } 함수 쿼리($sql,$unbuffered=false) { //에코 $sql.''; $this->rs=$unbuffered?mysql_unbuffered_query($sql,$this->dblink):mysql_query($sql,$this->dblink) //(!$this->rs||!is_resource($this->rs)) && fatal_error("쿼리 실행에 실패했습니다! error:".mysql_error()); if(!$this->rs)fatal_error('SQL 문 '.$sql.'을 실행하는 동안 다음 오류가 발생했습니다.'.mysql_error()); $this->rs 반환 } 함수 fetch_one($sql) { $this->rs=$this->query($sql) dircms_strips 튜토리얼 속눈썹 반환($this->filter_pass(mysql_fetch_array($this->rs,mysql_assoc))); } function get_maxfield($filed='id',$table) // $table 테이블에 있는 $filed 필드의 최대값을 가져옵니다. { $r=$this->fetch_one("`{$table}` 순서로 `{$table}`에서 {$table}.{$filed}를 선택하세요.`{$filed}` 설명 제한 0,1") ; $r[$filed] 반환 } 함수 fetch_all($sql) { $this->rs=$this->query($sql) $결과=배열() while($rows=mysql_fetch_array($this->rs,mysql_assoc)) { $결과[]=$행 } mysql_free_result($this->rs) dircms_stripslashes($this->filter_pass($result)) 를 반환합니다. } 함수 fetch_all_withkey($sql,$key='id') { $this->rs=$this->query($sql) $결과=배열() while($rows=mysql_fetch_array($this->rs,mysql_assoc)) { $result[$rows[$key]]=$행 } mysql_free_result($this->rs) dircms_stripslashes($this->filter_pass($result)) 를 반환합니다. } 함수 last_insert_id() { if(($insertid=mysql_insert_id($this->dblink))>0)return $insertid else //auto_increment의 열 유형이 bigint이면 mysql_insert_id()가 반환하는 값이 올바르지 않습니다. { $result=$this->fetch_one('last_insert_id()를 삽입 ID로 선택하세요'); $result['insertid'] 반환 } } 함수 삽입($tbname,$varray,$replace=false) { $varray=$this->escape($varray) $tb_fields=$this->get_fields($tbname); //업그레이드하고 필드 존재 여부를 확인하는 함수를 추가합니다 foreach($varray as $key => $value) { if(in_array($key,$tb_fields)) { $fileds[]='`'.$key.'`'; $values[]=is_string($value)?'''.$value.''':$value; } } if($fileds) { $fileds=implode(',',$fileds); $fileds=str_replace(''','`',$fileds); $values=implode(',',$values); $sql=$replace?"{$tbname}({$fileds}) 값({$values})으로 교체":"{$tbname}({$fileds}) 값({$values})에 삽입"; $this->query($sql,true); return $this->last_insert_id(); } 그렇지 않으면 false를 반환합니다. } 함수 업데이트($tbname, $array, $where = '') { $array=$this->escape($array); if($어디) { $tb_fields=$this->get_fields($tbname); // 增加判断字段是否存재 $sql = ''; foreach($k=>$v로 $array) { if(in_array($k,$tb_fields)) { $k=str_replace(''','',$k); $sql .= ", `$k`='$v'"; } } $sql = substr($sql, 1); if($sql)$sql = "`$tbname` 업데이트 $sql 여기서 $where 설정"; 그렇지 않으면 true를 반환합니다. } 그렇지 않으면 { $sql = "`$tbname`(`".implode('`,`', array_keys($array))."`) 값('".implode("','", $array)으로 교체합니다." ')"; } return $this->query($sql,true); } 함수 mysql_delete($tbname,$idarray,$filedname='id') { $idwhere=is_array($idarray)?implode(',',$idarray):intval($idarray); $where=is_array($idarray)?"{$tbname}.{$filedname} in ({$idwhere})":" {$tbname}.{$filedname}={$idwhere}"; return $this->query("{$where}가 있는 {$tbname}에서 삭제",true); } 함수 get_fields($table) { $필드=배열(); $result=$this->fetch_all("`{$table}`의 열 표시"); foreach($result는 $val로 표시됨) { $fields[]=$val['필드']; } $필드를 반환합니다. } 함수 get_table_status($database) { $상태=배열(); $r=$this->fetch_all("`".$database의 테이블 상태를 표시합니다."`"); /////// 테이블 상태 표시 的性质与테이블 표시类似,不过,可以提供每个表的大weight信息。 foreach($r을 $v로) { $상태[]=$v; } $상태를 반환합니다. } 함수 get_one_table_status($table) { return $this->fetch_one("'$table'과 같은 테이블 상태 표시"); } function create_fields($tbname,$fieldname,$size=0,$type='varchar') // 2010-5-14 修正一下 { if($size) { $size=strtoupper($type)=='varchar'?$size:8; $this->query("alter table `{$tbname}` add `$fieldname` {$type}( {$size} ) not null",true); } else $this->query("alter table `{$tbname}` add `$fieldname`mediumtext not null",true); 사실을 반환; } function get_tables() //获取所有表表name { $테이블=배열(); $r=$this->fetch_all("테이블 표시"); foreach($r을 $v로) { foreach($v를 $v_로) { $테이블[]=$v_; } } $테이블을 반환합니다. } function create_model_table($tbname) //创建一个内容模型表(start:初始只有字段contentid int(20),사용于内容表,//////////////////// /// 업데이트:2010-5-20 默认加入`content` mediatext not null,字段) { if(in_array($tbname,$this->get_tables())) return false; //////////////////// 当表name已经存在时,返回 false if($this->query("`{$tbname}` 테이블 생성( `contentid`mediumint(8) null이 아님, `content` mediatext는 null이 아닙니다. 키( `contentid` ) ) 엔진 = myisam 기본 charset=utf8",true)) true를 반환합니다. ///////////////////// 성공하면 true를 반환합니다. false 반환 /////////////실패 시 false 반환 } function create_table($tbname) //멤버 모델의 빈 테이블 생성(초기에는 userid int(20) 필드만 멤버 테이블에 사용됨, 2010-4-26) { if(in_array($tbname,$this->get_tables())) return false if($this->query("`{$tbname}` 테이블 생성( `userid` mediaint(8) null이 아님, 키( `userid` ) ) 엔진 = myisam 기본 charset=utf8",true)) true를 반환합니다. 거짓을 반환 } function escape($str) // 위험한 문자 필터링 { if(!is_array($str)) return str_replace(array('n', 'r'), array(chr(10), chr(13)),mysql_real_escape_string(preg_replace($this->search,$this- >교체, $str), $this->dblink)) foreach($str as $key=>$val) $str[$key] = $this->escape($val) $str 반환 } function filter_pass($string, $allowedtags = '', $disabledattributes = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', ' onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy' , 'oncut', 'ondataavaible', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragdrop', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', ' ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterupdate', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup' , 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmoveout', 'onmouseotutorialver', 'onmouseup', 'onmousewheel', 'onmove' , ' onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowexit', 'onrowsdelete', 'onrowsinserted', ' onscroll' , 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload')) { if(is_array($string)) { foreach($string as $key => $val) $string[$key] = $this->filter_pass($val, allowed_htmltags) } 그렇지 않으면 { $string = preg_replace('/s('.implode('|', $disabledattributes).').*?([s>])/', ' ', preg_replace('/<(.*?) > ;/ie', "'<'.preg_replace(array('/웹 페이지 효과:[^"']*/i', '/(".implode('|', $disabledattributes).")[ ] *=[ ]*["'][^"']*["']/i', '/s /'), array('', '', ' '), 스트립슬래시(' ')) . ' >'", Strip_tags($string, $allowedtags))); } $string 반환 } 함수 drop_table($tbname) { Return $this->query("`{$tbname}`이 있으면 테이블 삭제",true); } 함수 버전() { return mysql_get_server_info($this->dblink) } } 이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.