PHP中ADODB类详解


Posted in PHP onMarch 25, 2008

 虽然 PHP 是建构 Web 系统强有力的工具,但是 PHP 存取数据库的功能,一直未能标准化,每一种数据库,都使用另一种不同且不兼容的应用程序接口(API)。为了填补这个缺憾,因此才有 ADODB 的出现。一旦存取数据库的接口予以标准化,就能隐藏各种数据库的差异,若欲转换至其它不同的数据库,将变得十分容易。 

目前 ADODB 支持的数据库种类非常地多,例如:MySQL, PostgreSQL, Interbase, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, Sybase, DB2 以及一般的 ODBC (其中 PostgreSQL、Informix、Sybase 的driver 是由自由软件社群发展之后贡献出来的)。 

使用 ADODB 最大的优点之一是:不管后端数据库如何,存取数据库的方式都是一致的,开发设计人员不必为了某一套数据库,而必须再学习另一套不同的存取方法,这大大减轻开发人员的知识负担,过去的知识往后仍可继续使用,转移数据库平台时,程序代码也不必做太大的更动。 

其实 ADODB 这样的发展理念,并不是首创的,DBI 比 ADODB 出现得更早,它提供 Perl 存取数据库时,使用一致的 API 呼叫接口。相信用过 Perl + DBI 的朋友,再来用 ADODB 时,会有一种似曾相识的感觉。 

另外,ADODB 对用过 ASP 的人而言,应该不陌生,这类朋友对 ADODB 应该很容易接受。 

我们来看一下,ADODB 的简单用法: 

<?php 

// 引入 adodb 的 inc 档,才能呼叫 adodb 提供的函式 

include('adodb/adodb.inc.php'); 

// 选择连接的数据库种类,以建立联机对象, 

// 一旦对象建立,即可使用其成员函式来处理数据库。 

// 以下 $conn 即此一物件(object) 

$conn = &ADONewConnection('mysql'); 

// 要不要显示侦错讯息,false 不要,true 要。 

// $conn->debug = false; 

$conn->debug = true; 

// 连接数据库 

// 用法:$conn->Connect('主机', '使用者', '密码', '数据库'); 

// 用例: 

$conn->Connect('localhost', 'piza', 'ooo123', 'test'); 

// 若欲采用持续性连接,上式可换用 PConnect: 

// $conn->PConnect('localhost', 'piza', 'ooo123', 'test'); 

// 设定 sql 命令 

$sql = "insert into t values ('abcde', 18)"; 

// 执行 sql 命令 

$rs = $conn->Execute($sql); 

// 检查执行结果,若 $rs == false,则呼叫 $conn 对象的成员函式 ErrorMsg() 

if (!$rs) print $conn->ErrorMsg(); else print "OK!"; 

?> 

结果如下: 

--------------------------------------------- 

(mysql): insert into t values ("abcde",18) 

--------------------------------------------- 

OK! 

若把侦错关掉,即 $conn->debug=false,则结果如下: 

OK! 

以下,逐步为各位介绍:使用 ADODB 的重点方法。 

2. 安装 
ADODB 的首页在:http://php.weblogs.com/ADOdb,目前(2002/10/24)最新版是:2.42 版,可至 ADODB 下载或至台南县教网中心 FTP 下载。 

安装 ADODB 的方法超极简单,只要下载、解压、放入适当位置,即可完成 ! 如下所示: 

1. 下载: 

$ ncftp ftp.tnc.edu.tw 

cd sysop/ADODB 

get adodb242.tgz 

2. 解压: 

假设我把 adodb242.tgz 放入 /var/www/html 中 

$ cp adodb242.tgz /var/www/html 

$ tar xvzf adodb242.tgz 

如下所示: 

adodb/adodb-cryptsession.php 

adodb/adodb-csvlib.inc.php 

adodb/adodb-errorhandler.inc.php 

adodb/adodb-errorpear.inc.php 

adodb/adodb-lib.inc.php 

adodb/adodb-pager.inc.php 

....以下省略.... 

