使用DBI的方法:
---------------------------------------------------------------------
use DBI;
---------------------------------------------------------------------
注意:特定的DBD 级的模块不需要包括use 行,因为在与服务器进行连接时, DBI 负责激活相应的模块,比如DBD::mysql。
一、一些变量表达的常用意思
$drh表示驱动程序对象的句柄
$dbh表示针对一个数据库对象的句柄
$sth表示针对一个语句或者一个查询对象的句柄
$fh表示一个打开文件的句柄
$h表示一个通用的句柄,其含意有赖于上下文
$rc表示操作代码返回的布什值(真或假)
$rv表示操作代码返回的整数值
$rows表示操作代码返回的行数值
$str表示操作代码返回的字符串
@ary表示查询返回的一行值的数组(列表)
@row_ary表示从查询中返回的一个行的数组
二、关于DBI的一些驱动对象方法:
查询子类函数:DBI->available_drivers
比如:---------------------------------------------------------------
foreach(DBI->available_drivers){print;}
---------------------------------------------------------------------
结果:DBI::mysql
数据源函数:DBI->data_sources
比如:---------------------------------------------------------------
foreach(DBI->data_sources){print;}
---------------------------------------------------------------------
结果:对于大多数正确的驱动子类来说,返回值一般为空,对于不能连接、用户名或密码为空的驱动子类,返回值不为空
数据库方法调用:DBI -> install_driver
比如:
---------------------------------------------------------------------
my $drh = DBI -> install_driver("mysql");
---------------------------------------------------------------------
结果:提供驱动子类的句柄,可以使用$drh -> func ("createdb", $db_name, $db_host, $username, $password, "admin");来创建数据库
数据库连接:DBI -> connect
比如:---------------------------------------------------------------
my $dsn = "dbi:mysql:database=${db_name};hostname=${db_host};mysql_socket=${db_sock};port=${db_port};mysql_compression=1;mysql_read_default_file=$ENV{HOME}/.my.cnf;mysql_read_default_group=client";
my %attr = ( PrintError => 0, RaiseError => 0);
my $dbh = DBI -> connect ($dsn, $user_name, $password, [,\%attr]);
---------------------------------------------------------------------结果:返回值是针对一个数据库的句柄,提供数据库连接功能,关闭连接使用$dbh -> disconnect,其中很多参数可以省略,包括数据库名称。
三、数据库句柄方法的调用
1,do方法:
my $rows = $dbh -> do ($query[, \%attr[, @bind_values]]);
语法解释:准备并运行$query表示的查询。返回值为受影响的行数—如果不知道行数,则返回-1,如果出现错误,则返回undef。
如果受影响的行数为0,则返回值为字符串“0E0”,作为数值它与0等价,但在判断时它为真。
一般用于非SELECT查询,不检索行的语句,如DELETE、INSERT、REPLACE或UPDATE,主要使用do()。
如果对SELECT语句使用它,则不会获得返回的语句句柄,也不能提取任何行。
当语句包括占位符(在此查询字符串内部由‘?’字母表示)时,使用@bind_values。
@bind_values为给占位符赋值的值的列表。它必须和占位符有一样多的值。如果只指定赋值
的值,但没有指定属性,则将undef作为\%attr参数的值来传递。
与prepare和execute结合使用的功能基本相同。
2,ping方法:
my $rc = $dbh -> ping ();
语法解释:检查与服务器的连接是否仍然有效,并相应返回真或假。
3,prepare方法:
my $sth = $dbh -> prepare ($query[, \%attr]);
语法解释:为以后的执行所准备的由$query表示的查询,并返回一个语句句柄。返回的句柄可用于execute(),以便执行该查询。
4,quote方法:
my $str = $dbh -> quote ($value[, $data_type]);
语法解释:处理字符串以实现SQL语句中特定字符的引用和转义,以便在执行这条语句时,该字符串不引起语法错误。
例如,“‘I \’m happy’”(没有双引号)返回字符串“I ’m happy”。
如果$value为undef,则它返回字符串“NULL”(没有引号)。
一般来说,$data_type参数不是必需的,因为MySQL将查询中指定为字符串的值自动地转换为其他类型。
可以将$data_type指定为特殊类型值的提示————例如,DBI::SQL_INTEGER指出$value表示一个整数。
不要使用具有打算利用占位符插入到查询中的值的quote()。DBI会自动引用这样的值。
5,selectall_arrayref方法
my $ary_ref = $dbh -> selectall_arrayref ($query[, \%attr[, @bind_values]]);
语法解释:执行由$query指定的查询,并结合prepare()、execute()和fetchall_arrayref()返回结果。如果出现错误,则返回undef。
如果$query参数是以前准备的语句,则省略prepare()步骤。
@bind_values参数和do()方法中的该参数具有同样的意义。
比如:
---------------------------------------------------------------------
# fetch all rows into a reference to an array of references
my $matrix_ref = $dbh -> selectall_arrayref ($query);
# determine dimensions of matrix
my $rows = (!defined ($matrix_ref) ? 0 : scalar (@{$matrix_ref}));
my $cols = ($rows == 0 ? 0 : scalar (@{$matrix_ref->[0]}));
for (my $i = 0; $i < $rows; $i ++) # print each row
{
my $delim = "";
for (my $j = 0; $j < $cols; $j ++)
{
$matrix_ref -> [$i][$j] = "" if !defined ($matrix_ref -> [$i][$j]); # NULL?
print $delim . $matrix_ref -> [$i][$j];
$delim = ",";
}
print "\n";
}
---------------------------------------------------------------------
6,selectcol_arrayref方法
my @ary_ref = $dbh -> selectcol_arrayref ($query[, \%attr[, @bind_values]]);
语法解释:执行由$query指定的查询,并通过组合prepare()和execute()返回结果的第一列。返回结果作为对含有每行第一列的数组的引用。如果出现错误,则返回undef。
如果$query参数是以前准备的语句,则省略prepare()步骤。
@bind_values参数和do()方法中的该参数具有同样的意义。
7,selectrow_array方法
my @row_ary = $dbh -> selectrow_array ($query[, \%attr[, @bind_values]]);
语法解释:执行由$query指定的查询,并结合prepare()、execute()和fetchall_arrayref()返回结果的第一行。
如果参数$query是以前准备的语句,则省略prepare()步骤。
如果在列表的上下文中调用时,selectrow_array()返回代表行值的数组,或者,如果出现错误,则返回空数组。在标量的上下文 中,selectrow_array()返回这个数组的第一个元素的值(行的第一列)。如果出现错误,则返回undef。
@bind_values参数和do()方法中的相应参数具有同样的意义。
四、语句句柄方法的调用
1,bind_col方法
my $rc = $sth -> bind_col($col_num, \$var_to_bind);
将SELECT查询的给定列与Perl变量相联系,将它作为引用传递。$col_num的范围为1到查询选择的列数。每次提取行时,这个变量用列值自动更新。
bind_col()应该在execute()之前及prepare()之后调用。
如果列号范围不在1到查询选择的列数之间,则bind_col()返回假。
2,bind_columns方法
my $rc = $sth -> bind_columns (\$var_to_bind1, \$var_to_bind2, ...);
将一系列变量与由准备好的SELECT 语句返回的列相联系,请参阅bind_col()方法的说明。
如果引用的数量与查询选择的列数不匹配,则bind_columns() 返回假。
3,bind_param方法
my $rv = $sth -> bind_param ($n, $value[, \%attr]);
my $rv = $sth -> bind_param ($n, $value[, $bind_type]);
在一个语句中,将值与占位符‘?’相联系。应该在execute()之前及prepare()之后调用它。
$n指定了占位符的数量,应该限定$value值,而且该值范围应该为1到占位符的数量。为了限定NULL值,可传递undef。
参数\%attr或者$bind_type可作为要联系的值的类型提示。
4,dump_results方法
my $rows = $sth -> dump_results ([$maxlen[, $line_sep[, $field_sep[, $fh]]]]);
从语句句柄$sth 中提取所有的行,通过调用实用函数DBI::neat_list()将他们格式化,并将他们打印到给定的文件句柄中。返回提取的行数
$maxlen、$line_sep、$field_sep和$fh的缺省值分别为35、“\n”、“,”和STDOUT。
5,execute方法:
my $rows = $sth -> execute ([@bind_values]);
执行准备好的语句。如果该语句执行成功,则返回真,如果发生错误,则返回undef。
参数@bind_values与do()方法中的有相同的意义。
6,fetchall_arrayref方法:
my $tbl_ary_ref = $sth -> fetchall_arrayref ([$slice_array_ref]);
从语句句柄$sth 中提取所有行,并返回数组的引用,这个数组包含提取的每行的一个引用。数组中每个引用的意义取决于所传递的参数。没有参数或者只有数组部分引用参数, 则$tbl_ary_ref 的每个元素都是包括结果集的一行值的数组引用。对于散列部分的引用参数,$tbl_ary_ref 的每个元素就是对包含结果集的一行值的散列引用。
7,fetchrow_array方法:
my @ary_ref = $sth -> fetchrow_array ();
当在一个列表的范围中调用时,fetchrow_array()返回包含结果集下一行列值的数组,如果不再有行或者发生错误,则 fetchrow_array()返回一个空数组。在标量上下文中,fetchrow_array()返回数组第一个元素的值(那就是说,行的第一列), 如果不再有行或者发生错误,则fetchrow_array()返回undef。
通过检查$sth->err(),可以将结果集正常结束与出现错误区分开来。零值表明已经无错误地到达了结果集的末尾。
一般与while使用。
比如:
---------------------------------------------------------------------
while (my @ary = $sth -> fetchrow_array ())
{
@ary = map { defined ($_) ? $_ : "NULL" } @ary;
print join (",", @ary) . "\n";
}
---------------------------------------------------------------------
8,fetch或fetchrow_arrayref方法
my @ary_ref = $sth -> fetchrow_arrayref ();
返回一个包括结果集的下一行列值的数组引用。如果不再有行或者发生错误,则返回undef。
通过检查$sth->err(),可以将结果集正常结束与出现错误区分开来。零值表明已经无错误地到达了结果集的末尾。
一般与while使用。
比如:
-----------------------------------------------------------------------------------
my @matrix = (); # array of array references
while (my @ary = $sth -> fetchrow_array ()) # fetch each row
{
push (@matrix, [ @ary ]); # save reference to just-fetched row
}
# determine dimensions of matrix
my $rows = scalar (@matrix);
my $cols = ($rows == 0 ? 0 : scalar (@{$matrix[0]}));
for (my $i = 0; $i < $rows; $i++) # print each row
{
my $delim = "";
for (my $j = 0; $j < $cols; $j++)
{
$matrix[$i][$j] = "" if !defined ($matrix[$i][$j]); # NULL value?
print $delim . $matrix[$i][$j];
$delim = ",";
}
print "\n";
}
---------------------------------------------------------------------
9,fetchrow_hashref方法
my $hash_ref = $sth -> fetchrow_hashref ([$name]);
返回包括结果集的下一行列值的散列引用。如果不再有行或者发生错误,则返回undef。散列是索引值是列名称,散列的元素是列值。
对于散列的关键值,指定变量$name说明使用的语句句柄属性。缺省值为“NAME”。这可能导致查询中的列名称不区分大小写的问题,但是散列键是区分大 小写的。要强迫散列键为大写字母或者小写字母,可以指定“NAME_lc”或“NAME_uc”的$name值。
通过检查$sth->err(),可以将结果集正常结束与出现错误区分开来。零值表明已经无错误地到达了结果集的末尾。
一般与while使用。
比如:
---------------------------------------------------------------------
while (my $hash_ref = $sth -> fetchrow_hashref ())
{
my $delim = "";
foreach my $key (keys (%{$hash_ref}))
{
$hash_ref -> {$key} = "" if !defined ($hash_ref->{$key}); # NULL value?
print $delim . $hash_ref -> {$key};
$delim = ",";
}
print "\n";
}
---------------------------------------------------------------------
10,finish方法
my $rc = $sth -> finish();
释放有关语句句柄的任何资源。通常不必显式地调用这个方法,但是如果只提取部分结果集,则调用finish()使DBI了解已经提取了数据。调用 finish()可能使语句属性无效,最好在调用execute()之后立即访问它们。
11,rows方法
my $rv = $sth -> rows();
返回与$sth相关的语句所作用的行数,如果发生错误,则返回-1。使用这个方法主要用于不返回行的语句。对于SELECT语句,不能依赖rows()方法在提取行时统计行数。
五、通用句柄方法
下面的方法不是专用于特定类型的句柄的。可用驱动程序、数据库或语句句柄来调用它们。
1,$h -> err()
返回最近调用的驱动程序操作的数字错误代码。0表示没有错误。
2,$h -> errstr()
返回最近调用的驱动程序操作的字符串错误消息。空字符串表示没有错误。
3,DBI -> trace($trace_level[, $trace_filename]);
$h -> trace($trace_level[, $trace_filename]);
设置跟踪级别。跟踪提供有关DBI操作的信息。跟踪级别的范围从0(关闭)到9(最多信息)。通过作为DBI类方法或独立的句柄调用跟踪,跟踪可以启用脚本内部的所有DBI操作:
DBI->trace(2);打开脚本跟踪
$sth->trace(2);打开句柄跟踪
通过设置DBI_TRACE环境变量,也可以对运行的所有DBI脚本在全局级别启用跟踪。缺省时,跟踪输出到STDERR.。提供的$filename参 数可以直接将结果输出到不同的文件。将输出添加到这个文件的任何已有内容后面。
每个跟踪调用导致来自所有跟踪的句柄中的输出进入相同的文件。如果文件已命名,则所有跟踪就输出到那个文件。如果没有命名的文件,则所有跟踪输出到STDERR。
4,DBI -> trace_msg($str[, $min_level])
$h -> trace_msg($str[, $min_level])
如果跟踪这个句柄或如果在DBI级启用跟踪,则编写这个跟踪输出的消息。如果启用DBI级的跟踪,则trace_msg()可以作为 DBI->trace_msg()来调用,编写消息。只有在跟踪级别至少为这个级别时,才可以提供$min_level 参数来指定应该编写的消息。
六、MySQL 的特定管理方法
DBI 作为直接访问驱动程序的手段所供的func() 函数方法
---------------------------------------------------------------------
$rc = $drh -> func("createdb", $dbname, [host, user, password,], 'admin');
$rc = $drh -> func("dropdb", $dbname, [host, user, password,], 'admin');
$rc = $drh -> func("shutdown", [host, user, password,], 'admin');
$rc = $drh -> func("reload", [host, user, password,], 'admin');
---------------------------------------------------------------------
or
---------------------------------------------------------------------
$rc = $dbh -> func("createdb", $dbname, 'admin');
$rc = $dbh -> func("dropdb", $dbname, 'admin');
$rc = $dbh -> func("shutdown", 'admin');
$rc = $dbh -> func("reload", 'admin');
---------------------------------------------------------------------通过驱 动程序句柄或通过数据库句柄访问func()方法。驱动程序句柄与打开的连接无关,所以,如果以这种方式访问func(),则必须提供允许这个方法创建连 接的主机名称、用户名称和口令的参数。如果用数据库句柄访问func(),则不需要那些参数。如果需要,可以像下面这样获得驱动程序句柄:
my $drh = DBI -> install_driver(“mysql”);#(“mysql”mustbelowercase)
createdb创建由$db_name指定的数据库。要这样做,必须对该数据库拥有CREAT权限。
dropdb删除由$db_name指定的数据库。要这样做,必须对该数据库拥有DROP权限。当心,如果删除了一个数据库,则它将会消失,且再也不能恢复。
shutdown关闭服务器。必须具有SHUTDOWN权限。
reload告诉服务器重新加载授权表。如果直接使用DELETE、INSERT或UPDATE而不是使用GRANT或REVOKE来修改这个授权表的内容,则这是必需的。要使用reload,必须具有RELOAD权限。

