学通PHP的24堂课


学习方法

1.边学边做.
熟悉html/css/javascript等网页基本元素.
2.选择一个PHP集成环境.
http://www.appservnetwork.com/
3.常握MySQL数据的连接,查询,添加,修改,删除等操作.
4.熟悉PHP常用函数,理解OOP,MySQL优化,以及模板Smarty.
5.掌握PHP编码规范.
5.两册一书.
PHP中文手册和MYSQL手册和基础出书籍一本.

集成环境

1.XAMPP包含MYSQL,PHP,PERL,APACHE.
www.apachefriends.org
2.AppServ包含Apache,PHP,MySQL,phpMyAdmin.
www.appservnetwork.com
集成安装,省去手动设置的麻烦.

Apache的配置

etc/httpd/conf:
access.conf:配置服务器的访问权限,控制不同用户和计算机的访问限制.
httpd.conf:设置服务器启动的基本环境.
srm.conf:主要用于文件资源上的设定.
#注意:
每次修改完php配置都要重新Apache服务器
php.ini是PHP的配置文件,用于加载各种函数库,设置错误级别和设置服务器时间.
#修改80端口在apache的conf/httpd.conf下修改:
Listen 80

时间显示

echo date("Y-m-d H:i:s"); //显示默认的UTC时间
date_default_timezone_set(""); //设置系统的时区

PHP标记书写规范

1.XML标记风格
<?php
?>
2.脚本标记风格
<script language="php">
</script>
3.简短标记风格
<? ?>
#php.ini设置short_open_tag为On
4.ASP标记风格
<% %>
#php.ini设置asp_tags为On

PHP注释风格

// :C++注释风格
/**/ :C注释风格
# :Shell注释风格

PHP常量

1.使用define()函数声明常量
define(string constant_name, mixed value, case_sensitive=true)
constant_name:常量名称即标志符
value:常量值
case_sensitive:是否大小写敏感,TRUE表示不敏感
2.使用constant()函数获取常量的值
mixed constant(string const_name)
3.使用defined()函数判断常量是否已经被定义
bool defined(string constant_name);
返回TRUE为已经定义

PHP预定义常量

__FILE__:默认常量,PHP程序文件名
__LINE__:默认常量,PHP程序行数
PHP_VERSION:内建常量,PHP程序的版本
PHP_OS:内建常量,执行PHP解析器的操作系统名称
E_ERROR:该常量指到最近的错误处
E_WARNING:该常量指到最近的警告处
E_PARSE:该常量指解析语法有潜在问题处
E_NOTICR:该常量为发生不寻常,但不一定是错误处

PHP变量

1.变量的声明和定义
$变量名称=变量的值
#变量命名规则:
*在PHP中的变量名是区分大小写的.
*变量名必须是以美元符$开始的
*变量名必须符合标志符定义
2.变量的作用域
PHP中的变量作用域,全局变量与其他的语言有所差别:
全局变量就是被定义在所有函数以外的变量,其作用域是整个PHP文件,
但是在用户自定义函数内部是不可用的.想在用户自定义函数内部使用
全局变量,要使用global关键词进行声明.
*静态变量:
主要用于函数中函数调用结束后,但保留值有效.
3.可变变量
即用两个美元符表示的变量,优先级右运算,则右边第一个美元符把变量
解析成变量名,即变量名可以变.
这样在PHP中,变量可以存值,存地址,存变量名,可变变量要尽可能的规范使用,
不然个人感觉会造成阅读上的不清晰.

PHP的数据类型

1.标题数据类型
boolean:布尔型
string:字符串型
float:浮点型
2.复合数据类型
array:数组
#定义数组的语法格式:
    $array[key]="value";
    或
    $array(key1=>value1,key2=>value2...)
*其中参数key是数组元素的索引,value是数组元素的值.
object:对象
3.特殊数据类型
resource:资源
null:空值(不区分大小写)

PHP中数据类型转换

1.类C风格
在变量前面加上一个小括号,并把目标数据类型写在小括号中即可.
2.强制转换
settype($int, "integer"); // 强制转换,boolean,integer,float,string,array,object,null
3.获得变量数据类型
gettype($int);

PHP中检测数据类型的函数

is_bool:是否为布尔类型
is_string:是否为字符串
is_float/is_double:是否为浮点数
is_integer/is_int:是否为整数
is_null:是否为空
is_array:是否为数组
is_object:是否为一个对象
is_number:是否为数字或由数字组成的字符串

PHP的运算符

1.算术运算符
+:加法运算符
-:减法运算符
*:乘法运算符
/:除法运算符
%:取余运算符
2.字符串运算符
在PHP中字符串运算符只有一个,就是"."
.:字符串连接符,类似于python的"+"
3.赋值运算符和复合运算符
=:赋值(优先级最低)
+=,-+,*=,/=,.=,%=:复合运算符
4.位运算符
&:按位与
|:按位或
^:按位异或
~:按位取反
<<:向左移位
>>:向右移位
5.自增自减运算符
++:自增运算符
--:自减运算符
*在前为先自加/减后返值,在后为先返值后自加/减
6.逻辑运算符
&&/and:逻辑与
||/or:逻辑或
xor:逻辑异或
!:逻辑非
7.比较运算符
===:恒等,当值相等,数据类型相同时
!==:非恒等,值不相等,数据类型不想同时
8.三目运算符
表达式1?表达式2:表达式3;
*如果表达式1为真则执行表达式2,否则执行表达式3

PHP函数

函数分为系统内部函数和用户自定义函数两种.

定义和调用函数