现在,您在 /var/www/html/adodb 已安装好 ADODB 了。 

3. 引入 ADODB 
一旦安装好 ADODB,使用前,应把 ADODB 相关的含入文件引入您的程序中。adodb 目录放在任何位置无所谓,只要能指向正确路径文件名即可。一般而言,您的程序代码只须引入 adodb.inc.php。 

作法如下: 

在您的 PHP 程序中: 

include('路径/adodb/adodb.inc.php'); 

或 

include_once('路径/adodb/adodb.inc.php'); 

例: 

若您的程序和 adodb 在同一目录下: 

.. 

adodb/ 

something.php* 

则: 

include('adodb/adodb.inc.php'); 

即可。 

若位置是在某一个目录 somedir 中: 

.. 

adodb 

somedir/something.php 

则必须使用: 

include('../adodb/adodb.inc.php'); 

除了 adodb.inc.php 这个含入档,ADODB 还提供许多 adodb-*.inc.php 的含入档,这些多半是为驱动某些数据库的特殊用法而设的。 

若是引入 adodb-session.php 则可让您将 session 存入数据库中来维护运用。 

若是引入 adodb-pager.inc.php,可方便您做分页显示。 

若是引入 adodb-errorhandler.inc.php,可让您自订错误处理讯息。 

若是含入 adodb-pear.inc.php,可让您使用 PHP4 的 PEAR DB 语法来使用 ADODB。此时,尚可使用 DSN 连接数据库的字符串设定。如 $dsn="mysql://piza:ooo123@localhost/test"; 

若是引入 tohtml.inc.php,可帮您在程序代码中,方便将取出的记录,转成 HTML 的表格(table)来显示。 

若是引入 toexport.inc.php,可让您方便地输出 CSV 档或以 tab 分隔字段的数据文件。 

若是引入 rsfilter.inc.php,可让您在使用记录之前,预做过滤处理。 

若是引入 pivottable.inc.php,可让您使用 pivot table 功能(俗称 cross-tabulations)。 

注意 ! adodb.inc.php 是一定要引入的,其它,则视您要使用那一个功能,再引入该含入档即可。 

4. 选用数据库种类,建立联机对象 
由于 ADODB 使用对象导向的作法,因此您在引入档之后,接着请视您后端数据库的种类,建立一个联机对象。作法如下: 

以 MySQL 数据库为例: 

$conn = &ADONewConnection('mysql'); 

注:NewADOConnection 和 ADONewConnection 是一样的,二者皆可使用。 

上例中的 'mysql' 是指数据库的 drvier 的种类,ADODB 会据此呼叫对应的数据库 driver。 

其它常用的 driver 有:access、ado、ado_access、ado_mssql、db2、vfp、ibase、borland_ibase、informix、imformix72、mssql、oci8、odbc、postgres、postgres64、postgres7、sqlanywhere、sybase....等等。 

我们称建立的对象 $conn 为一 ADOConnection 对象,它代表与数据库的连接事务,皆透过这个对象来处理。ADOConnection 对象会提供许多处理的方法,以对象导向的说法,这些方法称为成员函式,这是外界存取此一对象的接口。 

一旦联机对象建立之后,就有许多对象函式可供您使唤啦 ! 请看下一节的介绍。 

5. 侦错模式 
程序开发的过程,为了方便查出出现问题可能的地方,通常我们会打开侦错模式,俟程序功能确实稳定之后,再将它关闭。ADODB 提供侦错模式,存取数据库时,能显示其运作方式。 

打开侦错模式,使用法: 

$conn->debug=true 

关闭侦错模式,使用法: 

$conn->debug=false 

6. 连接数据库 
接着,使用 $conn 联机对象的 Connect 或 PConnect 函式来连接特定的数据库,此时必须提供 DSN (Data Source Names)相关数据,DSN 可能包括:主机名称、数据库使用者、数据库密码、数据库名称。不同的数据库种类,DSN 可能可以省略其中若干项。以 MySQL 而言,则上述四者都要提供。 

该函式会传回 true 或 false,用以表示是否连接成功。 

