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; } ?>测试例: <pre> <?php //require_once "db_text.php";$conn = new DB_text; $conn->connect("text1.txt");$conn->query("insert into manage (id,title) values (10,'abcd')"); $conn->query("insert into manage (id,title) values (2,'43d')"); $conn->query("insert into manage (id,title) values (20,'tuu')"); $conn->query("update manage set id=101,test='a' where id=10"); //$conn->query("delete from manage where id='10'"); //$conn->query("delete from manage where id=10 or table='code'"); //$rt = $conn->query("select * from manage where id=101 or table='code' group by 1 order by 1 asc"); $rt = $conn->query("select * from manage group by 1 order by id desc");print_r($rt);?> </pre>
echo "<p>Order processed at "; echo $date; $outputstring = $date."\t".$_POST["tyreqty"]." tyres \t".$_POST["oilqty"]." oil\t".$_POST["sparkqty"]." sparkplugs\t\$"."\t". $address."\n"; // open file for appending @ $fp = fopen("C:/Apache/Apache2/htdocs/orders.txt", "a"); flock($fp, 2);
if (!$fp) { echo "<p><strong> Your order could not be processed at this time. " ."Please try again later.</strong></p></body></html>"; exit; } fwrite($fp, $outputstring); flock($fp, 3); fclose($fp); echo "<p>Order written.</p>"; ?> </body> </html> 查看所保存的数据可以用下面的: //vieworders.php<html> <head> <title>Bob's Auto Parts - Customer Orders</title> </head> <body> <h1>Bob's Auto Parts</h1> <h2>Customer Orders</h2> <? $fp = fopen("C:/Apache/Apache2/htdocs/ders.txt", "r");
flock($fp, 1);
if (!$fp) { echo "<p><strong>No orders pending." ."Please try again later.</strong></p></body></html>"; exit; } while (!feof($fp)) { $order= fgets($fp, 100); echo $order."<br>"; } flock($fp, 3); echo "Final position of the file pointer is ".(ftell($fp)); echo "<br>"; rewind($fp); echo "After rewind, the position is ".(ftell($fp)); echo "<br>"; fclose($fp); ?> </body> </html>
在一些小型的应用中,完全没有必要使用大型数据库软件。自己做一个SQL解释器就能用数据库的方式来管理了。
这个解释器,能解释常用的SQL命令。你可以自行添加其他功能。<?php
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<count($key);$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<count($v);$i+=2)
$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,$regs)) {
$search = eregi_replace($regs[1]," $regs[1] ",$search);
}
while(eregi("([><!] +=)",$search,$regs)) {
$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<count($ar);$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;
}
?>测试例:
<pre>
<?php
//require_once "db_text.php";$conn = new DB_text;
$conn->connect("text1.txt");$conn->query("insert into manage (id,title) values (10,'abcd')");
$conn->query("insert into manage (id,title) values (2,'43d')");
$conn->query("insert into manage (id,title) values (20,'tuu')");
$conn->query("update manage set id=101,test='a' where id=10");
//$conn->query("delete from manage where id='10'");
//$conn->query("delete from manage where id=10 or table='code'");
//$rt = $conn->query("select * from manage where id=101 or table='code' group by 1 order by 1 asc");
$rt = $conn->query("select * from manage group by 1 order by id desc");print_r($rt);?>
</pre>
if(!file_exists("data/counter.txt")){
$fp=fopen("data/counter.txt","w");
fwrite($fp,"1");
fclose($fp);
}
else{
$fp=fopen("data/counter.txt","r");
$counter=fread($fp,6);
$counter++;
fclose($fp);
}
$fp=fopen("data/counter.txt","w");
fwrite($fp,$counter);
fclose($fp);
?>
这个简单,一个小小的计数器。是用文本文件来保存数据的。
//order.html
<html>
<head>
<title>Bob's Auto Parts</title>
</head>
<body>
<h1>Bob's Auto Parts</h1>
<h2>Order Form</h2><form action="processorder.php" method=post>
<table border=0>
<tr bgcolor=#cccccc>
<td width=150>Item</td>
<td width=15>Quantity</td>
</tr>
<tr>
<td>Tyres</td>
<td align=center><input type="text" name="tyreqty" size=3 maxlength=3></td>
</tr>
<tr>
<td>Oil</td>
<td align=center><input type="text" name="oilqty" size=3 maxlength=3></td>
</tr>
<tr>
<td>Spark Plugs</td>
<td align=center><input type="text" name="sparkqty" size=3 maxlength=3></td>
</tr>
<tr>
<td>Address</td>
<td align=center><input type="text" name="address" size=3 maxlength=13></td>
<tr>
<td colspan=2 align=center><input type=submit value="Submit Order"></td>
</tr>
</table>
</form> </body>
</html>
把输入的数据保存在C:/Apache/Apache2/htdocs/orders.txt
//processorder.php
<html>
<head>
<title>Bob's Auto Parts - Order Results</title>
</head>
<body>
<h1>Bob's Auto Parts</h1>
<h2>Order Results</h2>
<?
define("TYREPRICE", 100);
define("OILPRICE", 10);
define("SPARKPRICE", 4); $date = date("H:i, jS F");
echo "<p>Order processed at ";
echo $date;
$outputstring = $date."\t".$_POST["tyreqty"]." tyres \t".$_POST["oilqty"]." oil\t".$_POST["sparkqty"]." sparkplugs\t\$"."\t". $address."\n"; // open file for appending
@ $fp = fopen("C:/Apache/Apache2/htdocs/orders.txt", "a"); flock($fp, 2);
if (!$fp)
{
echo "<p><strong> Your order could not be processed at this time. "
."Please try again later.</strong></p></body></html>";
exit;
} fwrite($fp, $outputstring);
flock($fp, 3);
fclose($fp); echo "<p>Order written.</p>"; ?>
</body>
</html>
查看所保存的数据可以用下面的:
//vieworders.php<html>
<head>
<title>Bob's Auto Parts - Customer Orders</title>
</head>
<body>
<h1>Bob's Auto Parts</h1>
<h2>Customer Orders</h2>
<? $fp = fopen("C:/Apache/Apache2/htdocs/ders.txt", "r");
flock($fp, 1);
if (!$fp)
{
echo "<p><strong>No orders pending."
."Please try again later.</strong></p></body></html>";
exit; } while (!feof($fp))
{
$order= fgets($fp, 100);
echo $order."<br>";
}
flock($fp, 3);
echo "Final position of the file pointer is ".(ftell($fp));
echo "<br>";
rewind($fp);
echo "After rewind, the position is ".(ftell($fp));
echo "<br>";
fclose($fp);
?>
</body>
</html>
收藏 学习