1.定义
function fun_name($str1, $str2=1)
{
    fun_body;
}
2.调用
fun_name("fun");

函数间的参数传递

1.按值传递方式
function fun1($m)
{
    $m = $m * 10;
}
$m = 1;
fun1($m);
echo "按值传递不改变其值".$m;
2.按引用传递方式
function func1(&$m)
{
    $m = $m * 10;
}
$m = 1;
func1($m);
echo "按引用传递会改变其值".$m;

变量函数

function func1()
{ echo "Hello World!"; }
$var_func1 = "func1";
$var_func1();
#变量函数与可变变量差不多,用变量存在函数名在编译代码的时候替换.

对函数的引用

function &example($tmp=0)
{ return $tmp; }
$str = &example("python丝酷网");
echo $str;

PHP变量函数库

PHP变量函数库是内置函数的一种,常用的变量函数库.
empty:检查一个变量是否为空,为空则返回TRUE;
gettype:获取变量的类型
intval:获取变量的整数值
is_array:检查变量是否为数组类型
is_int:检查变量是否为整数
is_numeric:检查变量是否为数字或数字字符串
isset:检查变量是否被赋值
print_r:打印变量数组
settype:设置变量的类型
unset:释放变量
var_dump:打印变量的相关信息

PHP字符串函数库

addcslashes:实现转义字符串中的字符,在指定的字符前面加上反斜线
explode:将字符串依指定的字符串或字符separator切开
echo:用来输出字符串
ltrim:删除字符串开头的连续空白
md5:计算字符串的md5哈希
strlen:获取指定字符串的长度
str_ireplace:将某个指定的字符串都替换为另一个指定的字符串(大小写不敏感)
str_repeat:将指定的字符串重复输出
str_replace:取代所有在字符串中出现的字符串
strchr:获取指定字符串(A)在另一个字符串(B)中首次出现的位置
stristr:获取指定字符串(A)在另一个字符串(B)中首次出现的位置到(B)字符串末尾的所有字符串
strstr:获取一个指定字符串在另一个字符串中首次出现的位置到后者末尾的子字符串
substr_replace:将字符串中的部分字符串替换为指定的字符串
substr:从指定的字符串str中按照指定的位置start截取一定长度length的字符
implode:函数把数组元素组合为一个字符串。
#实例:
$tmp = "c:/temp";
$tmp = strstr($tmp, "/");
echo str_replace("/", " ", $tmp);
$tmp = explode("/", $tmp);
echo $tmp[1];

常用的日期和时间函数

checkdate:验证日期的有效性
date:格式化一个本地时间/日期
microtime:返回当前UNIX时间戳和微妙数
mktime:获取一个日期的UNIX时间戳
strftime:根据区域设置格式化本地时间/日期
strtotime:将任何英文文本的日期时间描述解析为UNIX时间戳
time:返回当前的UNIX时间戳
#实例:
echo date("M-d-Y H:i:s", mktime());
echo date("M-d-Y H:i:s");

常用的PHP数学函数

ceil:返回不小于参数value值的最小整数,如果有小数部分则进一位
mt_rand:返回随机数中的一个值
mt_srand:配置随机数的种子
rand:产生一个随机数,返回随机数的值
round:实现对浮点数进行四舍五入
floor:实现舍去法取整,该函数返回不大于参数value值的下一个整数,将value值的小数部分舍去取整
fmod:返回除法的浮点数余数
getrandmax:获取随机数最大的可能值
max:返回参数中的最大值
min:返回参数中的最小值
#实例:
$x=5;
$y=1.5;
$z=fmod($x,$y);
echo $z; // $z==0.5

PHP文件系统函数库

basename:返回文件路径中基本的文件名
copy:将某文件由当前目录复制到其他目录,如果成功则返回TRUE,否则返回FALSE
file_exists:判断指定的目录或文件是否存在.如果存在则返回TRUE,否则返回FALSE
file_put_contents:将字符串写入到指定的文件中
file:读取某文件的内容,并将结果保存到数组中,数组内每个元素的内容对应读取文件的一行
filetype:返回文件的类型,可能的值有fifo,char,dir,block,link,file和unknow
fopen:打开某文件,并返回该文件的标识指针.该文件可以是本地的,也可以是远程的
fread:从文件指针所指文件中读取指定长度的数据
is_dir:如果该函数参数所代表的路径为目录并且该目录存在,则返回TRUE,否则返回FALSE
is_uploaded_file:判断文件是否应用HTTP POST方式上传的,如果是则返回TRUE,否则返回FALSE
mkdir:新建一个目录
mode_uploaded_file:应用POST方法上传文件
readfile:读入一个文件,并将读入的内容写入到输出缓冲
rmdir:删除指定的目录,如果删除成功则返回TRUE,否则返回FALSE
unlink:用于删除文件,如果删除成功则返回TRUE,否则返回FALSE
#实例1:
echo mkdir("pythonschool");
ob_flush();
flush();
sleep(5);
if(file_exists("pythonschool"))
    rmdir("pythonschool");
#实例2:
if( ($fp = fopen("test.txt", "r")) == false )
{
    echo "Open file error!";
    exit(0);
}
else
{
    while(!feof($fp))
    {
        $tmp = fgets($fp, 1024);
        echo $tmp;
    }
}

MySQL函数库

