http://www.dev-club.com/club/bbs/showEssence.asp?id=18267

解决方案 »

  1.   

    研究一下旅行的wdb或者ctb或者华育论坛,都是文本储存的:)
      

  2.   

    自己动手做一个SQL解释器
    在一些小型的应用中,完全没有必要使用大型数据库软件。自己做一个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>
      

  3.   

    xuzuning(唠叨) 写的吧,偶转贴:)http://www.dev-club.com/club/bbs/showEssence.asp?id=18267
      

  4.   

    <?php  
     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);  
    ?>
    这个简单,一个小小的计数器。是用文本文件来保存数据的。
      

  5.   

    我这有个完整例子,看看吧
    //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>
      

  6.   

    谢谢各位。学PHP才几天,请问,   $fp=fopen("data/counter.txt","r"); 里fp不要声明就可以用了吗?
      

  7.   

    补充以下,我的意思是,php里怎么不声明变量,就可以用了呢。是吗?
      

  8.   

    php是弱类型变量,你给它赋值,会自动辨别
      

  9.   

    feel8(准备早起的鸟) 帖的类太经典了。
     收藏 学习