xml_fetch_array(); * * echo "
" * * print_r($data);"/> xml_fetch_array(); * * echo "" * * print_r($data);">XML을 데이터베이스로 조작하기 위한 xinputemulator PHP 클래스
- WBOY원래의
- 2016-07-29 08:44:02869검색
xml.class.php 파일 코드
코드 복사 코드는 다음과 같습니다
* 데이터 읽기 예:
*
* $xml = new xml("dbase.xml",'table')
*
* $data=$xml->xml_fetch_array();
*
* echo ""
*
* print_r($data); class xml
{
var $dbase; //데이터베이스, 읽을 XML 파일
var $dbname; //데이터베이스 이름, 데이터베이스 파일 이름과 일치하는 최상위 요소
var $dbtable ; //얻을 노드
var $parser; //Parser
var $vals; //Index
var $dbtable_array;// array
var $array; //하위 노드 배열
var $result; //반환된 결과
var $querys
function xml($dbase,$dbtable)
{
$this->dbase=$dbase;
$this->dbname=substr($dbase,strrpos($dbase,"/") 1,-4)
$this-> ;dbtable =$dbtable;
$data=$this->ReadXml($this->dbase);
if(!$data){
die("$this-> ;dbname을 읽을 수 없습니다. xml");
}
$this->parser = xml_parser_create();
xml_parser_set_option($this->parser,XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($this- >parser ,XML_OPTION_SKIP_WHITE,1);
xml_parse_into_struct($this->parser,$data,$this->vals,$this->index)
xml_parser_free($this->parser ); 🎜>//인덱스를 탐색하고 평가할 노드의 노드 이름을 필터링합니다. $dbtable
foreach ($this->index as $key=>$val) {
if ($key == $this->dbtable) {
//노드 배열 가져오기
$this->dbtable_array = $val
} else {
계속; }
for ($i=0; $i $offset = $this->dbtable_array[$i] 1; 🎜 >$len = $this->dbtable_array[$i 1] - $offset
//array_slice()는 오프셋 및 길이 매개변수로 지정된 배열 배열의 시퀀스를 반환합니다.
//얻은 노드의 하위 배열
$value=array_slice($this->vals,$offset,$len)
//유효한 배열을 가져와서 result array
$this ->array[]=$this->parseEFF($value);
}
return true;
}
//XML 파일을 읽고 반환 문자열
function ReadXml($file)
{
return file_get_contents($file)
}
//유효 배열 가져오기
function parseEFF($ Effective) {
for ($i=0 ; $i < count($효과적); $i ){
$효과[$효과[$i]["태그"]] = $효과[$i]["값" ];
}
return $효과;
}
//xml_query(메서드, 조건, 다중 조건 논리 연산자 및 또는 또는, 삽입 또는 업데이트된 배열)
function xml_query($method ,$condition, $if='and',$array=array())
{
if(($method=='select')||($method=='count')){
return $ this->xml_select($method,$condition,$if)
} elseif($method=='insert') {
return $this->xml_insert($condition,$ if,$array )
} elseif($method=='update') {
return $this->xml_update($condition,$if,$array)
}
}
/ /xml 배열 가져오기
function xml_fetch_array($condition,$if)
{
//$this->querys
$row = $this->array; /데이터 배열 초기화
if($condition) {
//조건이 있는지, 그렇다면 조건에 맞는 배열 생성
//조건 배열, 조건 서식 필드, 연산자 생성,
$c// 조건 배열
$cs=count($condition)/3 //조건 번호
for($i=0;$i<$cs;$i ){
$conditions[]=array( "필드"=>$조건[$i*3],"연산자"=>$조건[$i*3 1],"일치"=>$조건[$i *3 2])
}
//echo count($row)
for($r=0;$rfor( $c=0;$c< $cs;$c ){
//$i ;
$c //현재 상태
$field=$condition['field'] //필드
$operator=$condition[ "operator"];//연산자
$match=$condition['match'] //일치
if(($operator=='=')&&($ row[$r][$ field]==$match)){
$true ;//조건이 충족되면 일치 개수가 1개 증가합니다.
} elseif(($operator==' !=')&&($row[$r][ $field]!=$match)){
$true ;//조건이 충족되면 일치 횟수가 1만큼 증가합니다.
} elseif (($operator=='<')&&($row[$r] [$field]<$match)){
$true ;//조건이 충족되면 일치 횟수가 늘어납니다. 1
} elseif(($operator=='<=')&&($row[$ r][$field]<=$match)){
$true ;//조건이 다음과 같은 경우 충족되면 일치 항목 수가 1만큼 증가합니다.
} elseif(($operator=='>')&&($row [$r][$field]>$match)){
$ true ;//조건이 충족되면 일치 항목 수가 1만큼 증가합니다.
} elseif(($operator=='>')&&($ row[$r][$field]>=$ match)){
$true ;//조건이 충족되면 숫자에 1을 더합니다
}
}
//조건에 따라 값을 가져옵니다
if($if =='and'){
//여러 조건이 and인 경우, 일치 횟수가 조건 수와 같을 때 배열이 생성됩니다.
if($true==$cs){
$result[]=$row[$r];
}
} else {
//여러 조건이 or인 경우, 일치하는 레코드가 있는 경우 배열을 생성합니다.
if ($true! =0){
$result[]=$row[$r]
}
}
//echo $true
//echo "//print_r($true);
$true=0;//조건을 만족하는 숫자는 0으로 재설정되고 다음 사이클에 들어갑니다
}
} else {
$result=$this- >array;
}
//echo ""
//print_r($this->result)
return $result ;
}
//필터링 또는 통계
function xml_select($method,$condition,$if)
{
$result=$this->xml_fetch_array($condition,$if );
if($ method=='select'){
return $result;
} else {
return count($result)
}
}
//데이터 삽입
function xml_insert($condition,$if,$array)
{
$data=$this->xml_fetch_array($condition,$if);//전체 데이터 배열
$data[]=$array ; //삽입 후 전체 데이터 배열
$this->array=$data; //전체 배열 업데이트
$this->WriteXml($data); >}
// 업데이트된 XML을 가져오고
function xml_update($condition,$if,$array)
{
$datas=$this->array;
$subtract=$ this->xml_fetch_array($condition,$if);//업데이트할 배열
//echo ""
//print_r($data);
//print_r( $datas);
//echo "각 레코드에는 ".count($datas[0])" 값이 있습니다.
"
for($i=0;$ i$data=$datas[$i];
//echo "원본 레코드의 ".$i." 항목
foreach($data as $k=>$v){
//echo "-".$i." 항목의 ".$k." 값은 ".$v."입니다.
//echo "-".$k." 값을 찾을 배열은 ".$subtract[0][$k]."
";
if($ v== $subtract[0][$k]){
$is
}
}
if($is==count($data)){
//echo "-- --항목 ".$i."
"
$datas[$i]=$array
//array_splice($datas,$i,$i 1) ;
}
//echo "원본 레코드의 ".$i." 항목은 ".$is."와 일치합니다
"
//echo "원본 레코드에서 ".$i." 항목 끝
$is=0;
}
//array_splice($datas,2,2 1,$array);
// echo "";
//print_r($datas)
$this->WriteXml($datas);
//XML 파일 쓰기(모두 쓰기)
function WriteXml($array)
{
if(!is_writeable($this->dbase)){
die(" Unable to ".$this->dbname.".xml");
}
$xml.="rn ";
$xml.="<$this->dbname>rn";
for($i=0;$i$xml .= "<$this->dbtable>rn";
foreach($array[$i] as $k=>$s){
$xml.="<$k>$ s< /$k>rn";
}
$xml.="$this->dbtable>rn";
}
$xml.="$ this- >dbname>";
$fp=@fopen($this->dbase,"w");
flock($fp, LOCK_EX);
rewind($fp);
fputs($fp,$xml);
fclose($fp);
}
//xml을 한줄씩 작성(10,000줄씩 쓰려고 했는데 매번 빠르다는 느낌이 안들었음) 따라서 이 쓰기 방법은 사용되지 않습니다)
function WriteLine($array)
{
if(!is_writeable($this->dbase)){
die("Cannot write". $this ->dbname.".xml");
}
$fp=@fopen($this->dbase,"w")
rewind($fp); $fp, LOCK_EX);
fputs($fp,"rn")
fputs($fp,"< ;$ this->dbname>rn");
for($i=0;$ifputs($fp,"<$this-> ;dbtable> ;rn");
$xml.="<$this->dbtable>rn";
foreach($array[$i] as $k=>$s){
fputs ($fp,"<$k>$s$k>rn")
}
fputs($fp,"$this->dbtable>rn"); >}
fputs($fp,"$this->dbname>")
fclose($fp)
}
?>
사용법: 레코드 삽입
코드 복사코드는 다음과 같습니다.require_once('xml .class.php'); $xml = new xml("exemple.xml","item")
$newarray = array("title"=>"XML 제목",
"text"=>"PHP의 XML 클래스 테스트! "
);
$insert=$xml->xml_query('insert','','',$newarray);//두 번째와 세 번째 변수 위치는 조건이며, 공백으로 남겨두면 드디어 삽입
기록 수정
코드 복사코드는 다음과 같습니다. require_once('xml.class.php') $xml = new xml("exemple.xml","item")
$array = array("title"=>"XML title",
"text"=>"PHP의 XML 클래스 테스트!"
);
$insert=$xml->xml_query('update','title,=,세상은 어떻게 될까요? 20년 후에는 ','and',$array);//xxx와 동일한 제목 태그를 $array로 바꿉니다(특정 레코드를 수정할 수 있도록 id와 같은 고유한 속성 태그를 생성할 수 있음).
기록 삭제
코드 복사코드는 다음과 같습니다.require_once('xml .class.php'); $xml = new xml("exemple.xml","item")
$array = array()$insert=$xml->xml_query( 'update','title,=,20년 후의 세계 ','and',$array);//배열을 비워두세요
참고: 삭제할 때 값은 xml_update()를 수정하여 xml 파일을 생성할 수 있습니다. 먼저 $array의 값을 판단합니다. 값이 비어 있으면 삭제 효과로 인해 최종 배열에 기록되지 않습니다. xml 파일 작성시 속도가 매우 빠르고(30,000개의 레코드를 테스트했습니다.) 하나의 레코드만 매우 빠르게 수정할 수 있어 중형 웹사이트에서 XML 생성 시 사용하기에 매우 적합합니다. .
위 내용은 xinputemulator의 내용을 포함하여 XML을 데이터베이스로 동작시키는 xinputemulator PHP 클래스를 소개한 내용입니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되었으면 좋겠습니다.
성명:본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.