mysql_close:关闭MySQL连接
mysql_connect:打开一个到MySQL服务器的连接
mysql_create_db:新建一个MySQL数据库
mysql_error:返回上一个MySQL操作产生的文本错误信息
mysql_fetch_array:从结果集中获取一行作为关联数组,或数字数组,或两者兼有
mysql_fetch_assoc:从结果集中获取一行作为关联数组
mysql_fetch_field:从结果集中获取列信息并作为对象返回
mysql_fetch_object:从结果集中获取一行作为对象
mysql_fetch_row:从结果集中获取一行作为枚举数组
mysql_num_rows:获取结果集中行的数目
mysql_query:发送一条MySQL查询
mysql_select_db:选择MySQL数据库

PHP流程控制语句

1.if条件控制语句:
if(expr)
    statement;
if(){}
if(){}else{}
if(){}elseif{}else{}
2.switch条件控制语句:
switch(expr)
{
    case expr1:
        statement1;
        break;
    case expr2:
        statement2;
        break;
    default:
        statementN;
        break;
}
3.while循环语句
while(expr)
{
    statement;
}
4.do...while循环语句
do
{
}while(expr);
5.for循环语句
for(expr1;expr2;expr3)
{
    statement;
}
6.foreach循环语句
foreach(array_expression as $value)
{
    statement;
}
或
foreach(array_expression as $key=>$value)
{
    statement;
}
#当使用foreach语句用于其他数据类型或者未初始化的变量时会产生错误.
为了避免这个问题,最好使用is_array()函数先来判断变量是否为数据类型,如果是,再进行其他操作.
7.break跳转语句
break关键字可以终止当前的循环.
8.continue跳转语句
continue关键字用于跳出本当次循环
9.return语句
函数返回语句

包含语句

1.include()语句
使用include()语句包含外部文件时,只有代码执行到该语句时才将外部文件包含进来,当所包含的外部
文件发生错误时,系统只给出一个警告,而整个PHP文件则继续向下执行.
void include(string filename);
2.require()语句
当使用require()语句载入文件时,它会作为PHP文件的一部分被执行.
void require(string filename);
3.include_once()语句
应用include_once()函数多次调用相同的文件时,程序只会调用一次.
void include_once(string filename);
4.require_once()语句
require_once()语句是require()语句的延伸,它的功能与require()语句基本类似,不同的是,
require_once()语句先检查要导入的文件是不是已经在该程序中的其他地方被调用过,如果有的话就不会再次
重复调用该文件.
#include()语句和require()语句的区别
*在使用require()语句调用文件时,如果没有找到文件,require()语句会输出错误信息,并且立即终止脚本的处理.
而include()语句在没有找到文件时则会输出警告,不会终止脚本的处理.
*使用require()语句调用文件时,只要程序一执行,会立刻调用外部文件;而通过include()语句调用外部文件时,
只有程序执行到该语句时,才会调用外部文件.

PHP数组类型

在PHP中将数组分为一维数组,二维数组和多维数组.
1.数字索引数组
键名由数字组成,默认从0开始
$ary = array("one","two","three");
2.关联数组
键名由数值和字符串混合的形式组成,如果一个数组中有一个键名不是数字,那
么这个数组就叫做关联数组.
$ary = array("one"=>"first","two"=>"second","three"=>"third");

使用函数创建数组

array([mixed...])
#创建二维数组:
$str=array(
"1"=>array("one","two"),
"2"=>array("three","four")
);

遍历输出数组

1.foreach语句
#实例:
$str=array("one"=>"first","two"=>"second");
foreach($str as $value)
{
    echo $value." ";
}
foreach($str as $key=>$value)
{
    echo $key."---".$value." ";
}
2.for语句
如果要遍历的数组是数字索引数组,并且数组的索引值为连续的整数时,可以使用for
循环来遍历,但前提条件是需要应用count()函数获取到数组中元素的数量,然后将获取
的元素数量作为for循环执行的条件.
$str=array("0"=>"first","1"=>"second");
for($i=0;$i"first","two"=>"second");
while(list($key,$value)=each($str))
{
    echo $key."===".$value." ";
}

统计数组元素个数

count()函数可以对数组中的元素个数进行统计.
int count(mixed var[,int mode])
mode为1(COUNT_RECURSIVE)时检测多维数组

向数组中添加元素

在PHP中,使用array_push()函数可以向数组中添加元素,将传入的元素添加到某个数组的末尾,
并返回数组新的单元总数.
int array_push(array array, mixed var [,mixed...])

获取数组中最后一个元素

在PHP中,通过array_pop()函数可以获取并返回数组中的最后一个元素,并将数组的长度减1,
如果数组为空将返回null.
mixed array_pop(array array)

删除数组中重复元素

在PHP中,使用array_unique()函数可以将数组中重复的元素删除.
array array_unique(array array)

获取数组中指定元素的键名

使用array_search()函数获取数组中指定元素的键名,在数组中搜索给定的值,找到后返回键名,
否则返回FALSE.
mixed array_search(mixed needle, array haystack[,bool strict])

获取数组中重复元素的所有键名

如果查询的元素在数组中出现两次以上,那么array_search()函数则返回第一个匹配的键名.
如果想要返回所有匹配的键名,则需要使用array_keys()函数.
array array_keys(array input[,mixed search_value[,bool strict]])

字符串与数组相为转换

explode:将字符串按分隔符生成数组
implode:将数组生成为字符串

PHP全局数组