用例: 

// 格式:$conn->Connect('主机', '使用者', '密码', '数据库'); 

$conn->Connect('localhost', 'piza', 'ooo123', 'test'); 

或者,采持续性连接: 

// 格式:$conn->PConnect('主机', '使用者', '密码', '数据库'); 

$conn->PConnect('localhost', 'piza', 'ooo123', 'test'); 

若欲探查是否有联机成功,可用一个变量来接取传回值: 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

$cok = $conn->Connect($mch, $user, $pwd, $database); 

或者,采持续性连接: 

$cok = $conn->PConnect($mch, $user, $pwd, $database); 

if (!$cok) { echo "无法连接数据库 $database"; exit; } 

7. 设定 sql 命令语法、执行 sql 命令 
接下来,您就可以设计您要执行的 sql 命令语法,然后付诸执行。 

$sql = "这里放 SQL 的命令语法"; 

$rs = $conn->Execute($sql); 

其中,$rs 为回传的结果,若 $rs == false,则表示执行失败,您必须仔细检查一下。 

您不一定要把命令语法放在 $sql 变量中,也可以直接放入 Execute( ) 括号中。若命令较短无妨,若命令较长,我建议您还是用一个变量 $sql 来设定命令字符串吧 ! 

下一节开始,为各位介绍 SQL 的基本命令,如:Insert、Select、Update、Delete 等等的用法。 

8. 插入记录(Insert) 
Insert 的用法如下: 

// $name 为字符串,$year 为数字 

$name='abcde'; 

$year=18; 

// 插入一笔记录,命令的大小写无妨,但数据表 t 及变量则大小写有分别 ! 

$sql = "INSERT INTO t VALUES ('$name', $year)"; 

// $sql = "insert into t values ('$name', $year)"; 亦可。 

// 执行 

$rs = $conn->Execute($sql); 

// 检查执行结果,进行错误处理;若正常,则继续其它动作.... 

if (!$rs) print $conn->ErrorMsg(); 

....以下省略.... 

ErrorMsg() 是错误显示的函式,它会取出错误讯息,并显示出来。 

另外,ADODB 提供一种 记录集(RecordSet) 函式 GetInsertSQL(),可帮您产生 Insert 的语法。 

例子如下: 

<?php 

// 引入 ADODB 

include('adodb/adodb.inc.php'); 

// 建立联机对象 

$conn = &ADONewConnection('mysql'); 

// 侦错 

$conn->debug=true; 

// DSN 四项基本数据设定 

$mch="localhost"; 

$user="root"; 

$pwd="jack168"; 

$database="test"; 

// 连接至数据库 test 

$conn->PConnect($mch, $user, $pwd, $database); 

// 产生一笔空记录 

$sql = "select * from t where year=-1"; 

$rs = $conn->Execute($sql); 

// 用一个空数组来装要更新的数据 

$r = array(); 

$r['name']='john'; 

$r['year']=28; 

// 用 GetInsertSQL 函式来制作一个完整的 sql 命令,此 sql 命令放在 $insertSQL 中 

$insertSQL = $conn->GetInsertSQL($rs, $r); 

// 执行插入 

$conn->Execute($insertSQL); 

$conn->Close(); 

?> 

侦错讯息如下: 

----------------------------------------------------------- 

(mysql): select * from t where year=-1 

----------------------------------------------------------- 

(mysql): INSERT INTO t ( name, year ) VALUES ( 'john', 28 ) 

----------------------------------------------------------- 

9. 取出记录(Select) 
Select 的用法如下: 

<?php 

// 引入 ADODB 

include('adodb/adodb.inc.php'); 

// 建立联机对象 

$conn = &ADONewConnection('mysql'); 

// 不侦错 

$conn->debug=false; 

// DSN 四项基本数据设定 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

// 连接至数据库 test 

$conn->PConnect($mch, $user, $pwd, $database); 

// 执行 Select 由表格 t 取出数据, 

// 它会传回一个 ADORecordSet 记录集对象 $rs (RecordSet) 

// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录(row 或称 record), 

