“青花瓷Java版”为北京师范大学教育学部蔡苏作词原创,覆盖教育技术学院专业选修课《面向对象程序设计》教学大纲中的所有知识点。感谢周杰伦作曲,伊格格演唱,崔振锋和洪子叶制作。enjoy it。
————————————————————
青花瓷(Java版)
词:蔡苏
曲:周杰伦
J D K 和J R E 莫要混淆去
环境变量的配置有时让人迷
初学的人莫贪图上来I D E
先用J D K +文本编辑器
面向对象仨特点一定要牢记
封装继承和多态一个不能离
接口为多重继承
抽象类一定要有实例
O b je c t呀 所有类爹地
package在类中只能有唯一
注释命名时要既规范又明晰
就当为好程序员伏笔(这样程序员才是好样滴)
G U I 不是鬼 千万别恐惧
四大布局管理 多练才熟悉
勤能补拙熟能生巧到考试时
你眼带笑意
—————————-
三整两浮一布尔再加字节符
基本数据Byte数了然于心底
碰到异常一定记得try/catch
要打包发布使用jar命令
线程何时被调用全看调度器
睡眠同步和死锁使用要仔细
网页中Applet
独立程序Application
O b je c t呀 所有类爹地
package在类中只能有唯一
注释命名时要既规范又明晰
就当为好程序员伏笔(这样程序员才是好样滴)
G U I 不是鬼 千万别恐惧
四大布局管理 多练才熟悉
勤能补拙熟能生巧到考试时
你眼带笑意
m-0.1.1
m-0.1.2
m-0.1.3
m-0.1.4
m-0.1.5
m-0.1.6
m-0.1.7
0 Makefile概述
什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解 HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完 成大型工程的能力。
因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定 义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个 Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的 效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的 make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质 都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。
在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。
0.1 关于程序的编译和链接
在此,我想多说关于程序编译的一 些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。
编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义 应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是 OBJ文件)。
链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函 数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给 中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。
总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如 果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File.
好,言归正传,GNU的make有许多的内容,闲言少叙,还是让我们开始吧。
1 Makefile 介绍
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的 工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
1.1 Makefile的规则
在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。
target … : [...]
今天,我的生活很简单。我就是伸了伸手掌,测了测我的内存,掂了掂我的CPU使用率。今天,我的思维就钻到计算机里,给绞了。CPU型号和逻辑硬盘都在我的手指边,随手就可以碰触。
今天,我写的博客不针对搜索引擎。不去迎合它的喜好,没有罗列关键词,也没有写一个好的Title。
CPU使用率
计算CPU使用率要借用NtQuerySystemInformation函数。从SystemPerformanceInformation中得到空闲时间;从SystemTimeInformation中得到系统时间;从SystemBasicInformation中得到进程数。CPU使用率的公式就是:CpuUsageInPercent = 100 – (CpuTime[n] – CpuTime[n-1]) / (SystemTime[n] – SystemTime[n-1]) / NumberOfProcessors * 100。这种方法可在Windows NT/2000系统中使用。
另外,还有一种得到CPU使用率的方法。GetSystemTimes函数可以得到idleTime, kernelTime, userTime。由此也可以得到CPU使用率,程序如下:
#define _WIN32_WINNT 0×0501
#include
#include
using namespace std;
__int64 CompareFileTime ( FILETIME time1, FILETIME time2 )
{
__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime ;
__int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime ;
return (b – [...]
SYSTEM_INFO Structure
Contains information about the current computer system. This includes the architecture and type of the processor, the number of processors in the system, the page size, and other such information.
Syntax
C++
typedef struct _SYSTEM_INFO {
union {
DWORD dwOemId;
struct {
WORD wProcessorArchitecture;
WORD wReserved;
} ;
} ;
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD [...]
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#define SystemBasicInformation 0
#define SystemPerformanceInformation 2
#define SystemTimeInformation 3
#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))
typedef struct
{
DWORD dwUnknown1;
ULONG uKeMaximumIncrement;
ULONG [...]
因为不方便使用,改了一下插件Yskin’s Table of Contents Generator。主要是增加了后台面板,提供了一些可供选择的地方。再不一定要按Yskin的方式:在文章右上角输出一个javascript形式的”Table Of Contents”。表格标题也变得可以修改。
插件下载地址如下:toc。
另外为了一些不方便上传插件的朋友,还为模板提供了支持的方式。先下载:toc-for-theme,解压后的php文件放在模板文件夹里,再在functions.php中加上一句:“if( file_exists(TEMPLATEPATH . ‘/toc-for-theme.php’) ) include_once(TEMPLATEPATH . ‘/toc-for-theme.php’);”。这样可以做到最小程度的修改模板文件。
合理的组织文章内容是很有必要的,特别是对于比较长的文章。我觉得TOC还有可以改进的地方要:
1、还可以有更多风格可以选择。例如,可以加进JavaScript。
2、可以有更多标记用,TOC标记做默认标记,用TOC-X可以选择其它风格。
有任何想合作开发的请留言。
几种不同样式的截图:
(PHP 4, PHP 5)发出一个MySQL查询
声明
resource mysql_db_query ( string $database , string $query [, resource $link_identifier ] )
mysql_db_query()选择一个数据库,并在这个数据库上执行一个查询。
参数
database
将要选择的数据库
query
MySQL查询语句
link_identifier
MySQL连接。如果link_identifier没有被指定,最后一个打开的连接将被使用。如果没有找到连接,它将会尝试调用无参数的mysql_connect()建立一个新的连接。如果碰巧没有打到连接也没有建立新的连接,将会产生E_WARNING级别的错误。
返回值
返回一个有效的MySQL结果资源到result变量,或者如果出错则返回FALSE。这个函数同样对INSERT/UPDATE/DELETE查询返回TRUE/FALSE,来表明是否成功或者失败。
变更日志
Version Description
5.3.0 这个函数现在发出E_DEPRECATED注意(notice)。
4.0.6 这个函数被轻视。使用mysql_select_db()和mysql_query()作为替代。
例子
Example #1 mysql_db_query() alternative example
<?php
if (!$link = mysql_connect(‘mysql_host’, ‘mysql_user’, ‘mysql_password’)) {
echo ‘Could not connect to mysql’;
exit;
}
if (!mysql_select_db(‘mysql_dbname’, $link)) {
[...]
(PHP 4, PHP 5)获取数据库名称
声明
string mysql_db_name ( resource $result , int $row [, mixed $field ] )
在mysql_list_dbs()的返回结果中检索数据库名。
参数
result
函数mysql_list_dbs()的返回结果。
row
结果的索引行。从第0行开始。
field
指定字段名,可选参数。
返回值
如果成功,则返回数据库名称;如果失败,则返回False。
例子
Example #1 mysql_db_name() example
<?php error_reporting(E_ALL);
$link = mysql_connect(‘dbhost’, ‘username’, ‘password’);
$db_list = mysql_list_dbs($link);
$i = 0; $cnt = mysql_num_rows($db_list);
while ($i < $cnt) {
echo mysql_db_name($db_list, $i) . “\n”; [...]
(PHP 4, PHP 5)移动内部结果指针
声明
bool mysql_data_seek ( resource $result , int $row_number )
mysql_data_seek()移动result变量所指的MySQL查询结果的内部指针到指定行。紧跟其后的MySQL取结果函数调用,例如mysql_fetch_assoc(),将会返回这一行。
行数从0开始。变量row_number应该是从0到mysql_num_rows() – 1之间的某一值。然而如果result为空(mysql_num_rows() == 0),到第0行的查找将会失败并产生E_WARNING级的警告,mysql_data_seek()将会返回FALSE。
row_number starts at 0. The row_number should be a value in the range from 0 to mysql_num_rows() – 1. However if the result set is empty (mysql_num_rows() == 0), a seek to 0 will fail with a E_WARNING and mysql_data_seek() [...]
由于description己由meta标签给出,首页再来一个description显得有些多余。新近做了一个更改,把饭否同步到了首页网站副标题。我本身有换QQ签名的习惯,这下子可以同步到我的博客上来了。是否独具个性?按照同样的习惯,我把javascript代码贴在下面:
<script type=”text/javascript”>
var element;
function fanfou(userID,DIV) {
element = DIV;
var s = document.createElement(’script’);
s.type = ‘text/javascript’;
s.src = ‘http://api.fanfou.com/statuses/user_timeline.json?id=’+userID+’&count=1&callback=getText’;
document.getElementsByTagName(‘head’)[0].appendChild(s);
}
function getText(jsonSource){
document.getElementById(element).innerHTML = jsonSource[0].text;
}
</script>
使用的时候把这段代码复制到head标签之前,把body标签改一下:<body onload=”fanfou(‘你的饭否账号名’,’你的副标题块的ID’)”>。这句话的作用是在加载页面的时候触发fanfou这个函数,如果你不知道你的副标题块的ID是什么可以看看网页布局入门。但是使用中我发现这样触发还不够快,后面的内容都显示了description来没出来。在body开头加上这样一句:<script type=”text/javascript”>fanfou(‘你的饭否账号名’,’你的副标题块的ID’);</script>。这样效果更强,比用onload事件触发更快的显示出饭否第一条消息。
单纯想使用代码的到此可以stop了。我在试图实现些功能的时候想过利用RSS。最先想用PHP:
<?php
require_once (ABSPATH . WPINC . ‘/rss.php’);
$url = “http://api.fanfou.com/statuses/user_timeline/你的饭否账号名.rss?count=1″;
$resp = _fetch_remote_file( $url );
$rss = _response_to_rss( $resp );
foreach ( (array) $rss->items as $item ) {
$title = attribute_escape(strip_tags($item['title']));
echo str_replace(“周健:”,”",$title);
}
?>
这里面调用了wordpress里面的rss.php文件,使用了其中几个函数。但是不知道yo2的服务器是怎么个结构,用“ABSPATH . WPINC . [...]
很多人使用All In One SEO插件来优化WordPress。这个插件主要的优化手段就是为每个文章和页面添加名为description和keywords的meta标签。其实完全可以不使用插件就做到这一点,只要在header.php中添加少量代码。
自定义域,英文叫Custom Fields,写文章和页面的时候出现在编辑框下方。它有“名称”和对应的“值”两个属性。我们可以在这里添加description和keywords两个值,然后在模板中使用它们。模板代码如下:
<?php
$description = get_post_meta($post->ID, “description”, true);
if($description!=””) echo(“<meta name=\”description\” content=\””.$description.”\” />”);
$keywords = get_post_meta($post->ID, “keywords”, true);
if($keywords!=””) echo(“<meta name=\”keywords\” content=\””.$keywords.”\” />”);
?>
这段代码只有当description和keywords值非空的时候才输出meta,避免了输出空的description或keywords。打开主题编辑器,选择header.php文件,把它添加到<head>标签和</head>之间任意地方即可。
这段代码只在日志和页面中才有意义,当打开主页、存档页等多日志的页面时会输出第一篇文章的description和keywords。可以在其中加一个判断来避免这种情况,修改后的代码如下:
<?php
if(is_single()||is_page()) :
$description = get_post_meta($post->ID, “description”, true);
if($description!=””) echo(“<meta name=\”description\” content=\””.$description.”\” />”);
$keywords = get_post_meta($post->ID, “keywords”, true);
if($keywords!=””) echo(“<meta name=\”keywords\” content=\””.$keywords.”\” />”);
endif;
?>
声明
bool dynamic_sidebar ( [ mixed sidebar ] )
这个函数按顺序调用被激活的小工具里面的工具,输出边栏。如果你注册了多于一个边栏,你应该给出边栏的名字或者序号。如果输出成功则返回TRUE,失败则返回FALSE。
返回值应该用来决定是否显示一个静态的边栏。
如果你的边栏使用数字注册,它们就应该用数字来检索。如果在注册它们的时候使用名字,就使用名字来检索它们。
例子
下面是建议的用法:
<ul id=”sidebar”>if ( !function_exists(‘dynamic_sidebar’) || !dynamic_sidebar() ) : ?>
<li>{static sidebar item 1}</li>
<li>{static sidebar item 2}</li>
</ul>
多个边栏
你可以通过名字或者ID,来加载一个特定的边栏。
例如,dynamic_sidebar(‘top_menu’) 将显示通过register_sidebar(array(‘name’=>’top_menu’,))注册了工具栏。
使用ID更加简单,你不需要为你的工具栏命名。但是如果你不看你的functions.php和小工具面版,你会难以弄明白哪个是哪个。所以这会让你的代码难己阅读。注意,ID从1开始。
相关文章:让wordpress模板支持侧边栏插件Sidebar Widgets的方法
声明
<?php register_sidebars( $number, $args ); ?>
建立多个侧边栏(工具条)。
注册一个或多个侧边栏在当前主题中使用。多数主题只有一个侧边栏。由于以上原因,参数number是可选择的并且默认值是1。
args数组可以包含一系列侧边栏的名字,如果有多于一个的侧边栏。如果没有定义名字,默认使用’Sidebar’。
参数
$number
(int) (必需的) 要建立的侧边栏的数量。
$args
(string/array) (必需的) 建立基于名字和’id’的边栏。
例子
下面这个例子将会建立一个侧边栏,名为Sidebar:
register_sidebars();
下面这个例子将会建立两个侧边栏,名为“Foobar 1″和“Foobar 2″:
register_sidebars(2, array(‘name’=>’Foobar %d’));
变更日志
Since: 2.2.0
源文件
register_sidebars()位于wp-includes/widgets.php。
/**
* Creates multiple sidebars.
*
* If you wanted to quickly create multiple sidebars for a theme or internally.
* This function will allow you to do so. If you don’t pass the ‘name’ and/or
* ‘id’ in $args, then they will be built for [...]
(PHP 4, PHP 5) 建立一个MySQL数据库
声明
bool mysql_create_db ( string $database_name [, resource $link_identifier ] )
mysql_create_db() 尝试在link_identifier所指的服务器上建立一个新数据库。
参数
database_name 所要建立的数据库的名字
link_identifier MySQL连接。如果这个参数没有赋值,会指定最后一个打开的连接。如果没有找到这样一个连接,它将会试图调用无参数的mysql_connect()建立一个连接。如果碰巧没有打到连接也没有成功新建连接,将会产生一个E_WARNING级别的警告。
返回值
如果成功则返回TRUE,如果失败则返回FALSE。
例子
Example #1 mysql_create_db() alternative example
The function mysql_create_db() is deprecated. It is preferable to use mysql_query() to issue a sql CREATE DATABASE statement instead.
<?php
$link = mysql_connect(‘localhost’, ‘mysql_user’, ‘mysql_password’);
if (!$link) {
die(‘Could not connect: ‘ . mysql_error());
}
$sql = ‘CREATE DATABASE my_db’;
if (mysql_query($sql, [...]
(PHP 4, PHP 5) 关闭MySQL连接
声明
bool mysql_close ([ resource $link_identifier ] )
关闭非持久性的MySQL连接。如果link_identifier未赋值,就将要关闭最后一个连接。
并不总是需要使用mysql_close(),一个非持久性的MySQL连接在脚本结束的时候将会自动被关闭。
参数
link_identifier
MySQL连接。如果没有被赋值,由mysql_connect()打开的最后一个连接将会被关闭。如果没有找到这样一个连接,将会调用一次无参数的mysql_connect()。如果碰巧既没有找到这连接也没有成功建立连接,就将会产生一个E_WARNING级的错误。
返回值
正确则返回TRUE;错误则返回FALSE。
例子
Example #1 mysql_close() example
<?php
$link = mysql_connect(‘localhost’, ‘mysql_user’, ‘mysql_password’);
if (!$link) {
die(‘Could not connect: ‘ . mysql_error());
}
echo ‘Connected successfully’;
mysql_close($link);
?>
上面这个例子将会输出:
Connected successfully
注意
mysql_close()不会关闭由mysql_pconnect()打开的连接.
同样请看
mysql_connect() – 打开一个到MySQL服务器的连接
mysql_free_result() – 释放结果
(PHP 4 >= 4.3.0, PHP 5) 返回字符类型
声明
string mysql_client_encoding ([ resource $link_identifier ] )
查询MySQL字符类型。
参数
link_identifier
MySQL连接。如果link_identifier没有被指定,最后一个打开的连接将被使用。如果没有找到连接,它将会尝试调用无参数的mysql_connect()建立一个新的连接。如果碰巧没有打到连接也没有建立新的连接,将会产生E_WARNING级别的错误。
返回值
返回当前连接的默认字符类型名。
例子
Example #1 mysql_client_encoding() example
<?php
$link = mysql_connect(‘localhost’, ‘mysql_user’, ‘mysql_password’);
$charset = mysql_client_encoding($link);
echo “The current character set is: $charset\n”;
?>
上面这个例子将会输出:
The current character set is: latin1
同样请看
* mysql_set_charset() – 设置字符类型
* mysql_real_escape_string() – Escapes special characters in a string for use in a SQL statement
(PHP 3 <= 3.0.13) 改变当前活动连接中登录的用户
声明
int mysql_change_user ( string $user , string $password [, string $database [, resource $link_identifier ]] )
mysql_change_user() 改变当前活动的连接中或者可选参数link_identifier所指连接中,己登录的用户。如果数据库被指定了,它将会是学前补改变的用户正在使用的数据库。如果新用户和密码认证失败,当前连接的用户保持活动。
这个函数由于受到反对,在新版本的PHP中已经不存在了。
* mysql_connect() – 打开一个到MySQL服务器的连接
* mysql_select_db() – 选择一个MySQL数据库
* mysql_query() – 发送一个MySQL查询
在这里整理一些制作WordPress模板过程中常用的函数和代码。函数和代码不按重要程度排序,按模板制作的大体过程排序。
WordPress基本模板文件
主要文件
一般情况下一套完整的WordPress模板都包含以下几个文件:
style.css : CSS(样式表)文件
index.php : 主页模板
archive.php : Archive/Category/Tag模板
404.php : Not Found 错误页模板
comments.php : 留言/回复模板
footer.php : Footer模板
header.php : Header模板
sidebar.php : 侧栏模板
page.php : 内容页(Page)模板
single.php : 内容页(Post)模板
search.php : 搜索结果模板
各模板文件的作用
制作WordPress模板至少需要style.css和index.php两个文件。index.php是一个相当灵活的文件,它可以用来生成header, sidebar, footer, content, categories, archives, search, error和其它页面。我们可以使用更模块化的方式制作模板。我们制作这些文件:
header.php
sidebar.php
footer.php
comments.php
用它们制作页面头、页面尾或者边栏,然后在index.php等文件中调用它们。
虽然可以用index.php生成所有WordPress页面,WordPress还提供了single.php来生成单篇日志,page.php来生成页面,archive.php来生成存档页。另外,还有以下文件也用来生成特定页面:
author.php :作者页面
category.php:分类页面
date.php:日期
search.php:搜索结果
home.php:主页
模板文件常用调用命令
<?php get_header(); ?> : 调用Header模板
<?php get_sidebar(); ?> : 调用Sidebar模板
<?php get_footer(); ?> : 调用Footer模板
<?php comments_template(); ?> : 调用留言/回复模板
<?php include(TEMPLATEPATH . ‘/文件名’); ?> : 嵌入其他文件,可为定制的模板或其他类型文件与模板相关的其他函数
bloginfo()
显示博客相关信息,其数据大部分从管理员面板的个人配置和设置中得来。该函数可以在模板的任何地方使用,一般用来生成head部分。它总是直接向浏览器输出结果,如果你需要在PHP中使用这类值就要使用get_bloginfo()函数。
函数声明
<?php bloginfo(’show’); [...]
(PHP 4, PHP 5)打开一个到MySQL服务器的连接。
声明
resource mysql_connect ([ string $server= ini_get("mysql.default_host") [, string $username= ini_get("mysql.default_user") [, string $password= ini_get("mysql.default_password") [, bool $new_link= false [, int $client_flags= 0 ]]]]] )
打开或者重新使用一个到MySQL服务器连接。
参数
server
MySQL服务器。它也可以包含一个端口号,例如:”hostname:port”;或者给本地服务器提供一个到本地套接字的路径”:/path/to/socket”。
如果指示的mysql.default_host没有被定义,默认值就为’localhost:3306′。在SQL安全模式下,这个参数将被忽略而使用’localhost:3306′。
username
用户名。默认值由mysql.default_user定义。在SQL安全模式下,这个参数将被忽略而使用在使用这个服务器进程的用户。
password
密码。默认值由mysql.default_password定义。在SQL安全模式下,这个参数将被忽略而使用空密码。
new_link
如果使用相同的参数调用mysql_connect()两次,将不会建立新链接,而是用返回已经打开的连接。new_link更改这一行为,使得mysql_connect(),就算之前使用相同的参数调用过,总是打开新的连接。在SQL安全模式下,这个参数将被忽略。
client_flags
client_flags 参数可由以下常数组合而成:128 (使能 LOAD DATA LOCAL 处理), MYSQL_CLIENT_SSL, MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE 或者 MYSQL_CLIENT_INTERACTIVE。阅读预先定义的常数获得更多信息。在SQL安全模式下,这个参数将被忽略。
返回值
成功则返回一个MySQL连接指示器,或者失败就返回FALSE。
更改日志
版本 描述
4.3.0 增加client_flags参数
4.2.0 增加the new_link参数
例子
Example #1 mysql_connect() example
<?php
$link = mysql_connect(‘localhost’, [...]
PHP 4, PHP 5中可用。获得查询结果的行数。
函数声明
int mysql_num_rows ( resource $result )
检索结果中的行数。这和命令只对SELECT或SHOW这类函数返回的查询结果可用。要检索受到插入、更新、替换或删除操作影响的行数,要使用mysql_affected_rows()。
参数
result
要被评估的结果参数。这个参数来自于mysql_query()调用。
返回值
运行成功则返回结果中的行数,运行失败则返回FALSE。
示例
Example #1 mysql_num_rows() example
<?php
$link = mysql_connect(“localhost”, “mysql_user”, “mysql_password”);
mysql_select_db(“database”, $link);
$result = mysql_query(“SELECT * FROM table1″, $link);
$num_rows = mysql_num_rows($result);
echo “$num_rows Rowsn”;
?>
注意
如果你使用mysql_unbuffered_query(),mysql_num_rows()将不会返回正确的值,直到结果所有的行都被检索。
为了向后兼容,下面这个别名可能被使用:mysql_numrows()。
同样请看
* mysql_affected_rows() – Get number of affected rows in previous MySQL operation
* mysql_connect() – 打开一个到MySQL的连接
* mysql_data_seek() – Move internal result pointer
* mysql_select_db() – Select a MySQL database
* mysql_query() – [...]
PHP4、PHP5中可用。获得在之前的MySQL操作中受到影响的行数。
函数声明
int mysql_affected_rows ([ resource $link_identifier ] )
返回相关连接中在最后一次插入、更新、替换或删除时受到影响的行数。
参数
link_identifier
MySQL连接。如果没有指定该参数,将被认为是最后一个被mysql_connect()打开的连接。如果没有被打开的连接将会试图使用无参数的mysql_connect()新建一个。如果碰巧没有找到或者新建立连接,将会产生一个E_WARNNING级别的警告。
返回值
返回在之前的MySQL操作中受到影响的行数;如果最后一次操作失败返回-1。
如果最后一次数据库查询是一次没有指定范围的删除查询,所有的记录都将被删除,但是在4.1.2之前的MySQL版本中该函数将会返回0。
当更新数据时,MySQL不会更新新数据和旧数据一样的栏目。这将产生这样一种可能,那就是mysql_affected_rows()可能不会真的等于所操作的行数,仅等于真正修改过和行数。
替换操作要先删除和关键字相同的记录,然后插入新的记录。这个函数会返回删除的记录个数加上插入的记录个数。
示例
Example #1 mysql_affected_rows() example
<?php
$link = mysql_connect(‘localhost’, ‘mysql_user’, ‘mysql_password’);
if (!$link) {
die(‘Could not connect: ‘ . mysql_error());
}
mysql_select_db(‘mydb’);
/* this should return the correct numbers of deleted records */
mysql_query(‘DELETE FROM mytable WHERE id < 10′);
printf(“Records deleted: %dn”, mysql_affected_rows());
/* with a where clause that is never true, it should return 0 */
mysql_query(‘DELETE FROM mytable [...]
大多数MySQL函数把连接信息做为最后一个参数。如果不提供该参数,就使用最后一个打开的连接。如果没有和数据库建立任何连接,将会试图使用php.ini中默认的参数。如果操作失败,函数将会返回FALSE。
mysql_affected_rows — 获得在之前的MySQL操作中受到影响的行数
mysql_change_user — 改变当前连接中登陆的用户
mysql_client_encoding — 返回字符类型
mysql_close — 关闭MySQL连接
mysql_connect — 打开一个到MySQL服务器的连接
mysql_create_db — 建立一个MySQL数据库
mysql_data_seek — Move internal result pointer
mysql_db_name — Get result data
mysql_db_query — 发送一个MySQL查询
mysql_drop_db — 删除一个MySQL数据库
mysql_errno — Returns the numerical value of the error message from previous MySQL operation
mysql_error — Returns the text of the error message from previous MySQL operation
mysql_escape_string — Escapes a string [...]
用户输入一个文本名,编程实现输出文本中最长的一行。如果最长的不止一行,请全部输出。
程序如下:
#include<stdio.h>
int main(int a, char * arg[])
{
char file_name[31];
FILE * file;
long lines[20]; /* store the offset */
unsigned int length = 0; /* length of the line */
unsigned int num = 0; /* number of lines */
char buf[200];
char c;
unsigned int n = 0;
/* Get the file name, and print the name to the screen. */
if( a == 2 ){
strcpy(file_name,arg[1]);
}
else{
printf(“\nPlease enter a [...]
编程的首要原则是什么
学习一项知识,必须问自己三个重要问题:1. 它的本质是什么。2. 它的第一原则是什么。3. 它的知识结构是怎样的。
KISS – Keep It Simple Stupid
DRY – Don’t Repeat Yourself
写代码时时刻设想你就是将来要来维护这坨代码的人。
写API时时刻设想你就是要去使用这坨API的人。
先弄清你的问题是什么!
永远不要假定你已经了解一切了!
不作没有证据的推论。
如果方案在你脑子里面或者纸上不能工作,写成代码还是不能工作。
越懒越好。
过早优化是一切罪恶的根源。
不要重新发明轮子。
测试通过前说什么“它可以工作”都是纯扯淡。
了解你的工具。
一切以用户需求为导向。
利用分治、抽象,解开子问题之间的耦合。
咖啡进,代码出。(Coffee in, Code out)
WIN32汇编中如何实现隐藏任务栏
Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller [...]
汇编语言中段的完整定义
形式:
name SEGMENT [align] [READONLY] [combine] [use] ['class']
参数意义:
1、READONLY 只读属性,如果该段设置了只读属性,该段的数据只能读,一般用来存放常数,不过在实际使用中,基本没有人设置这个属性。
2、对齐 这里的对齐是指段的起始地址对齐的方式,可选值为(BYTE, WORD, DWORD, PARA, PAGE)
BYTE —- 下一个字节地址 1
WORD —- 下一个字地址 2
DWORD —- 下一个双字地址 4
PARA —- 下一个节地址 16
PAGE —- 下一个页地址 128 或 256
3、组合类型(combine) 组合操作影响链接器(link.exe)工作,组合类型如下(组合类型多使用在多模块场合,例如你有2个以上的asm文件,每个文件中都有段的设置,组合类型指示链接器如何将这些段重新组合,例如A.asm和B.asm中都有Data数据段,在链接这两个asm编译后的obj文件时,将这两个段组合成一个段还是分为两个段):
PRIVATE PRIVATE属性指示链接器将每个段独立存放,即使它们拥有有万全相同的段名。
PUBLIC PUBLIC属性指示链接器将所有的同名段连接成一个连续的完整的段。一个程序模块可以由若干段组成,段名可以各不相同,也可以重复,汇编程序将一个程序中的同名段处理成一个段。段的定义还可以嵌套,但不能交叉。
STACK STACK属性指示链接器将同名的堆栈段连接成一个完整的堆栈段。
COMMON COMMON属性指示链接器将所有的同名段重叠,即它们的起始地址相同,长度为其中最大长度的那个段。由于段覆盖,所以,前一同名段中的初始化数据被后续段的初始数据覆盖掉。 MEMORY MEMORY和PUBLIC同义。
AT address AT属性不能使用在保护模式,address告诉链接器生成段的段地址。AT address所指示的段中不能包含有任何代码和初始化数据,通过结构或变量或矢量指出远程内存中的位置,便于用户在代码中远程访问或调用位于这些内存中的数据或代码。
4、use use属性指出段的长度。使用类型只有对使用.386及以上处理器选择伪指令的段才起作用。它包括如下两种类型。
USE16指明该段为16位段,段的长度最大为64KB,地址的形式是16位段地址和16位偏移地址,寻址方式为16位寻址方式;USE32指明该段为32位段,段的长度最大为4GB,地址的形式是16位段地址和32位偏移地址,寻址方式为32位寻址方式。
如果该段未使用“使用类型”,而又使用.386及以上处理器选择伪指令,则汇编程序默认该段为32位段。
在实方式和虚拟8086方式中段的大小只能为64KB,因此,运行.386以上处理器选择指令的汇编源程序必须使用USE16。只有在保护方式下才使用32位段。
5、class class属性指示链接程序按何种规则对段进行排序。缺省为.SEG:
.SEG .SEG属性指示链接器段地址按照用户在代码中给出的顺序排序。
.ALPHA .ALPHA属性指示链接器段地址按字母顺序排序。
.DOSSEG .DOSSEG属性指示链接器按照MS-DOS的惯例排序。两个模块中的调用不能使用.DOSSEG属性。
.DOSSEG 指示链接器按下面方式排序:
1.代码段
2.数据段按如下顺序:
a.不是BSS或STACK属性的数据段
[...]
#include “stdio.h”
#define max 80
#define Error 0
#define Ok 1
typedef int ElemType;
typedef struct
{
ElemType elem[max];
int last;
}SeqList;
SeqList *NewSeq()
{
SeqList *L;
L=(SeqList *)malloc(sizeof(SeqList));
L->last=0;
return L;
}
int AddSeq(SeqList *L,int i,ElemType e)
{
int k;
if(L->last>=max)
{
printf(“The List is full!\n”);
return(Error);
}
i–;
if(i>L->last)
{
printf(“Error Add Point!\n”);
return(Error);
}
for(k=L->last;k>=i;k–)
L->elem[k]=L->elem[k-1];
L->elem[i]=e;
L->last++;
return(Ok);
}
int MovSeq(SeqList *L,int i)
{
if(L->last==0)
{
printf(“The List is empty!\n”);
return(Error);
}
i–;
if(i>=L->last)
{printf(“Error Mov Point!\n”);
return(Error);
}
for(;i<=L->last-1;i++)
L->elem[i]=L->elem[i+1];
L->last–;
return(Ok);
}
int PtSeq(SeqList *L)
{
int i;
if(L->last==0)
{
printf(“The List is Empty!\n”);
return(Error);
}
for(i=0;i<L->last;i++)
printf(“%d “,L->elem[i]);
return(Ok);
}
main()
{
int i;
int o=1;
ElemType e;
char c;
SeqList *L;
L=NewSeq();
do
{printf(“\n********************************************************************************”);
printf(“\nPlease press your key to choose [...]