$_SERVER[]全局数组包含由Web服务器创建的信息,应用该数组可以获取服务器和客户配置及
当前请求的有关信息.
$_SERVER['SERVER_ADDR']:当前运行脚本所在的服务器的IP地址
$_SERVER['SERVER_NAME']:当前运行脚本所在服务器主机的名称.
$_SERVER['REQUEST_METHOD']:访问页面时的请求方法,如GET,HEAD,POST和PUT.
$_SERVER['REMOTE_ADDR']:正在浏览当前页面用户的IP地址.
$_SERVER['REMOTE_HOST']:正在浏览当前页面用户的主机名.
$_SERVER['REMOTE_PORT']:用户连接到服务器时所使用的端口.
$_SERVER['SCRIPT_FILENAME']:当前执行脚本的绝对路径名.
$_SERVER['SERVER_PORT']:服务器所使用的端口.如果使用SSL安全连接,为用户设置HTTP端口.
$_SERVER['SERVER_SIGNATURE']:包含服务器版本和虚拟主机名的字符串.
$_SERVER['DOCUMENT_ROOT']:当前运行脚本所在的文档根目录.

$_GET[]和$_POST[]全局数组

用来接受form表单发送来的数据

$_COOKIE全局数组

$_COOKIE[]全局数组存储通过http Cookie传递到脚本的信息.
在PHP中可以通过setCookie()函数设置Cookie的值,用$_COOKIE[]数组接收
Cookie的值,$_COOKIE[]数组的下标为Cookie的名称.
#实例:
setCookie("one","first",time()+60);
echo "读取 Cookie: ".$_COOKIE["one"];

$_ENV[]全局数组

$_ENV['HOSTNAME']:获取服务器名称.
$_ENV['SHELL']:获取系统shell.

$_REQUEST[]全局数组

可以用$_REQUEST[]全局数组获取GET方法、POST方法和http Cookie传递到脚本的信息.
如果在编写脚本程序时,不能确定是通过什么方法提交的数据,那么可以通过$_REQUEST[]
全局数组获取提交到当前页面的数据

$_SESSION[]全局数组

$_SESSION[]全局数组用于获取会话变量的相关信息.
#实例:
session_start();
$_SESSION["one"]="first";
echo $_SESSION["one"];

$_FILES[]全局数组

$_FILES[]全局数组为一个多维数组,该数组用于获取通过POST方法上传文件时的相关信息.
如果为单文件上传,则该数组为二维数组;如果为多文件上传,则该数组为三维数组.
$_FILES["file"]["name"]:从客户端上传的文件名称
$_FILES["file"]["type"]:从客户端上传的文件类型
$_FILES["userfile"]["size"]:已上传文件的大小
$_FILES["file"]["tmp_name"]:文件上传到服务器后,在服务器中的临时文件名
$_FILES["file"]["error"]:返回在上传过程中发生错误的错误代号

Web表单

Web表单的功能是让浏览者和网站有一个互动的平台,主要用来在网页中发送数据到服务器.

创建表单

<form name="form_name" method="method" action="url" enctype="value" target="target_win" id="id">
<form>
name:表单名称
id: 表单的ID号
method:该属性用于定义表单中数据的提交方式,可取值为GET和POST中的一个.GET方法将表单内容附加在URL地址
后面进行提交,所以对提交信息的长度进行了限制,不可以超过8192个字符,同时GET方法不具有保密性,不能传送非ASCII
的字符;POST方法将用户在表单中填写的数据包含在表单的主体中,一起传送到服务器,不会在浏览器的地址栏中显示,
这种方式传送的数据没有大小限制.默认为GET方法.
action:该属性定义将表单中的数据提交到哪个文件中进行处理,这个地址可以是绝对URL,也可以是相对的URL.
如果这个属性是空值则提交到当前文件.
enctype:设置表单资料的编码格式
target:该属性和链接中的同名属性类似,用来指定目录窗口或目标帧

添加表单元素

表单(form)由表单元素组成,常用的表单元素有以下几种标记:输入域标记input,选择域selec,option,文本域textarea
1.输入域标记input
<input name="filed_name" type="type_name">
type的属性取值:
text:文本框,value是文本框的默认值,size指文本框的宽度,maxlength指文本框的最大输入字数
hidden:隐藏域,用于表单中以隐含方式提交变量值.
password:密码域,即文本框中的字符被替换成*
file:文件域,上传文件时需要指明表单的属性enctype="multipart/form-data"才可以实现上传功能
image:图像域是指可以用在提交按钮位置上的图片,这幅图片具有按钮的功能
radio:单选按钮,用于设置一组选择项,用户只能选择一项checked属性用来设置单选按钮默认值
checkbox:与单选类似,但可以多选
submit:将表单的内容提交到服务器端,<input type="submit" name="Submit" value="提交">
reset:清除与重置表单内容,用于清除表单中所有文本框的内容,而且使选择菜单项恢复到初始值
button:按钮可以激发提交表单的动作,可以在用户需要修改表单时,将表单恢复到初始的状态,
还可以依照程序的需要,发挥其他作用.普通按钮一般是配合JavaScript脚本来进行表单的处理.

对超链接传递的数据进行编码和解码

1.对超链接传递的数据进行编码和解码
PHP中对字符串进行URL编码使用的是urlencode()函数,该函数的语法如下:
string urlencode(string str)
该函数可以实现将字符串str进行URL编码
2.对超链接传递的数据进行解码
string urldecode(string str)

JavaScript语言基础

1.JavaScript数据类型
字符串:如"PHP"
数值型:如123
布尔型:如FALSE
对象型:如网页表单元素
null值:null
undefined:如var a

JavaScript的关键字

abstract,boolean,break,byte,case,catch,char,class,continue,default,do,double,else,extends,FALSE,
final,finally,float,for,function,goto,implements,import,in,instanceof,int,interface,long,native,
new,null,package,private,public,return,short,super,switch,synchronized,this,throw,typeof,TRUE,
var,void,while,with.

JavaScript变量定义

所有的JavaScript变量都是由关键字var声明
var variable;

