Heim Backend-Entwicklung PHP-Tutorial 自己动手做一个SQL解释器_PHP

自己动手做一个SQL解释器_PHP

Jun 01, 2016 pm 12:27 PM
query Werden Sie aktiv Eigen 解释

自己动手做一个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>
Nach dem Login kopieren


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was ist die Analyse des 2,8K-Bildschirms? Was ist die Analyse des 2,8K-Bildschirms? Jan 02, 2024 pm 12:21 PM

Beim Kauf von Fernsehern, Computern oder Mobiltelefonen sehen wir oft die Einführung, wie viele K-Bildschirme wir haben, beispielsweise 2,8K-Bildschirme. Zu diesem Zeitpunkt wird es Freunde geben, die nicht viel über elektronische Geräte wissen und neugierig sind, was dieser 2,8K-Bildschirm bedeutet und wie hoch die Auflösung ist. Was bedeutet 2,8K-Bildschirm? Antwort: 2,8K-Bildschirm bedeutet, dass die Bildschirmauflösung 2880*18002K beträgt, was bedeutet, dass die Anzahl der horizontalen Pixel größer als 2000 ist. Bei gleicher Bildschirmgröße gilt: Je höher die Auflösung, desto besser die Bildqualität . Einführung in die Auflösung 1. Da die Punkte, Linien und Flächen auf dem Bildschirm alle aus Pixeln bestehen, gilt: Je mehr Pixel der Monitor anzeigen kann, desto feiner ist das Bild und desto mehr Informationen können im gleichen Bildschirmbereich angezeigt werden. 2. Je höher die Auflösung, desto größer die Pixelanzahl und desto schärfer das erfasste Bild.

So ordnen Sie mehrere Spalten in Power Query per Drag & Drop neu an So ordnen Sie mehrere Spalten in Power Query per Drag & Drop neu an Mar 14, 2024 am 10:55 AM

In diesem Artikel zeigen wir Ihnen, wie Sie mehrere Spalten in PowerQuery per Drag & Drop neu anordnen. Beim Importieren von Daten aus verschiedenen Quellen kann es vorkommen, dass die Spalten nicht in der gewünschten Reihenfolge vorliegen. Durch die Neuordnung von Spalten können Sie diese nicht nur in einer logischen Reihenfolge anordnen, die Ihren Analyse- oder Berichtsanforderungen entspricht, sondern verbessert auch die Lesbarkeit Ihrer Daten und beschleunigt Aufgaben wie Filtern, Sortieren und Durchführen von Berechnungen. Wie ordne ich mehrere Spalten in Excel neu an? Es gibt viele Möglichkeiten, Spalten in Excel neu anzuordnen. Sie können einfach die Spaltenüberschrift auswählen und an die gewünschte Stelle ziehen. Dieser Ansatz kann jedoch umständlich werden, wenn es um große Tabellen mit vielen Spalten geht. Um Spalten effizienter neu anzuordnen, können Sie den erweiterten Abfrageeditor verwenden. Erweiterung der Abfrage

React Query-Datenbank-Plug-in: So importieren und exportieren Sie Daten React Query-Datenbank-Plug-in: So importieren und exportieren Sie Daten Sep 26, 2023 pm 05:37 PM

ReactQuery-Datenbank-Plug-in: Methoden zum Implementieren des Datenimports und -exports, spezifische Codebeispiele sind erforderlich. Mit der weit verbreiteten Anwendung von ReactQuery in der Front-End-Entwicklung beginnen immer mehr Entwickler, es zur Datenverwaltung zu verwenden. In der tatsächlichen Entwicklung müssen wir häufig Daten in lokale Dateien exportieren oder Daten aus lokalen Dateien in die Datenbank importieren. Um diese Funktionen komfortabler umzusetzen, können Sie das ReactQuery-Datenbank-Plugin verwenden. Das ReactQuery-Datenbank-Plugin bietet eine Reihe von Methoden

So teilen Sie Daten mithilfe von Power Query in NTFS auf So teilen Sie Daten mithilfe von Power Query in NTFS auf Mar 15, 2024 am 11:00 AM