// 该记录的所有字段数据的内容,存放在 fields 这个数组之中 

// ,以数字为索引,第一个由 0 开始 

$rs = &$conn->Execute('select * from t'); 

// 若 $rs 为 false,则秀出错误讯息 

if (!$rs) { 

print $conn->ErrorMsg(); 

} else { 

// 当尚未到达 记录集 $rs 的结束位置(EOF:End Of File)时,(即:还有记录尚未取出时) 

while (!$rs->EOF) { 

// 秀出所有字段,$FieldCount() 会传回字段总数 

for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) { 

print $rs->fields[$i] . " "; 

// 移至下一笔记录 

$rs->MoveNext(); 

// 换列 

echo "<br>\n"; 

$rs->Close(); // 可不用 

$conn->Close(); // 可不用 

?> 

$rs->fields[] 数组是由 PHP 的数据库扩展功能产生的,某些扩展功能并不支持使用字段名称当作索引。 

若欲使用名称当作索引,也就是俗称的 hash 或 associative arrays,则需使用全域变量 $ADODB_FETCH_MODE 加以指定。 

以下设定:使用数字索引 $ADODB_FETCH_MODE= ADODB_FETCH_NUM; 

以下设定:使用名称索引 $ADODB_FETCH_MODE= ADODB_FETCH_ASSOC; 

下面是使用名称索引的例子: 

<?php 

// 引入 ADODB 

include('adodb/adodb.inc.php'); 

// 建立联机对象 

$conn = &ADONewConnection('mysql'); 

// 不侦错 

$conn->debug=false; 

// DSN 四项基本数据设定 

$mch="localhost"; 

$user="root"; 

$pwd="jack168"; 

$database="test"; 

// 连接至数据库 test 

$conn->PConnect($mch, $user, $pwd, $database); 

// 执行 sql 之前,指定使用名称索引 

$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; 

// 执行 Select,它会传回一个 ADORecordSet 记录集对象 $rs 

// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录内容, 

// 该记录存放在 fields 这个数组之中 

$rs = &$conn->Execute('select * from t'); 

// 若 $rs 为 false,则秀出错误讯息 

if (!$rs) { 

print $conn->ErrorMsg(); 

} else { 

// 当尚未到达记录集结束位置(EOF)时, 

while (!$rs->EOF) { 

// 秀出所有字段 

print $rs->fields['name'] . " " . $rs->fields['year']; 

// 移至下一笔记录 

$rs->MoveNext(); 

// 换列 

echo "<br>\n"; 

$rs->Close(); // 可不用 

$conn->Close(); // 可不用 

?> 

10. 取出记录(使用 FetchRow) 
这里示范 FetchRow 的用法: 

$sql = "select * from t"; 

$rs = $conn->Execute($sql); 

if ($rs) { 

while( $ar = $rs->FetchRow() ) { 

print $ar['name'] ." " . $ar['year']; 

print "<br>\n"; 

FetchRow() 会将取出的记录传回,您可用一个 array 来接取。 

注意 ! 使用 FetchRow() 就不必再用 MoveNext(),FetchRow 内部会自动完成移至下一笔记录的动作。 

11. 更新记录(Update) 
您可以用传统的方式: 

$sql ="UPDATE t SET name='john', year=28 WHERE year=18"; 

$conn->Execute($sql); 

也可以用以下这种方式: 

<?php 

// 引入 ADODB 

include('adodb/adodb.inc.php'); 

// 建立联机对象 

$conn = &ADONewConnection('mysql'); 

// 侦错 

$conn->debug=true; 

// DSN 四项基本数据设定 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

// 连接至数据库 test 

$conn->PConnect($mch, $user, $pwd, $database); 

// 选择要更新的那一笔记录 

$sql = "select * from t where year=18"; 

$rs = $conn->Execute($sql); 

// 用一个空数组来装要更新的数据 

$r = array(); 

$r['name']='john'; 

$r['year']=28; 

// 用 GetUpdateSQL 函式来制作一个完整的 sql 命令,此 sql 命令放在 $updateSQL 中 

$updateSQL = $conn->GetUpdateSQL($rs, $r); 

// 执行更新 

$conn->Execute($updateSQL); 

$conn->Close(); 

?> 

侦错讯息如下: 

------------------------------------------------------------- 

(mysql): select * from t where year=18 

------------------------------------------------------------- 

(mysql): UPDATE t SET name = 'john', year = 28 WHERE year=18 

------------------------------------------------------------- 

12. 删除记录(Delete) 
删除记录很简单,采传统方式即可: $sql = "DELETE FROM t WHERE year=18"; 

$rs = $conn->Execute($sql); 

13. 使用字段对象(Field Objects) 
这里示范字段对象 FetchField 的用法,用以取得字段名称及字段型态: 

$sql = "select * from t"; 

$rs = &$conn->Execute($sql); 

if ($rs) { 

while (!$rs->EOF) { 

// 取出第二个字段 

$f = $rs->FetchField(1); 

// 印出字段名称 及 字段型态 

print $f->name . ":" . $f->type; 

$rs->MoveNext(); 

print "<br>\n"; 

另外,ADODB 提供一个 RecordSet 函式 MetaType(),可将原始的字段型态转成一般型态代码: 

C : 字符 

X : text 

B : blob 

D : 日期 

T : timestamp 

L : 布尔值或位 

I : 整数 

N : 数字型态,包括:自动增加、数值、浮点数、实数及整数 

R : serial、自动增加 

用例: 

$f = $rs->FetchField(1); 

// 印出字段名称 及 字段型态的代码 

print $f->name . ":" . $rs->MetaType($f->type); 

14. 简单分页(Pager) 
ADODB 提供一种简单分页显示记录的方法,使用前,要将 adodb-pager.inc.php 引入。 

<?php 

include('adodb/adodb.inc.php'); 

// 引入分页功能 

include('adodb/adodb-pager.inc.php'); 

// 启动 session 

session_start(); 

$db = ADONewConnection('mysql'); 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

$db->Connect($mch, $user, $pwd, $database); 

$sql = "select * from t"; 

// 产生 pager 对象 

$pager = new ADODB_Pager($db, $sql); 

// 每一页秀 5 笔记录 

$pager->Render($rows_per_page=5); 

?> 

结果如下: 

Figure 1. 简单分页功能 

每页显示记录的数目是由 Render() 来控制的,若没有传入指定的 row 数给 Render(),默认值每页秀 10 笔。 

另外,字段名称也可以改变,如下示范: 

<?php 

include('adodb/adodb.inc.php'); 

// 引入分页功能 

include('adodb/adodb-pager.inc.php'); 

// 启动 session 

session_start(); 

$db = ADONewConnection('mysql'); 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

$db->Connect($mch, $user, $pwd, $database); 

$sql = "select name as '姓名', year as '年纪' from t"; 

// 产生 pager 对象 

$pager = new ADODB_Pager($db, $sql); 

// 每一页秀 5 笔记录 

$pager->Render($rows_per_page=5); 

?> 

结果如下: 

Figure 2. 改变字段名称 

15. 输出 CSV 档 
ADODB 提供输出 CSV 档的方法,使用前,要将 toexport.inc.php 引入。 

<?php 

include('adodb/adodb.inc.php'); 

// 引入输出 CSV 文件功能 

include('adodb/toexport.inc.php'); 

$db = ADONewConnection('mysql'); 

$mch="localhost"; 

$user="piza"; 

$pwd="ooo123"; 

$database="test"; 

$db->Connect($mch, $user, $pwd, $database); 

$sql = "select name as '姓名', year as '年纪' from t"; 

$rs = $db->Execute($sql); 

// 秀出 CSV 格式 

print rs2csv($rs); 

?> 

结果如下: 

姓名,年纪 

abcde,45 

yyy,20 

ppp,34 

mmm,13 

hhh,41 

rrr,65 

kkk,29 

miso,154 

sss,89 

abc,18 

abcde,0 

uyt,58 

john,28 

也可用 tab 分隔字段,使用 rs2tab 方法如下: 

print rs2tab($rs, false); 

注: false 表示不显示字段名称 

结果如下: 

abcde 45 

yyy 20 

ppp 34 

mmm 13 

hhh 41 

rrr 65 

kkk 29 

miso 154 

sss 89 

abc 18 

abcde 0 

uyt 58 

john 28 

若是 print rs2tab($rs, true); 

结果如下: 

姓名 年纪 

abcde 45 

yyy 20 

ppp 34 

mmm 13 

hhh 41 

rrr 65 

kkk 29 

miso 154 

sss 89 

abc 18 

abcde 0 

uyt 58 

john 28 

也可以将结果由标准输出(STDOUT)显示,使用 rs2tabout 方法如下: 

print rs2tabout($rs); 

执行结果如下: 

Figure 1. 在console中显示结果 

也可以存成 CSV 档: 

// 档案路径 

$path = "/tmp/test.csv"; 

// 开档供写入 

$fhd = fopen($path, "w"); 

// 若开档成功 

if ($fhd) { 

// 则写入 CSV 

rs2csvfile($rs, $fhd); 

// 也可以使用 rs2tabfile($rs, $fhd); 

// 关档 

fclose($fhd); 

结果如下: 

[ols3@p web]$ cat /tmp/test.csv 

姓名,年纪 

abcde,45 

yyy,20 

ppp,34 

mmm,13 

hhh,41 

rrr,65 

kkk,29 

miso,154 

sss,89 

abc,18 

abcde,0 

uyt,58 

john,28 

16. 取出一定笔数的记录 (使用 SelectLimit) 
ADODB 提供一个 ADOConnect 函式 SelectLimit,可供您取出一定笔数的记录,用法如下: 

$conn->Connect($mch, $user, $pwd, $database); 

rs = $conn->SelectLimit("Select * from t", 3, 1); 

// 取出 3 笔、在第 1 笔之后 

// 秀出这 3 笔记录 

if ($rs) { 

while( $ar = $rs->FetchRow() ) { 

print $ar['name'] ." " . $ar['year']; 

print "<br>\n"; 

上式是说:在第 1 笔记录之后,取出 3 笔,也就是第 2、3、4 笔记录。 

结果如下: 
-------------------------------------- 

(mysql): select * from t LIMIT 1,3 

-------------------------------------- 

注意 ! SelectLimit 的写法刚好和 MySQL 语法相反 !

PHP 相关文章推荐
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
php的ajax框架xajax入门与试用介绍
Dec 19 PHP
redis 队列操作的例子(php)
Apr 12 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
析构函数与php的垃圾回收机制详解
Oct 28 PHP
php字符串截取函数用法分析
Nov 25 PHP
ThinkPHP控制器详解
Jul 27 PHP
Symfony生成二维码的方法
Feb 04 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
Laravel 创建指定表 migrate的例子
Oct 09 PHP
php下判断数组中是否存在相同的值array_unique
Mar 25 #PHP
php获取mysql版本的几种方法小结
Mar 25 #PHP
非常不错的MySQL优化的8条经验
Mar 24 #PHP
php不用正则采集速度探究总结
Mar 24 #PHP
php木马攻击防御之道
Mar 24 #PHP
php入门小知识
Mar 24 #PHP
PHP 实例化类的一点摘记
Mar 23 #PHP
You might like
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
php mysql 封装类实例代码
2016/09/18 PHP
Yii 框架入口脚本示例分析
2020/05/19 PHP
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
vue跨域解决方法
2017/10/15 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
Python输出带颜色的字符串实例
2017/10/10 Python
简述:我为什么选择Python而不是Matlab和R语言
2017/11/14 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
django-初始配置(纯手写)详解
2019/07/30 Python
python Opencv计算图像相似度过程解析
2019/12/03 Python
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
nohup的用法
2012/11/26 面试题
轻化专业学生实习自我鉴定
2013/09/20 职场文书
医学毕业生自荐信
2013/10/11 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
python 使用pandas读取csv文件的方法
2022/12/24 Python