JavaScrip注释

1.单行注释:
"//"符号后面的文字都不被程序解释执行.
2.多行注释:
"/**/"可以嵌单行注释"//",但不能嵌多行注释"/**/"

通过JavaScript脚本自定义函数

function 函数名([参数])
{
    return var;
}
调用方法:
函数名();
#在同一个页面中不能定义名称相同的函数,另外,当用户自定义函数后,需要对该函数进行引用,
否则自定义的函数将失去意义.

JavaScript脚本嵌入方式

1.在HTML中嵌入JavaScript脚本
<script language="javascript">
...
</script>
2.调用外部JS文件
<script language="javascript" src="js/javascript.js" />
#如果未设置language属性,Internet Explorer浏览器默认使用JavaScript脚本语言.

在body标记中间调用JavaScript事件

<input type="submit" name="Submit" value="检测" onClick="check();">

解决浏览器不支持JavaScript问题

虽然大多数浏览器都支持JavaScript脚本,但是由于浏览器设置的不同,导致很多浏览器不支持JavaScript脚本.
如果遇到不支持JavaScript脚本的浏览器,网页会达不到预期效果.解决之道:
1.开启IE浏览器对JavaScript的支持
"工具"->"Internet选项"->"安全"->"Internet安全设置项"->"Java小程序脚本"启用->"活动脚本"启用.
2.应用注释符号验证浏览器是否支持JavaScript脚本的功能.
<!--....-->
3.应用<noscript>标记验证浏览器是否支持JavaScript脚本.

JavaScript常用事件

onClick:鼠标单击时触发此事件
onDblClick:鼠标双击时触发此事件
onMouseDown:按下鼠标时触发此事件
onMouseUp:鼠标按下后松开鼠标时触发此事件
onMouseOver:当鼠标移动到某对象范围的上方时触发此事件
onMouseMove:鼠标移动时触发此事件
onMouseOut:当鼠标离开某对象范围时触发此事件
onKeyPress:当键盘上的某个按键被按下并且释放时触发此事件
onKeyDown:当键盘上的某个按键被按下时触发此事件
onKeyUp:当键盘上的某个按键被按下后松开时触发此事件

onAbort:图片在下载时被用户中断时触发此事件
onLoad:页面内容完成时触发此事件(也就是页面加载事件)
onResize:当浏览器的窗口大小被改变时触发此事件
onUnload:当前页面将被改变时触发此事件

onBlur:当前元素失去焦点时触发此事件
onChange:当前元素失去焦点并且元素的内容发生改变时触发此事件
onFocus:当某个元素获得焦点时触发此事件
onReset:当表单中reset的属性被激活时触发此事件
onSubmit:一个表单被递交时触发此事件

onBounce:在Marquee内的内容移动至Marquee显示范围之外时触发此事件
onFinish:当Marquee元素完成需要显示的内容后触发此事件
onStart:当Marquee元素开始显示内容时触发此事件

SQL和MySQL

SQL(Structured Query Language,结构化查询语言)与其说是一门语言,倒不如说是一种标准,数据库系统的工业标准.
#SQL标准的关键字及其功能
1.数据查询:Select:从一个或多个表中查询数据
2.数据定义:Create/Alter/Drop table:创建/修改/删除表
3.数据定义:Create/Alter/Drop index:创建/修改/删除索引
4.数据操纵:Insert:向表中插入新数据
5.数据操纵:Delete:删除表中的数据
6.数据操纵:Update:更新表中现有的数据
7.数据控制:Grant:为用户赋予特权
8.数据控制:Revoke:收回用户的特权
#MySQL支持的SQL关键字
Create/Drop database/Use:创建,删除和选择数据库
Create/Alter/Drop table:创建,更改和删除表
Create/Alter/Drop index:创建,更改和删除索引
Select:查询表中的信息
Describe/Explain/Show:取数据库,表和查询的有关信息
Delete/Insert/Update/Load data/Optimize table/Replace:修改表中的信息
Flush/Grant/Kill/Revoke:管理语句
Create/Drop function/Lock/Unlock tables/Set:其他语句
#MySQL中的注释
"#"号开头直到行尾的所有内容都是注释
"-- "号开头直到行尾的所有内容都是注释,注意在"--"后面还有一个空格
"/**/"为多行注释.

启动和关闭MySQL服务器

启动MySQL服务器有两种方法,即分别通过系统服务器和命令符(DOS)启动.
#在命令提示符下启动MySQL
net start MySQL
#在命令提示符下关闭MySQL
net stop MySQL

连接MySQL服务器

连接MySQL服务器有两种方法:
一种是进入DOS窗口,通过命令来连接;另一种是使用MySQL数据库系统函数连接.
#在命令行下连接MySQL
MySQL -uroot -h127.0.0.1 -p123
-u后输入的是用户名root;-h后输入的是MySQL数据库服务器地址;-p后输入的是密码.

操作MySQL数据库

#创建新数据库
CREATE DATABASE db_name;
*不能与其他数据库重名
*名称由任意字母,阿拉伯数字,下划线或者美元符"$"组成,可以使用上述任意字符开头,但不能用数字
*名称最长可由64个字符组成,而别名最多可长达256个字符
*不能使用MySQL关键字作为数据库,表名

选择指定数据库

USE语句用于选择一个数据库,使其成为当前默认数据库.
USE db_name;

删除指定数据库

对于删除数据库的操作,应该谨慎使用,一旦执行这项操作,数据加的所有结构和数据都会被删除,没有恢复的可能.
DROP DATABASE db_name;

操作MySQL数据表