In diesem Artikel wird erläutert, wie Sie PowerQuery zum Aufteilen von Daten in Zeilen verwenden. Beim Exportieren von Daten aus anderen Systemen oder Quellen kommt es häufig vor, dass die Daten in Zellen gespeichert werden, die mehrere Werte kombinieren. Mit PowerQuery können wir solche Daten einfach in Zeilen aufteilen, wodurch die Daten einfacher zu verarbeiten und zu analysieren sind. Dies kann passieren, wenn der Benutzer die Excel-Regeln nicht versteht und versehentlich mehrere Daten in eine Zelle eingibt oder wenn die Daten beim Kopieren/Einfügen aus anderen Quellen nicht richtig formatiert sind. Die Verarbeitung dieser Daten erfordert zusätzliche Schritte zum Extrahieren und Organisieren der Informationen für die Analyse oder Berichterstellung. Wie teilt man Daten in PowerQuery auf? PowerQuery-Transformationen können auf einer Vielzahl verschiedener Faktoren wie Word basieren

Was genau ist PHP SDK? Was genau ist PHP SDK? Mar 11, 2024 am 11:24 AM

PHPSDK ist ein Softwareentwicklungs-Toolkit, das Entwickler dabei unterstützt, Dienste oder API-Schnittstellen von Drittanbietern schnell und einfach in die PHP-Sprache zu integrieren. Der vollständige Name des SDK lautet Software Development Kit. Es bietet eine Reihe von Funktionen, Klassen, Methoden und Tools, um Entwicklern die Interaktion mit externen Diensten zu erleichtern. Bei der PHP-Entwicklung enthält das SDK normalerweise die Kapselung bestimmter Dienste, um den Prozess des Schreibens des zugehörigen Codes durch Entwickler zu vereinfachen. PHPSD

Verwenden Sie das Schlüsselwort typedef in der C-Sprache, um Strukturen zu interpretieren Verwenden Sie das Schlüsselwort typedef in der C-Sprache, um Strukturen zu interpretieren Aug 25, 2023 pm 01:25 PM

Typedef „C“ ermöglicht die Definition neuer Datentypnamen mithilfe des Schlüsselworts „typedef“. Mit „typedef“ können wir keinen neuen Datentyp erstellen, sondern einen neuen Namen für einen bereits vorhandenen Typ definieren. Die chinesische Übersetzung von Syntaxtypedefdatatypenewname;Beispiel lautet: Beispieltypdefintbhanu;inta;bhanua;%dDiese Anweisung teilt dem Compiler mit, ob es sein soll

React Query Database Plugin: Strategien für die Datensicherung und -wiederherstellung React Query Database Plugin: Strategien für die Datensicherung und -wiederherstellung Sep 28, 2023 pm 11:22 PM

ReactQuery-Datenbank-Plugin: Strategien zur Implementierung der Datensicherung und -wiederherstellung, spezifische Codebeispiele sind erforderlich. Einführung: In der modernen Webentwicklung ist die Datensicherung und -wiederherstellung eine sehr wichtige Aufgabe. Insbesondere bei der Verwendung von Statusverwaltungstools wie ReactQuery müssen wir die Datensicherheit und Zuverlässigkeit gewährleisten. In diesem Artikel wird ein auf ReactQuery basierendes Datenbank-Plug-in zur Implementierung von Datensicherungs- und -wiederherstellungsstrategien vorgestellt und spezifische Codebeispiele bereitgestellt. ReactQu

React Query Database Plugin: Tipps zur Datenkomprimierung und -dekomprimierung React Query Database Plugin: Tipps zur Datenkomprimierung und -dekomprimierung Sep 26, 2023 pm 08:03 PM

ReactQuery-Datenbank-Plugin: Tipps zur Implementierung der Datenkomprimierung und -dekomprimierung, spezifische Codebeispiele erforderlich Einführung: In der modernen Webanwendungsentwicklung ist die Verarbeitung großer Mengen an Datenabfragen eine häufige Aufgabe. ReactQuery ist eine leistungsstarke Bibliothek, die eine einfache, intuitive Möglichkeit zur Verwaltung von Datenabfragen und -zuständen bietet. Obwohl ReactQuery selbst hervorragend ist, müssen wir beim Umgang mit großen Datenmengen möglicherweise einige zusätzliche Tricks berücksichtigen, um die Leistung zu verbessern und den Speicherplatz zu optimieren. In diesem Artikel wird vorgestellt

See all articles