七、DBI 环境变量
DBI考虑了几个环境变量,如表G-3所示。除了DBI_TRACE之外,所有变量都由connect()方法使用。DBI_TRACE由trace()方法使用。
DBI_DRIVER:DBI级的驱动程序名(MySQL的“mysql”)
DBI_DSN:数据源名
DBI_PASS:口令
DBI_TRACE:跟踪级别和/或跟踪输出文件
DBI_USER:用户名称
---------------------------------------------------------------------$errno = $dbh->{'mysql_errno'};
$error = $dbh->{'mysql_error};
$info = $dbh->{'mysql_hostinfo'};
$info = $dbh->{'mysql_info'};
$insertid = $dbh->{'mysql_insertid'};
$info = $dbh->{'mysql_protoinfo'};
$info = $dbh->{'mysql_serverinfo'};
$info = $dbh->{'mysql_stat'};
$threadId = $dbh->{'mysql_thread_id'};
---------------------------------------------------------------------

八、一个例子
---------------------------------------------------------------------

  1. #!/usr/bin/perl -w
  2. use CGI::Carp "fatalsToBrowser";
  3. use strict;
  4. use warnings;
  5. use DBI;
  6. use CGI qw (:standard escapeHTML escape);
  7. my ($driver_name, $db_name, $db_host, $db_sock, $db_port, $db_user, $db_pswd, $dsn);
  8. $driver_name = 'mysql';
  9. $db_name = 'mydata';
  10. $db_host = 'localhost';
  11. $db_sock = '/tmp/mysql.sock';
  12. $db_port = '3306';
  13. $db_user = 'cnangel';
  14. $db_pswd = 'cnangel';
  15. $dsn = "dbi:mysql:database=${db_name};hostname=${db_host};mysql_socket=${db_sock};port=${db_port}";
  16. # ... set up connection to database (not shown) ...
  17. my $dbh = DBI -> connect ($dsn, $db_user, $db_pswd,
  18. { RaiseError => 1, PrintError => 0 });
  19. # put out initial part of page
  20. my $title = "$db_name Database Browser";
  21. print header ();
  22. print start_html (-title => $title, -bgcolor => "white");
  23. print h1 ($title);
  24. # parameters to look for in URL
  25. my $tbl_name = param ("tbl_name");
  26. my $sort_col = param ("sort_col");
  27. # If $tbl_name has no value, display a clickable list of tables.
  28. # Otherwise, display contents of the given table. $sort_col, if
  29. # set, indicates which column to sort by.
  30. !defined ($tbl_name) ? display_table_names ($dbh, $db_name) : display_table_contents ($dbh, $tbl_name, $sort_col);
  31. print end_html ();
  32. sub display_table_names
  33. {
  34. my ($dbh, $db_name) = @_;
  35. print p ("Select a table by clicking on its name:");
  36. # retrieve reference to single-column array of table names
  37. my $ary_ref = $dbh -> selectcol_arrayref (qq{ SHOW TABLES FROM $db_name });
  38. # Construct a bullet list using the ul() (unordered list) and
  39. # li() (list item) functions. Each item is a hyperlink that
  40. # re-invokes the script to display a particular table.
  41. my @item;
  42. foreach my $tbl_name (@{$ary_ref})
  43. {
  44. my $url = sprintf ("%s?tbl_name=%s", url (), escape ($tbl_name));
  45. my $link = a ({-href => $url}, escapeHTML ($tbl_name));
  46. push (@item, li ($link));
  47. }
  48. print ul (@item);
  49. }
  50. sub display_table_contents
  51. {
  52. my ($dbh, $tbl_name, $sort_col) = @_;
  53. my @rows;
  54. my @cells;
  55. # if sort column not specified, use first column
  56. $sort_col = "1" if !defined ($sort_col);
  57. # present a link that returns user to table list page
  58. print p (a ({-href => url ()}, "Show Table List"));
  59. print p (strong ("Contents of $tbl_name table:"));
  60. my $sth = $dbh -> prepare (qq{
  61. SELECT * FROM $tbl_name ORDER BY $sort_col
  62. LIMIT 200
  63. });
  64. $sth -> execute ();
  65. # Use the names of the columns in the database table as the
  66. # headings in an HTML table. Make each name a hyperlink that
  67. # causes the script to be reinvoked to redisplay the table,
  68. # sorted by the named column.
  69. foreach my $col_name (@{$sth -> {NAME}})
  70. {
  71. my $url = sprintf ("%s?tbl_name=%s;sort_col=%s",
  72. url (),
  73. escape ($tbl_name),
  74. escape ($col_name));
  75. my $link = a ({-href => $url}, escapeHTML ($col_name));
  76. push (@cells, th ($link));
  77. }
  78. push (@rows, Tr (@cells));
  79. # display table rows
  80. while (my @ary = $sth -> fetchrow_array ())
  81. {
  82. @cells = ();
  83. foreach my $val (@ary)
  84. {
  85. # display value if non-empty, else display non-breaking space
  86. if (defined ($val) && $val ne "")
  87. {
  88. $val = escapeHTML ($val);
  89. }
  90. else
  91. {
  92. $val = " ";
  93. }
  94. push (@cells, td ($val));
  95. }
  96. push (@rows, Tr (@cells));
  97. }
  98. # display table with a border
  99. print table ({-border => "1"}, @rows);
  100. }
1, AutoCommit — 是否自动提交
一般来说自动提交不利于应用程序的性能.
$dbh->{AutoCommit} = 1;
print “AutoCommit: $dbh->{AutoCommit}\n”;
2, ChopBlanks — 取舍CHAR类型后面的空格
当你从数据库中取CHAR类型的值时, 你可以指定要不要带后面的空格, 在数据库中CHAR是定长的, 长足不足时, 后面以空格补充, 但你在写应用程序时, 可能并不想要后面的空格, 这时你可以将这个选项设为1.
$dbh->{ChopBlanks} = 1;
print “ChopBlanks: $dbh->{ChopBlanks}\n”;
3, LongTruncOK — 是否允许载断返回值
如果返回值(如Long或LOB类型)的值大于缓冲区的长度, 有两个选项, 一种是报错, 另一种是只取缓冲区的长度的值, 丢弃后面的值. 设为True, 则不报错而只取一部份值, 设为False则报错.
$dbh->{LongTruncOk} = 1;
print “LongTruncOk: $dbh->{LongTruncOk}\n”;
4, LongReadLen — 指定Long或LOB缓冲的最长大度
在数据库中, Long或LOB类型可以存放2GB或更多的值, 在Perl应用程序去取这些值时, 必须要指定一个最大的缓冲区大小, 和LongTruncOk配合, 可以取出一定长度的值.
$dbh->{LongReadLen} = 1048576;
print “LongReadLen: $dbh->{LongReadLen}\n”;
### We're not expecting binary data of more than 512 KB...$dbh->{LongReadLen} = 512 * 1024;### Select the raw media data from the database$sth = $dbh->prepare( "            SELECT mega.name, med.media_data            FROM megaliths mega, media med            WHERE mega.id = med.megaliths_id       " );$sth->execute();while ( ($name, $data) = $sth->fetchrow_array ) {    ...}
Without the all-important setting of LongReadLen, the fetchrow_array() call would likely fail when fetching the first row, because the default value for LongReadLen is very small -- typically 80 or less.

转载于:https://blog.51cto.com/ylive/506168

perl DBI使用详解相关推荐

  1. 强大的Perl正则表达式实例详解

    一.介绍 正则表达式各语言都有自己的规范,但是基本都差不多,都是由元字符的组合来进行匹配:由于Nmap内嵌的服务与版本探测是使用的Perl正则规范,因此此篇博客记录一下Perl正则的相关内容,方便后期 ...

  2. Perl 数组应用详解(push, pop, shift, unshift)

    Perl的数组操作有四大常用函数: push:从数组的末尾加入元素. pop :从数组的末尾取出元素 shift: 从数组的开头取出元素 unshift:从数组的开头加入元素 1.push #!/us ...

  3. wazuh agent功能详解

    wazhu之agent功能详解 一.日志数据收集 日志数据收集是从服务器或设备生成的记录中收集的实时过程.此组件可以通过文本文件或Windows事件日志接收日志.它还可以通过远程syslog直接接收日 ...

  4. [转]HTTP协议详解

    当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了We ...

  5. 【OpenCV 4开发详解】保存和读取XML和YMAL文件

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  6. Web 服务器-Apache详解

    文章目录 一.讲在 Apache 之前 二.Apache 详解 2.1 概述 2.2 工作模式 修改方式: 2.3 相关文件保存位置 2.4 配置文件详解 2.5 Apache 实验 2.5.1 Ap ...

  7. Linux操作系统的进程管理详解

    Linux操作系统的进程管理详解 pkill & pgrep pkill & pgrep 是两个很方便的命令.省去了要先ps auwx | grep xxxx然后再根据pid kill ...

  8. HTTP协议详解 转自小坦克

    HTTP协议详解 转自小坦克 -- 有些文章是引用别人的,为了方便我以后或不再备注;引用目的是因为直接网摘里面的地址经常被重置,找不到原来的文章 当今web程序的开发技术真是百家争鸣,ASP.NET, ...

  9. HTTP协议详解【转】

    当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了We ...

最新文章

  1. 数据库系统概念—学习笔记1
  2. 命令提示符中的几个重要的命令
  3. GDB调试时,出现value optimized out的解决办法小结
  4. php日志数据统计,PHP统计Nginx日志的User Agent数据
  5. android picasso 圆形,Andorid开发之Picasso通过URL获取用户头像的圆形显示
  6. my first d3d application 哈哈哈。
  7. java集合框架的选用 若是数据量很大,0421测试题
  8. 计算机硬盘 安装,电脑新硬盘如何安装系统
  9. HDMI接口定义,传输流程
  10. 笔记本电脑频繁自动重启_笔记本电脑经常自动重启怎么办
  11. linux 服务 ddns,Linux DDNS配置
  12. Day 4.Social Data Sentiment Analysis: Detection of Adolescent Depression Signals
  13. iOS系统录屏如何增加雷达波纹效果(从一个点向周围扩散)的简单实现
  14. SolidWorks宏工具介绍——初识宏工具
  15. C++病毒-----------混乱鼠标
  16. php数据group去重,MongoDB_Mongodb聚合函数count、distinct、group如何实现数据聚合操作, 上篇文章给大家介绍了Mong - phpStudy...
  17. 美国名校为何青睐爱吃泡面的考生
  18. PHPMailer远程命令执行漏洞复现
  19. C语言视频教程-谭浩强版-小甲鱼主讲—P13
  20. 送书 | 《商品期货量化交易实战》

热门文章

  1. Python 微信机器人
  2. 看了很多人的面试经验,我也来一段:这段时间的几个面试
  3. UDS(十)应用层 34/36/37
  4. 基于SpringBoot的在线心理咨询管理系统
  5. 未能从程序集“**\Microsoft.Build.Tasks.v12.0.dll”加载任务工厂“CodeTaskFactor”
  6. c语言中alloc作用,C语言内存分配 :malloc()函数与alloc()函数
  7. D3.js 01绘制BarChart
  8. 每天一个漏洞之——shiro反序列化
  9. PLC上网神器,智能硬件,超级盒子
  10. TCP粘包和半包问题及解决