MySQL数据表的基本操作包括创建,查看,修改,重命名和删除
1.创建一个表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 数据表名
[(create_definition,...)][table_options][select_statement]
TEMPORARY:如果使用该关键字,表示创建一个临时表
IF NOT EXISTS:该关键字用于避免存在时MySQL报告的错误
create_definition:这是表的列属性部分.MySQL要求在创建表时,表要至少包含一列
table_options:表的一特性参数
select_statement:SELECT语句描述部分,用它可以快速创建表
#create_definition的参数说明:
col_name:字段名
type:字段类型
NOT NULL|NULL:指出该列是否允许是空值,所以当不允许为空值时,必须使用NOT NULL
DEFAULT default_value:表示默认值
AUTO_INCREMENT:表示是否是自动编号,每个表只能有一个AUTO_INCREMENT列,并且必须被索引
PRIMARY KEY:表示是否为主键.一个表只能有一个PRIMARY KEY.如果表中没有PRIMARY KEY,而
某些应用程序又需要PRIMARY KEY,MySQL将返回第一个没有任何NULL列的UNIQUE键,作为PRIMARY KEY
reference_definitioin:为字段添加注释

查看数据表结构

1.SHOW COLUMNS语句
SHOW [FULL]COLUMNS FROM 数据表名[FROM 数据库名]
或写成
SHOW [FULL]COLUMNS FROM 数据表名.数据库名
2.DESCRIBE语句
DESCRIBE 数据表名;
其中,DESCRIBE可以简写成DESC.
DESCRIBE 数据表名 列名;

修改数据表结构

ALTER TABLE语句:
ALTER[IGNORE] TABLE 数据表名 alter_spec[,alter_spec]...
alter_specification:
ADD [COLUMN] create_definition [FIRST|AFTER column_name]
ADD INDEX [index_name](index_col_name,...)
ADD PRIMARY KEY(index_col_name,...)
ADD UNIQUE [index_name](index_col_name,...)
ALTER [COLUMN] col_name {SET DEFAULT literal|DROP DEFAULT}
CHANGE [COLUMN] old_col_name create_definition
MODIFY [COLUMN] create_definition
DROP [COLUMN] col_name
DROP PRIMARY KEY
DROP INDEX index_name
RENAME[AS] new_tbl_name
table_options
#添加一个新的字段email,类型为varchar(50),not null,将字段user的类型由varchar(50)改为
varchar(80),代码如下:
alter table tb_admin add email varchar(50) not null, modify user varchar(80);

重命名数据表

RENAME TABLE 数据表名 1 To 数据表名 2

删除指定数据表

DROP TABLE 数据表名;
#在删除数据表的过程中删除一个不存在的表将会产生错误,如果在删除语句中加入if exists关键字则不会出错.
drop table if exists 数据表名;

操作MySQL数据

1.向数据表中添加数据
insert into table_name values(value1, value2,...)
insert into table_name (column_name1, column_name2,...) values(value1, value2,...)
insert into table_name set column_name1 = value1, column_name2 = value2,...
#批量添加数据
load data local infile "filename.txt" into table table_name
2.更新数据表中数据
update table_name
set column_name1 = value1,column_name2 = value2,...
where condition
3.删除数据表中数据
delete from table_name
where condition
#TRUNCATE语句可以很快地删除表中的所有内容
4.查询数据表中的数据
select selection_list //要查询的内容,选择哪些列
from table_list //从什么表中查询,从何处选择行
where primary_constraint //查询时需要满足的条件,行必须满足的条件
group by grouping_columns //如何对结果进行分组
order by sorting_columns //如何对结果进行排序
having secondary_constraint //查询时满足的第二条件
limit count //限定输出的查询结果
#selection_list
设置查询内容,如果要查询表中所有列,可以将其设置为"*";如果要查询表中某一列或多列,则直接输入列名,并以","为分隔符
select * from tb_admin;
select id, user from tb_admin;
#table_list
指定查询的数据表.既可以从一个数据表中查询,也可以从多个数据表中进行查询,多个数据表之间使用","分隔,
并且通过where子句使用连接运算来确定表之间的联系.
例如:从tb_mrbook和tb_bookinfo数据中查询bookname="php"的作者和价格.
select tb_mrbook.id, tb_mrbook.bookname,
author, price from tb_mrbook, tb_bookinfo
where tb_mrbook.bookname = tb_bookinfo.bookname and
tb_bookinfo.bookname="php"
在上面的SQL语句中,因为两个表都有id字段和bookname字段,为了告诉服务器要显示哪个表中的字段信息,要加上前缀.
其语法如下:
表名.字段名

GROUP BY子句

select bookname, avg(price), type from tb_mrbook group by type;

DISTINCT关键字

select distinct type from tb_mrbook;

ORDER BY子句

使用ORDER BY子句可以对查询的结果进行升序和降序(DESC)排列,在默认情况下,ORDER BY按升序输出结果.
select * from tb_mrbook order by id desc limit 3;

LIKE运算符

LIKE属于较常用的比较运算符,通过它可以实现模糊查询.它有"%"和下划线"_"两种通配符.
"%"可以匹配一个或多个字符,而"_"只匹配一个字符.
例如,查找所有第二个字母是"h"的图书.
select * from tb_mrbook where bookname like('_h%');
(中文和英文都算一个字符)

CONCAT函数

使用CONCAT函数可以联合多个字段,构成一个总的字符串.
例如,把tb_mrbook表中的书名(bookname)和价格(price)合并到一起,构成一个新的字符串.
select id, concat(bookname,":",price) as info, f_time, type from tb_mrbook;

LIMIT子句

