自己动手做一个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
$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->_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
$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>

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

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.

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

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

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

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

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

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

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
