仓酷云

标题: PHP网站制作之从头封装的PHPLib DB类(保举复杂项目使... [打印本页]

作者: 愤怒的大鸟    时间: 2015-2-4 00:10
标题: PHP网站制作之从头封装的PHPLib DB类(保举复杂项目使...
总的来说,在这一个月左右的时间中,学到的不少,但是也遇到不少的问题,比如批量图片的上传,一直到现在也不懂,如何实现动态的增加上传图片的数量。封装|项目   为了便于本人的开辟,然而又不想利用ADODB、PEAR::DB如许的庞然大物,就在PHPLib DB类的基本上、参考PEAR::DB类,封装了本人的DB类,复杂好使,十分便利。今朝只针对MySQL无效,没甚么手艺含量,权且为参考。
利用本类库只是需求把上面代码保留为database.inc.php或database.class.php,在本人需求的中央include出去,然后实例化对象,然后挪用毗连办法,最初在履行操作。

[  毗连数据库 ]
//包括数据库处置类文件
include_once("database.inc.php");

//当地数据库设置装备摆设
define("DB_HOST",    "localhost"); //数据库办事器
define("DB_USER_NAME",   "root");  //数据库用户名
define("DB_USER_PASS",   "");   //暗码
define("DB_DATABASE",   "test");  //数据库

//毗连当地数据库
$db = new DB_Sql();
$db->connect(DB_DATABASE, DB_HOST, DB_USER_NAME, DB_USER_PASS);


[  利用办法 ]
//获得一切纪录
$sql = "SELECT * FROM table1";
$all_record = $db->get_all($sql);

//获得一条
$sql = "SELECT * FROM table1 WHERE id = '1'";
$one_row = $db->get_one($sql);

//分页查询,提取20笔记录
$sql = "SELECT * FROM table1";
$page_record = $db->limit_query($sql, $start=0, $offset=20, $order="ORDER BY id DESC");

//提取指定命目标纪录
$sql = "SELECT * FROM table1";
$limit_record = $db->get_limit($sql);

//统计纪录数,统计一切类型为先生的
$count = $db->count("table1", "id", "type = 'student'");

//拔出一笔记录
$info_array = array(
  "name"  => "heiyeluren",
  "type"  => "student",
  "age"  => "22",
  "gender" => "boy"
);
$db->insert("table1", $info_array);

//更新一笔记录
$info_array = array(
  "name"  => "heiyeluren",
  "type"  => "teacher",
  "age"  => "22",
  "gender" => "boy"
);
$db->update("table1", $info_array, "name = 'heiyeluren'");

//删除纪录
$db->delete("table1", "name = 'heiyeluren'");

//履行一条无了局集的SQL
$db->execute("DELETE FROM table1 WHERE name = 'heiyeluren'");



[  类库代码 ]

<?php
/**
* 文件: database.inc.php
* 描写: 数据库操作类
* 作者: heiyeluren
* 创立: 2005-12-25
* 修正: 2005-12-26
* 申明: 本库利用PHPLib DB库作为中心, 同时增添一些适用办法, 具体参考正文
*/
class DB_Sql
{
  
  /* public: connection parameters */
  var $Host     = "";
  var $Database = "";
  var $User     = "";
  var $Password = "";
  /* public: configuration parameters */
  var $Auto_Free     = 1;     ## Set to 1 for automatic mysql_free_result()
  var $Debug         = 0;     ## Set to 1 for debugging messages.
  var $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning)
  var $PConnect      = 0;     ## Set to 1 to use persistent database connections
  var $Seq_Table     = "db_sequence";
  /* public: result array and current row number */
  var $Record   = array();
  var $Row;
  /* public: current error number and error text */
  var $Errno    = 0;
  var $Error    = "";
  /* public: this is an api revision, not a CVS revision. */
  var $type     = "mysql";
  //var $revision = "1.2";
  /* private: link and query handles */
  var $Link_ID  = 0;
  var $Query_ID = 0;
  var $locked   = false;      ## set to true while we have a lock
  /* public: constructor */
  function DB_Sql() {
    $this->query($query);
  }
  
  /* public: some trivial reporting */
  function link_id() {
    return $this->Link_ID;
  }
  function query_id() {
    return $this->Query_ID;
  }
  /* public: connection management */
  function connect($Database = "", $Host = "", $User = "", $Password = "") {
    /* Handle defaults */
    if ("" == $Database)
      $Database = $this->Database;
    if ("" == $Host)
      $Host     = $this->Host;
    if ("" == $User)
      $User     = $this->User;
    if ("" == $Password)
      $Password = $this->Password;
      
    /* establish connection, select database */
    if ( 0 == $this->Link_ID ) {
   
      if(!$this->PConnect) {
        $this->Link_ID = mysql_connect($Host, $User, $Password);
      } else {
        $this->Link_ID = mysql_pconnect($Host, $User, $Password);
      }
      if (!$this->Link_ID) {
        $this->halt("connect($Host, $User, \$Password) failed.");
        return 0;
      }
      if (!@mysql_select_db($Database,$this->Link_ID)) {
        $this->halt("cannot use database ".$Database);
        return 0;
      }
    }
   
    return $this->Link_ID;
  }
  /* public: discard the query result */
  function free() {
      @mysql_free_result($this->Query_ID);
      $this->Query_ID = 0;
  }
  /* public: perform a query */
  function query($Query_String) {
    /* No empty queries, please, since PHP4 chokes on them. */
    if ($Query_String == "")
      /* The empty query string is passed on from the constructor,
       * when calling the class without a query, e.g. in situations
       * like these: '$db = new DB_Sql_Subclass;'
       */
      return 0;
    if (!$this->connect()) {
      return 0; /* we already complained in connect() about that. */
    };
    # New query, discard previous result.
    if ($this->Query_ID) {
      $this->free();
    }
    if ($this->Debug)
      printf("Debug: query = %s<br>\n", $Query_String);
    $this->Query_ID = @mysql_query($Query_String,$this->Link_ID);
    $this->Row   = 0;
    $this->Errno = mysql_errno();
    $this->Error = mysql_error();
    if (!$this->Query_ID) {
      $this->halt("Invalid SQL: ".$Query_String);
    }
    # Will return nada if it fails. That's fine.
    return $this->Query_ID;
  }
  /* public: walk result set */
  function next_record() {
    if (!$this->Query_ID) {
      $this->halt("next_record called with no query pending.");
      return 0;
    }
    $this->Record = @mysql_fetch_array($this->Query_ID);
    $this->Row   += 1;
    $this->Errno  = mysql_errno();
    $this->Error  = mysql_error();
    $stat = is_array($this->Record);
    if (!$stat && $this->Auto_Free) {
      $this->free();
    }
    return $stat;
  }
  /* public: position in result set */
  function seek($pos = 0) {
    $status = @mysql_data_seek($this->Query_ID, $pos);
    if ($status)
      $this->Row = $pos;
    else {
      $this->halt("seek($pos) failed: result has ".$this->num_rows()." rows.");
      /* half assed attempt to save the day,
       * but do not consider this documented or even
       * desireable behaviour.
       */
      @mysql_data_seek($this->Query_ID, $this->num_rows());
      $this->Row = $this->num_rows();
      return 0;
    }
    return 1;
  }
  /* public: table locking */
  function lock($table, $mode = "write") {
    $query = "lock tables ";
    if(is_array($table)) {
      while(list($key,$value) = each($table)) {
        // text keys are "read", "read local", "write", "low priority write"
        if(is_int($key)) $key = $mode;
        if(strpos($value, ",")) {
          $query .= str_replace(",", " $key, ", $value) . " $key, ";
        } else {
          $query .= "$value $key, ";
        }
      }
      $query = substr($query, 0, -2);
    } elseif(strpos($table, ",")) {
      $query .= str_replace(",", " $mode, ", $table) . " $mode";
    } else {
      $query .= "$table $mode";
    }
    if(!$this->query($query)) {
      $this->halt("lock() failed.");
      return false;
    }
    $this->locked = true;
    return true;
  }
  
  function unlock() {
    // set before unlock to avoid potential loop
    $this->locked = false;
    if(!$this->query("unlock tables")) {
      $this->halt("unlock() failed.");
      return false;
    }
    return true;
  }
  /* public: evaluate the result (size, width) */
  function affected_rows() {
    return @mysql_affected_rows($this->Link_ID);
  }
  function num_rows() {
    return @mysql_num_rows($this->Query_ID);
  }
  function num_fields() {
    return @mysql_num_fields($this->Query_ID);
  }
  /* public: shorthand notation */
  function nf() {
    return $this->num_rows();
  }
  function np() {
    print $this->num_rows();
  }
  function f($Name) {
    if (isset($this->Record[$Name])) {
      return $this->Record[$Name];
    }
  }
  function p($Name) {
    if (isset($this->Record[$Name])) {
      print $this->Record[$Name];
    }
  }
  /* public: sequence numbers */
  function nextid($seq_name) {
    /* if no current lock, lock sequence table */
    if(!$this->locked) {
      if($this->lock($this->Seq_Table)) {
        $locked = true;
      } else {
        $this->halt("cannot lock ".$this->Seq_Table." - has it been created?");
        return 0;
      }
    }
   
    /* get sequence number and increment */
    $q = sprintf("select nextid from %s where seq_name = '%s'",
               $this->Seq_Table,
               $seq_name);
    if(!$this->query($q)) {
      $this->halt('query failed in nextid: '.$q);
      return 0;
    }
   
    /* No current value, make one */
    if(!$this->next_record()) {
      $currentid = 0;
      $q = sprintf("insert into %s values('%s', %s)",
                 $this->Seq_Table,
                 $seq_name,
                 $currentid);
      if(!$this->query($q)) {
        $this->halt('query failed in nextid: '.$q);
        return 0;
      }
    } else {
      $currentid = $this->f("nextid");
    }
    $nextid = $currentid + 1;
    $q = sprintf("update %s set nextid = '%s' where seq_name = '%s'",
               $this->Seq_Table,
               $nextid,
               $seq_name);
    if(!$this->query($q)) {
      $this->halt('query failed in nextid: '.$q);
      return 0;
    }
   
    /* if nextid() locked the sequence table, unlock it */
    if($locked) {
      $this->unlock();
    }
   
    return $nextid;
  }
  /* public: return table metadata */
  function metadata($table = "", $full = false) {
    $count = 0;
    $id    = 0;
    $res   = array();
    /*
     * Due to compatibility problems with Table we changed the behavior
     * of metadata();
     * depending on $full, metadata returns the following values:
     *
     * - full is false (default):
     * $result[]:
     *   [0]["table"]  table name
     *   [0]["name"]   field name
     *   [0]["type"]   field type
     *   [0]["len"]    field length
     *   [0]["flags"]  field flags
     *
     * - full is true
     * $result[]:
     *   ["num_fields"] number of metadata records
     *   [0]["table"]  table name
     *   [0]["name"]   field name
     *   [0]["type"]   field type
     *   [0]["len"]    field length
     *   [0]["flags"]  field flags
     *   ["meta"][field name]  index of field named "field name"
     *   This last one could be used if you have a field name, but no index.
     *   Test:  if (isset($result['meta']['myfield'])) { ...
     */
    // if no $table specified, assume that we are working with a query
    // result
    if ($table) {
      $this->connect();
      $id = @mysql_list_fields($this->Database, $table);
      if (!$id) {
        $this->halt("Metadata query failed.");
        return false;
      }
    } else {
      $id = $this->Query_ID;
      if (!$id) {
        $this->halt("No query specified.");
        return false;
      }
    }

    $count = @mysql_num_fields($id);
    // made this IF due to performance (one if is faster than $count if's)
    if (!$full) {
      for ($i=0; $i<$count; $i++) {
        $res[$i]["table"] = @mysql_field_table ($id, $i);
        $res[$i]["name"]  = @mysql_field_name  ($id, $i);
        $res[$i]["type"]  = @mysql_field_type  ($id, $i);
        $res[$i]["len"]   = @mysql_field_len   ($id, $i);
        $res[$i]["flags"] = @mysql_field_flags ($id, $i);
      }
    } else { // full
      $res["num_fields"]= $count;
   
      for ($i=0; $i<$count; $i++) {
        $res[$i]["table"] = @mysql_field_table ($id, $i);
        $res[$i]["name"]  = @mysql_field_name  ($id, $i);
        $res[$i]["type"]  = @mysql_field_type  ($id, $i);
        $res[$i]["len"]   = @mysql_field_len   ($id, $i);
        $res[$i]["flags"] = @mysql_field_flags ($id, $i);
        $res["meta"][$res[$i]["name"]] = $i;
      }
    }
   
    // free the result only if we were called on a table
    if ($table) {
      @mysql_free_result($id);
    }
    return $res;
  }
  /* public: find available table names */
  function table_names() {
    $this->connect();
    $h = @mysql_query("show tables", $this->Link_ID);
    $i = 0;
    while ($info = @mysql_fetch_row($h)) {
      $return[$i]["table_name"]      = $info[0];
      $return[$i]["tablespace_name"] = $this->Database;
      $return[$i]["database"]        = $this->Database;
      $i++;
    }
   
    @mysql_free_result($h);
    return $return;
  }
  /* private: error handling */
  function halt($msg) {
    $this->Error = @mysql_error($this->Link_ID);
    $this->Errno = @mysql_errno($this->Link_ID);
    if ($this->locked) {
      $this->unlock();
    }
    if ($this->Halt_On_Error == "no")
      return;
    $this->haltmsg($msg);
    if ($this->Halt_On_Error != "report")
      die("Session halted.");
  }
  function haltmsg($msg) {
    printf("</td></tr></table><b>Database error:</b> %s<br>\n", $msg);
    printf("<b>MySQL Error</b>: %s (%s)<br>\n",
      $this->Errno,
      $this->Error);
  }

//----------------------------------
// 模块: 自界说函数
// 功效: 局部适用的数据库处置办法
// 作者: heiyeluren
// 工夫: 2005-12-26
//----------------------------------
/**
  * 办法: execute($sql)
  * 功效: 履行一条SQL语句,次要针对没有了局集前往的SQL
  * 参数: $sql 需求履行的SQL语句,例如:execute("DELETE FROM table1 WHERE id = '1'")
  * 前往: 更新胜利前往True,掉败前往False
  */
function execute($sql)
{
  if (empty($sql))
  {
   $this->error("Invalid parameter");
  }
  if (!$this->query($sql))
  {
   return false;
  }
  return true;
}
/**
  * 办法: get_all($sql)
  * 功效: 获得SQL履行的一切纪录
  * 参数: $sql  需求履行的SQL,例如: get_all("SELECT * FROM Table1")
  * 前往: 前往包括一切查询了局的二维数组
  */
function get_all($sql)
{
  $this->query($sql);
  $result_array = array();
  while($this->next_record())
  {
   
   $result_array[] = $this->Record;
  }
  if (count($result_array)<=0)
  {
   return 0;
  }
  return $result_array;
}
/**
  * 办法: get_one($sql)
  * 功效: 获得SQL履行的一笔记录
  * 参数: $sql 需求履行的SQL,例如: get_one("SELECT * FROM Table1 WHERE id = '1'")
  * 前往: 前往包括一条查询了局的一维数组
  */
function get_one($sql)
{
  $this->query($sql);
  if (!$this->next_record())
  {
   return 0;
  }
  return $this->Record;
}
/**
  * 办法: get_limit($sql, $limit)
  * 功效: 获得SQL履行的指定命量的纪录
  * 参数:
  * $sql  需求履行的SQL,例如: SELECT * FROM Table1
  * $limit 需求限制的纪录数
  * 例如  需求获得10笔记录, get_limit("SELECT * FROM Table1", 10);
  *
  * 前往: 前往包括一切查询了局的二维数组
  */
function get_limit($sql, $limit)
{
  $this->query($sql);
  $result_array = array();
  for ($i=0; $i<$limit&&$this->next_record(); $i++)
  {
   $result_array[] = $this->Record;
  }
  if (count($result_array) <= 0)
  {
   return 0;
  }
  return $result_array;
}
/**
  * 办法: limit_query($sql, $start=0, $offset=20, $order="")
  * 功效: 为分页的获得SQL履行的指定命量的纪录
  * 参数:
  * $sql  需求履行的SQL,例如: SELECT * FROM Table1
  * $start 纪录的入手下手数, 缺省为0
  * $offset 纪录的偏移量,缺省为20
  * $order 排序体例,缺省为空,例如:ORDER BY id DESC
  * 例如  需求获得从0到10的纪录而且依照ID号倒排, get_limit("SELECT * FROM Table1", 0, 10, "ORDER BY id DESC");
  *
  * 前往: 前往包括一切查询了局的二维数组
  */
function limit_query($sql, $start=0, $offset=20, $order="")
{
  $sql = $sql ." $order  LIMIT $start,$offset";
  $this->query($sql);
  $result = array();
  while($this->next_record())
  {
   $result[] = $this->Record;
  }
  if (count($result) <=0 )
  {
   return 0;
  }
  return $result;
}
/**
  * 办法: count($table,$field="*", $where="")
  * 功效: 统计表中数据总数
  * 参数:
  * $table 需求统计的表名
  * $field 需求统计的字段,默许为*
  * $where 前提语句,缺省为空
  * 例如  依照ID统计一切岁数小于20岁的用户, count("user_table", "id", "user_age < 20")
  *
  * 前往: 前往统计了局的数字
  */
function count($table,$field="*", $where="")
{
  $sql = (empty($where) ? "SELECT COUNT($field) FROM $table" : "SELECT COUNT($field) FROM $table WHERE $where");
  $result = $this->get_one($sql);
  if (!is_array($result))
  {
   return 0;
  }
  return $result[0];
}
/**
  * 办法: insert($table,$dataArray)
  * 功效: 拔出一笔记录到内外
  * 参数:
  * $table  需求拔出的表名
  * $dataArray 需求拔出字段和值的数组,键为字段名,值为字段值,例如:array("user_name"=>"张三", "user_age"=>"20岁");
  * 例如   好比拔出用户张三,岁数为20, insert("users", array("user_name"=>"张三", "user_age"=>"20岁"))
  *
  * 前往: 拔出纪录胜利前往True,掉败前往False
  */
function insert($table,$dataArray)
{
  if (!is_array($dataArray) || count($dataArray)<=0)
  {
   $this->error("Invalid parameter");
  }
  while(list($key,$val) = each($dataArray))
  {
   $field .= "$key,";
   $value .= "'$val',";
  }
  $field = substr($field, 0, -1);
  $value = substr($value, 0, -1);
  $sql = "INSERT INTO $table ($field) VALUES ($value)";
  if (!$this->query($sql))
  {
   return false;
  }
  return true;
}
/**
  * 办法: update($talbe, $dataArray, $where)
  * 功效: 更新一笔记录
  * 参数:
  * $table  需求更新的表名
  * $dataArray 需求更新字段和值的数组,键为字段名,值为字段值,例如:array("user_name"=>"张三", "user_age"=>"20岁");
  * $where  前提语句
  * 例如   好比更新姓名为张三的用户为李四,岁数为21
  *    update("users",  array("user_name"=>"张三", "user_age"=>"20岁"),  "user_name='张三'")
  *
  * 前往: 更新胜利前往True,掉败前往False
  */
function update($talbe, $dataArray, $where)
{
  if (!is_array($dataArray) || count($dataArray)<=0)
  {
   $this->error("Invalid parameter");
  }
  while(list($key,$val) = each($dataArray))
  {
   $value .= "$key = '$val',";
  }
  $value = substr($value, 0, -1);
  $sql = "UPDATE $talbe SET $value WHERE $where";
  if (!$this->query($sql))
  {
   return false;
  }
  return true;
}
/**
  * 办法: delete($table, $where)
  * 功效: 删除一笔记录
  * 参数:
  * $table  需求删除纪录的表名
  * $where  需求删除纪录的前提语句
  * 例如   好比要删除用户名为张三的用户,delete("users",  "user_name='张三'")
  *
  * 前往: 更新胜利前往True,掉败前往False
  */
function delete($table, $where)
{
  if (empty($where))
  {
   $this->error("Invalid parameter");
  }
  $sql = "DELETE FROM $table WHERE $where";
  if (!$this->query($sql))
  {
   return false;
  }
  return true;
}
/**
  * 办法: error($msg="")
  * 功效: 显示毛病信息后中断剧本
  * 参数: $msg 需求显示的毛病信息
  * 前往: 无前往
  */
function error($msg="")
{
  echo "<strong>Error</strong>: $msg\n<br>\n";
  exit();
}
/**
  * 办法:get_insert_id()
  * 功效:获得最初拔出的ID
  * 参数: 无参数
  * 前往:封闭胜利前往ID,掉败前往0
  */
function get_insert_id()
{
  return mysql_insert_id($this->Link_ID);
}
/**
  * 办法:close()
  * 功效:封闭以后数据库毗连
  * 参数: 无参数
  * 前往:封闭胜利前往true,掉败前往false
  */
function close()
{
  return mysql_close($this->Link_ID);
}
}
?>


对于PHP的语法结构,刚开始真的很不习惯,真搞不懂为什么每个变量之前都要加个“$”符号,每个语句写完之后都必须加上“分号”来表示此句已经结束,还有,PHP对字母的大小写是敏感的,写的时候一定要注意大小写的区别。
作者: 小妖女    时间: 2015-2-4 09:45
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者: 小女巫    时间: 2015-2-6 03:01
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者: 飘飘悠悠    时间: 2015-2-15 06:52
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
作者: 柔情似水    时间: 2015-3-4 11:22
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者: 蒙在股里    时间: 2015-3-6 08:38
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者: 再见西城    时间: 2015-3-7 08:09
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
作者: 愤怒的大鸟    时间: 2015-3-11 23:04
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者: 因胸联盟    时间: 2015-3-19 23:02
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者: 变相怪杰    时间: 2015-3-22 18:09
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者: 莫相离    时间: 2015-4-4 22:10
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
作者: 小魔女    时间: 2015-4-5 01:36
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
作者: 分手快乐    时间: 2015-4-16 19:10
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
作者: 爱飞    时间: 2015-6-4 02:33
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
作者: 海妖    时间: 2015-6-6 06:02
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
作者: 金色的骷髅    时间: 2015-6-8 21:57
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者: 活着的死人    时间: 2015-6-10 18:30
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
作者: 简单生活    时间: 2015-6-11 10:34
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者: 若天明    时间: 2015-6-15 19:35
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
作者: 山那边是海    时间: 2015-6-28 20:56
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2