LIMIT子句可以对查询结果的记录条数进行限定,控制它输出的行数.
例如,查询tb_mrbook表,按照图书价格降序排列,显示3条记录.
select * from tb_mrbook order by price limit 3;
例如,查询tb_mrbook表,从编号1开始,查询4条记录.
select * from tb_mrbook where id limit 1,4;

函数和表达式

例如,计算tb_mrbook表中各类图书的总价格.
select sum(price) as total, type from tb_mrbook group by type;
常用统计函数:
avg:获取指定列的平均值
count:如果指定了一个字段,则会统计出该字段中的非空记录;
min:获取指定字段的最小值
max:获取指定字段的最大值
std:指定字段的标准背离值
stdtev:与STD相同
sum:指定字段所有记录的总和
select *, (price * 0.8) as '80%' from tb_mrbook;

PHP操作MySQL数据库的步骤

1.连接MySQL服务器
2.选择MySQL数据库
3.执行SQL语句
4.关闭结果集
5.关闭MySQL服务器

mysql_connect()函数连接MySQL服务器

mysql_connect('hostname', 'username', 'password');
#实例:
$conn = mysql_connect("localhost", "root", "123") or die ("连接数据库服务器失败!".mysql_error());

mysql_select_db()函数选择MySQL数据库

#实例:
$conn = mysql_connect("localhost", "root", "123");
$select = mysql_select_db("db_admin", $conn);
if($select){echo "数据库连接成功!";}

mysql_query()函数执行SQL语句

mysql_query(string query[,resource link_identifier])
#实例1:
$result = mysql_query("insert into tb_admin value("id", "user")", $conn);
#实例2:
$result = mysql_query("update tb_admin set user="admin" where id='01'", $conn);

mysql_fetch_array()函数将结果集返回到数组中

array mysql_fetch_array(resource result[,int result_type])
result:资源类型的参数,要传入的是由mysql_query()函数返回的数据指针
result_type:可选项,设置结果集数组的表述方式.
#实例:
$conn = mysql_connect("localhost", "root", "123");
$select = mysql_select_db("db_admin", $conn);
$query = mysql_query("set names utf8");
$query = mysql_query("select * from tb_admin", $conn);
while($result=mysql_fetch_array($query))
{
    echo $result["id"].$result["user"];
}

mysql_fetch_row()函数从结果集中获取一行作为枚举数组

array mysql_fetch_row(resource result)
#echo $result[1].$result[2];
#mysql_fetch_array()函数和mysql_fetch_row()函数有什么区别:
使用mysql_fetchar_array()函数获取到的数组可以是数字索引数组,也可以是关联数组,
而使用mysql_fetch_row()函数获取到的数组,只可以为数字索引数组.

mysql_num_rows()函数获取查询结果集中的记录数

int mysql_num_rows(resource result);

mysql_free_result()函数释放内存

mysql_free_result()函数用于释放内存,数据库操作完成后,需要关闭结果集,以释放系统资源,
该函数的语法格式如下:
mysql_free_result($result);
#mysql_free_result()函数将释放所有与结果标识符result所关联的内存.该函数仅需要在考虑到返回很大的结果集
时会占用多少内存时调用.在脚本结束后所有关联的内存都会被自动释放.

mysql_close()函数关闭连接

mysql_close($conn);

会话的操作

SESSION译成中文为"会话",其本义是指有始有终的一系列动作/消息,如打电话时从拿起电话拨号到挂断电话这
中间的一系列过程可以称之为一个SESSION.
在计算机专业术语中,SESSION是指一个终端用户与交互系统进行通信的时间间隔,能常指从注册进入系统到注销
退出系统之间所经历的时间.

创建会话

通过4个步骤可以创建一个会话:启动会话,注册会话,使用会话和删除会话.
1.启动会话
#通过session_start()函数创建会话.
bool session_start(void)
#通过session_register()函数为会话登录一个变量来隐含地启动会话.
boolean session_register(string name)
name:指定新session变量的名称.使用session_register()函数,要求将php.ini文件中的
register_globals选项值设置为On.
#如果应用session_register()函数,则不必调用session_start()函数,PHP会在注册变量之后隐含地
调用session_start()函数.
2.注册会话
#会话变量被启动后,全部保存在数组$_SESSION中.通过数组$_SESSION创建一个会话变量很容易,
只要直接给该数组添加一个元素即可.
#实例:
session_start();
$_SESSION["user"]=null;
3.使用会话
#例如,判断页面中是否存在会话ID,如果不存在,就创建一个,并且使其能够通过全局数组$_SESSION进行访问;
如果已存在,则将这个已注册的会话变量载入以供用户使用.
session_start();
if(ifset(session_id()))
{
    echo $_SESSION['user'];
}
else
{
    $_SESSION['user'] = "value";
}
4.删除会话
删除会话有3种方式,即删除单个会话,删除多个会话和结束当前会话.
#删除单个会话
unset($_SESSION['user']);
#删除多个会话,注销所有的会话变量,赋空数组即可.
$_SESSION = array()
#结束当前会话,如果整个会话已经结束,那么就可以使用session_destroy()函数结束当前的会话.
session_destroy();

配置PHP的会话

