搜尋
首頁後端開發php教程自己动手做一个SQL解释器_PHP

自己动手做一个SQL解释器
在一些小型的应用中,完全没有必要使用大型数据库软件。自己做一个SQL解释器就能用数据库的方式来管理了。
这个解释器,能解释常用的SQL命令。你可以自行添加其他功能。

class DB_text {
var $conn;
var $classname = "db_text";
var $database;
function on_create() {
}
function connect($database_name) {
$this->database = $database_name;
if(! file_exists($database_name)) {
$this->conn = array();
$this->_close();
}
$fp = fopen($this->database,"r");
$this->conn = unserialize(fread($fp,filesize($this->database)));
fclose($fp);
}
function &query($query) {
if(eregi("select ",$query)) return $this->_select($query);
if(eregi("insert ",$query)) return $this->_insert($query);
if(eregi("delete ",$query)) return $this->_delete($query);
if(eregi("update ",$query)) return $this->_update($query);
return array();
}
function fetch_row(&$result) {
if(list($key,$value) = each($result))
return $value;
return false;
}
function num_rows($result) {
return count($result);
}

/**
* query的辅助函数
*/
function _select($query) {
if(eregi("(order by (. ))",$query,$regs)) {
$order = $regs[2];
$query = eregi_replace($regs[1],"",$query);
}
if(eregi("(group by (. ))",$query,$regs)) {
$group = $regs[2];
$query = eregi_replace($regs[1],"",$query);
}
eregi("select .* from ([0-9a-z_] ) *(where (. ))?",$query,$regs);
if($regs[3] != "") {
$keys = $this->_where($regs[3],"\$this->conn[$regs[1]]");
while(list($key,$value) = each($keys)) {
$rs[] = $this->conn[$regs[1]][$value];
}
}else {
$rs = $this->conn[$regs[1]];
}
if($order) {
sscanf($order,"%s %s",$key,$type);
if(empty($type)) $type = "asc";
$this->_sort($rs,$key,$type);
}
return $rs;
}
function _insert($query) {
eregi("insert into ([0-9a-z_] ) *(. ) *values? *(. )",$query,$regs);
eval("\$key=array$regs[2];");
eval("\$value=array$regs[3];");
for($i=0;$i $rs[$key[$i]] = $value[$i];
$this->conn[$regs[1]][] = $rs;
$this->_close();
}
function _update($query) {
eregi("update ([0-9a-z_] ) set *(,?.*=.*) ( where (. ))",$query,$regs);
$regs[2] = eregi_replace(",","=",$regs[2]);
$v = split("=",$regs[2]);
$keys = $this->_where($regs[4],"\$this->conn[$regs[1]]");
while(list($key,$value) = each($keys)) {
for($i=0;$i $this->conn[$regs[1]][$value][$v[$i]] = eregi_replace("'","",$v[$i 1]);
}
$this->_close();
}
function _delete($query) {
eregi("delete from ([0-9a-z_] ) *(where (. ))?",$query,$regs);
$keys = $this->_where($regs[3],"\$this->conn[$regs[1]]");
while(list($key,$value) = each($keys)) {
unset($this->conn[$regs[1]][$value]);
}
reset($this->conn[$regs[1]]);
while(list($key,$value) = each($this->conn[$regs[1]])) {
$ch[] = $value;
}
$this->conn[$regs[1]] = $ch;
$this->_close();
}
function _where($search,$table) {
$search = eregi_replace("\("," ( ",$search);
$search = eregi_replace("\)"," ) ",$search);
$search = eregi_replace("\ "," ",$search);
$search = eregi_replace("\*"," * ",$search);
while(eregi("[^ ]([*/> $search = eregi_replace($regs[1]," $regs[1] ",$search);
}
while(eregi("([> $search = eregi_replace($regs[1],eregi_replace(" ","",$regs[1]),$search);
}
$search = eregi_replace(" "," ",trim($search));
$search = eregi_replace(" and "," && ",$search);
$search = eregi_replace(" or "," || ",$search);
$search = eregi_replace(" = "," == ",$search);
$ar = split(" ",$search);
eval("\$t=$table;");

for($i=0;$i if(isset($t[0][$ar[$i]]))
$ar[$i] = "\$value[".$ar][$i]."]";
}
$expr = "\$expl=(".join(" ",$ar).");";

while(list($key,$value) = each($t)) {
eval($expr);
if($expl)
$keys[] = $key;
}
return $keys;
}
function _sort(&$ar,$key=0,$mode="desc") {
global $cmp_key;
$cmp_key = $key;
if($mode == "asc")
usort($ar,_cmp_asc);
else
usort($ar,_cmp_desc);
}
function _close() {
$fp = fopen($this->database,"w");
fwrite($fp,serialize($this->conn));
fclose($fp);
}
}

/** 排序键
*/
$cmp_key = "";

/** 排序用工作函数(降序 由usort()调用)
*/
function _cmp_desc($a,$b) {
global $cmp_key;
if ($a[$cmp_key] == $b[$cmp_key]) return 0;
return ($a[$cmp_key] > $b[$cmp_key]) ? -1 : 1;
}

/** 排序用工作函数(升序 由usort()调用)
*/
function _cmp_asc($a,$b) {
global $cmp_key;
if ($a[$cmp_key] == $b[$cmp_key]) return 0;
return ($a[$cmp_key] > $b[$cmp_key]) ? 1 : -1;
}
?>

测试例:

<br>
<?php <br>
//require_once "db_text.php";<br>
<br>
$conn = new DB_text;<br>
$conn->connect("text1.txt");<br>
<br>
$conn->query("insert into manage (id,title) values (10,'abcd')");<br>
$conn->query("insert into manage (id,title) values (2,'43d')");<br>
$conn->query("insert into manage (id,title) values (20,'tuu')");<br>
$conn->query("update manage set id=101,test='a' where id=10");<br>
//$conn->query("delete from manage where id='10'");<br>
//$conn->query("delete from manage where id=10 or table='code'");<br>
<br>
<br>
//$rt = $conn->query("select * from manage where id=101 or table='code' group by 1 order by 1 asc");<br>
$rt = $conn->query("select * from manage group by 1 order by id desc");<br>
<br>
print_r($rt);<br>
<br>
?><br>


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
2.8k屏幕是什么解析2.8k屏幕是什么解析Jan 02, 2024 pm 12:21 PM

我们经常会在购买电视,电脑或者手机时看到多少K屏幕这种介绍,例如2.8K屏幕。每当这个时候就会有对电子设备不太了解的小伙伴好奇这个2.8K屏幕到底是什么意思,分辨率又是什么。2.8k屏幕什么意思答:2.8k屏幕的意思是屏幕的分辨率为2880*18002K就是横向像素点数量大于2000,相同大小的屏幕,分辨率越高画面质量越好。分辨率介绍1、由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多。2、分辨率越高,像素的数目越多,感应到的图像越

如何通过拖放在Power Query中对多列进行重新排序如何通过拖放在Power Query中对多列进行重新排序Mar 14, 2024 am 10:55 AM

在这篇文章中,我们将向你展示如何通过拖放在PowerQuery中对多列进行重新排序。通常,从各种来源导入数据时,列可能不是所需的顺序。重新排序列不仅允许您按照符合您的分析或报告需求的逻辑顺序排列它们,还可以提高数据的可读性,并加快过滤、排序和执行计算等任务。如何在Excel中重新排列多个列?在Excel中,重新排列列的方法有多种。您可以简单地选择列标题,然后将其拖动到所需位置。但是,当处理包含许多列的大表时,这种方法可能会变得繁琐。为了更高效地重新排列列,您可以使用增强查询编辑器。通过增强查询编

React Query 数据库插件:实现数据导入和导出的方法React Query 数据库插件:实现数据导入和导出的方法Sep 26, 2023 pm 05:37 PM

ReactQuery数据库插件:实现数据导入和导出的方法,需要具体代码示例随着ReactQuery在前端开发中的广泛应用,越来越多的开发者开始使用它来管理数据。而在实际开发中,我们经常需要将数据导出到本地文件或从本地文件导入数据到数据库中。为了更方便地实现这些功能,可以使用ReactQuery数据库插件。ReactQuery数据库插件提供了一系列方

如何使用Power Query将数据拆分为NTFS如何使用Power Query将数据拆分为NTFSMar 15, 2024 am 11:00 AM

本文将介绍如何使用PowerQuery将数据进行行拆分。在从其他系统或源导出数据时,常常会遇到数据存储在单元格中组合多个值的情况。通过PowerQuery,我们可以轻松将这样的数据拆分成行,使得数据更易于处理和分析。若用户不了解Excel的规则并意外将多个数据输入到一个单元格,或者在从其他来源复制/粘贴数据时未正确格式化,就会出现这种情况。要处理这些数据,需要额外的步骤来提取和整理信息,以便进行分析或报告。如何在PowerQuery中拆分数据?PowerQuery转换可以根据各种不同因素(例如字

PHP SDK究竟是什么?PHP SDK究竟是什么?Mar 11, 2024 am 11:24 AM

PHPSDK是一种软件开发工具包,用于辅助开发人员在PHP语言中快速、方便地集成第三方服务或API接口。SDK全称为SoftwareDevelopmentKit,即软件开发工具包,它提供了一系列的函数、类、方法和工具,使得开发者能够更容易地与外部服务进行交互。在PHP开发中,SDK通常包含了对特定服务的封装,以简化开发者编写相关代码的流程。PHPSD

使用C语言中的typedef关键字来解释结构体使用C语言中的typedef关键字来解释结构体Aug 25, 2023 pm 01:25 PM

Typedef&lsquo;C&rsquo;允许使用&lsquo;typedef&rsquo;关键字定义新的数据类型名称。使用&lsquo;typedef&rsquo;,我们不能创建新的数据类型,而是为已经存在的类型定义一个新的名称。Syntaxtypedefdatatypenewname;Example的中文翻译为:示例typedefintbhanu;inta;bhanua;%dThisstatementtellsthecompilertorec

React Query 数据库插件:实现数据备份和还原的策略React Query 数据库插件:实现数据备份和还原的策略Sep 28, 2023 pm 11:22 PM

ReactQuery数据库插件:实现数据备份和还原的策略,需要具体代码示例引言:在现代的Web开发中,数据的备份和还原是非常重要的一项任务。特别是在使用ReactQuery这样的状态管理工具时,我们需要确保数据的安全性和可靠性。本文将介绍一种基于ReactQuery的数据库插件,用于实现数据备份和还原的策略,并提供具体的代码示例。ReactQu

React Query 数据库插件:实现数据压缩和解压缩的技巧React Query 数据库插件:实现数据压缩和解压缩的技巧Sep 26, 2023 pm 08:03 PM

ReactQuery数据库插件:实现数据压缩和解压缩的技巧,需要具体代码示例引言:在现代Web应用开发中,处理大量的数据查询是一项常见的任务。ReactQuery是一个强大的库,提供了简单、直观的方式来管理数据查询和状态。尽管ReactQuery本身已经非常优秀,但当处理大量数据时,我们可能需要考虑一些额外的技巧来提高性能和优化存储空间。本文将介绍

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器