1.在客户端支持Cookie的前提下,控制SESSION的生命周期
#session_set_Cookie_params()函数
该函数的功能是设置SESSION和Cookie的参数.
void session_set_Cookie_params(int lifetime[,string path[,string domain[,bool secure]]])
$time = 1*60;
session_set_Cookie_params($time);
session_start();
$_SESSION[id] = "user";
*session_set_Cookie_params()函数必须在session_start()函数之前调用.由于该函数在不同的浏览器
上使用会导致一些问题,所以不推荐使用这种方法来设置SESSION的过期时间.
#.setCookie()函数
在PHP中,setCookie()函数的主要职责是创建Cookie.但是,该函数同样可以控制SESSION的过期时间.
session_start(); //启动SESSION
$time = 1*60; //设置SESSION过期时间
setCookie(session_name(), session_id(),time()+$time,"/"); //设置SESSION过期时间
$_SESSION[id]="user"; //注册SESSION
2.在客户端不支持Cookie的前提下,控制SESSION的生命周期
#在登录之前告知用户必须打开Cookie,这是很多论坛的做法.
#设置php.ini文件中的session.use_trans_sid=1或者编译时打开-enable-trans-sid选项,让PHP自动跨页面传递SESSION_ID.
#以GET或者POST方式,通过表单元素传递SESSION_ID
#通过文件或者数据库传递SESSION_ID

SESSION临时文件

在服务器中,如果将所有用户的SESSION都保存到临时目录中,会降低服务器的安全性和服务器的效率,
导致打开服务器所在的站点会非常慢.解决该问题办法将SESSION存储到数据库或者临时文件中.
#session_save_path()函数用来取得或者重新配置当前SESSION的存储路径.
string session_save_path([string path])
如果设置参数path表示重新设置SESSION的存储路径;如果不设置参数path,表示直接获取当前SESSION的存储路径.
$path="./session_files/";
session_save_path($path);
session_start();
$_SESSION[id] = "user";

SESSION缓存

1.缓存方式函数session_cache_limiter
2.缓存时间函数session_cache_expire

SESSION数据库存储

bool session_set_save_handle(string open, string close, string read, string write, string destroy, string gc)

创建Cookie

bool setCookie(string name[,string value[,int expire[,string path[,string domain[,int secure]]]]])
#实例:
setCookie("id","one");

访问Cookie

读取全局数组$_COOKIE[]

删除Cookie

1.使用setCookie()函数删除Cookie
删除Cookie只需要将setCookie()函数中的第二个参数设置为空值,将第3个参数设置为小于系统的当前时间即可.
setCookie("mr","",time()-1);
2.在客户端手动删除Cookie

PHP添加水印功能

<?php
/**
 * 图片加水印(适用于png/jpg/gif格式)
 * @author flynetcn
 * @param $srcImg 原图片
 * @param $waterImg 水印图片
 * @param $savepath 保存路径
 * @param $savename 保存名字
 * @param $positon 水印位置 
 * 1:顶部居左, 2:顶部居右, 3:居中, 4:底部局左, 5:底部居右 
 * @param $alpha 透明度 -- 0:完全透明, 100:完全不透明
 * @return 成功 -- 加水印后的新图片地址
 *          失败 -- -1:原文件不存在, -2:水印图片不存在, -3:原文件图像对象建立失败
 *          -4:水印文件图像对象建立失败 -5:加水印后的新图片保存失败
 */
img_water_mark("2.jpg", "1.jpg", "", "abc.jpg", 3, 20);
function img_water_mark($srcImg, $waterImg, $savepath=null, $savename=null, $positon=5, $alpha=30)
{
    $temp = pathinfo($srcImg);
    $name = $temp['basename'];
    $path = $temp['dirname'];
    $exte = $temp['extension'];
    $savename = $savename ? $savename : $name;
    $savepath = $savepath ? $savepath : $path;
    $savefile = $savepath .'/'. $savename;
    $srcinfo = @getimagesize($srcImg);
    if (!$srcinfo) {
        return -1; //原文件不存在
    }
    $waterinfo = @getimagesize($waterImg);
    if (!$waterinfo) {
        return -2; //水印图片不存在
    }
    $srcImgObj = image_create_from_ext($srcImg);
    if (!$srcImgObj) {
        return -3; //原文件图像对象建立失败
    }
    $waterImgObj = image_create_from_ext($waterImg);
    if (!$waterImgObj) {
        return -4; //水印文件图像对象建立失败
    }
    switch ($positon) {
    //1顶部居左
    case 1: $x=$y=0; break;
    //2顶部居右
    case 2: $x = $srcinfo[0]-$waterinfo[0]; $y = 0; break;
    //3居中
    case 3: $x = ($srcinfo[0]-$waterinfo[0])/2; $y = ($srcinfo[1]-$waterinfo[1])/2; break;
    //4底部居左
    case 4: $x = 0; $y = $srcinfo[1]-$waterinfo[1]; break;
    //5底部居右
    case 5: $x = $srcinfo[0]-$waterinfo[0]; $y = $srcinfo[1]-$waterinfo[1]; break;
    default: $x=$y=0;
    }
    imagecopymerge($srcImgObj, $waterImgObj, $x, $y, 0, 0, $waterinfo[0], $waterinfo[1], $alpha);
    switch ($srcinfo[2]) {
    case 1: imagegif($srcImgObj, $savefile); break;
    case 2: imagejpeg($srcImgObj, $savefile); break;
    case 3: imagepng($srcImgObj, $savefile); break;
    default: return -5; //保存失败
    }
    imagedestroy($srcImgObj);
    imagedestroy($waterImgObj);
    return $savefile;
}
function image_create_from_ext($imgfile)
{
    $info = getimagesize($imgfile);
    $im = null;
    switch ($info[2]) {
    case 1: $im=imagecreatefromgif($imgfile); break;
    case 2: $im=imagecreatefromjpeg($imgfile); break;
    case 3: $im=imagecreatefrompng($imgfile); break;
    }
    return $im;
}
?>