导图社区 PHP入门学习框架笔记总结
PHP入门学习框架笔记总结,导图内容简洁、逻辑清晰、重点突出,希望对大家有所帮助~
编辑于2022-11-02 10:13:27 广东PHP入门学习框架笔记总结
String
字符串的定义方式
1.单引号:‘’在PHP中能解析字符串,但不能单独解析变量; 例子: $a=123; echo '$a';//输出结果是$a; 2.双引号:""能解析字符串,但还能解析变量; 注意:转义字符也可以;解析变量时,记得加{}; 例子: $a=123; echo "{$a}\t";//输出结果是123空格(要在网页中才能看出来) 3.定界符: /** * 1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西; * 2.在PHP定界符中的任何特殊字符都不需要转义; * 3.PHP定界符中的PHP变量会被正常的用其值来替换。 * 格式: * * 内容 * 变量; * 注意:前后的变量必须一致; */ $a=123; $b=123; $str= echo $a;//不需要转义 输出结果:echo 123; $a.$b;//不需要加大括号;输出结果:123.123; int; echo $str;
常用字符串的输出方式
1.echo: 支持输出一个或多个变量,速度比print快一些 2.print: 用法与echo相似,但是要比echo慢一些 3.die(): 别名exit(),终止当前脚本执行,结束时可以提示一条语句 4.print_r(): 与var_dump()函数使用方法相似,都是格式化变量并直接输出,可以解析数组,对象等类型,常用语开发时的临时输出(测试) 建议大家用echo和var_dump();
常用的字符串函数
/** * strtolower() 将字符串全部小写 * strtoupper() 将字符串全部大写 * ucfirst() 将字符串首字母大写 * ucwords() 将字符串中每个单词的首字母大写 */ $str="helloworld"; var_dump(ucwords($str));//很多人会认为输出结果是HelloWorld,而是(Helloworld) $str="hello world"; var_dump(ucwords($str));//输出结果是Hello World,注意多了一个空格; ?> ========================================== /** * nl2br() 将字符串中的\n前添加 标签,实现换行输出 * htmlspecialchars() 格式化字串中的html标签 * strrev() 将字符串颠倒返回; * strlen() 求字符串长度; * mb_strlen() 求中文字符串的长度; */ //输出结果为12换行3 echo nl2br("12\n3"); //输出结果:百度一下; //本来应该输出:百度一下链接,这样就做到格式化html标签,这样可以预防乱码代码; echo "百度一下"; echo strrev("hello中国人");//人国中olleh; echo strlen("中国人");//字母:1字节;汉字:3字节(有别于java语言);输出结果:9; echo mb_strlen("中国人");//输出结果为:3;php做了一个弥补,用此函数来算中文的长度; ?> ========================================== /** * md5() 单向加密的,不可逆,因为在计算过程中原文的部分信息是丢失了的; * 返回值:以 32 字符十六进制数字形式返回散列值; * 这次项目中,有很多同学就是因为这个错,导致产生bug; * 这两个值是不相等的;因为采用的进制不一样; */ $s1="";//采用二进制; $s2=md5($s1);//d41d8cd98f00b204e9800998ecf8427e var_dump($s2==$s1); ========================================== /** * substr ( string $string , int $start [, int $length ] ) * 返回字符串 string 由 start 和 length 参数指定的子字符串。 适合做身份证号码的截取,公务员系统中判断周年的函数也是 用这个方法的。 */ $rest = substr ( "abcdef" , - 1 ); // 返回 "f" $rest = substr ( "abcdef" , - 2 ); // 返回 "ef" $rest = substr ( "abcdef" , - 3 , 1 ); // 返回 "d" ?> ========================================== /** * strstr() 字符串查找并截取; * 该函数区分大小写。如果想要不区分大小写,请使用 stristr() 。 */ $email = 'name@example.com' ; $domain = strstr ( $email , '@' ); echo $domain ; // 打印 @example.com $user = strstr ( $email , '@' , true ); echo $user ; // 打印 name ?> ========================================== /** * strpos() 字符串查找并截取; * 该函数区分大小写。如果想要不区分大小写,请使用 stristr() 。 * 适合做:统计一个字符串中重复出现的字符串次数; */ $mystring = 'abc' ; $findme = 'a' ; $pos = strpos ( $mystring , $findme ); // 注意这里使用的是 ===。简单的 == 不能像我们期待的那样工作, // 因为 'a' 是第 0 位置上的(第一个)字符。 if ( $pos === false ) { echo "The string ' $findme ' was not found in the string ' $mystring '" ; } else { echo "The string ' $findme ' was found in the string ' $mystring '" ; echo " and exists at position $pos " ; } ?> ========================================== /** * ltrim() 去除左侧多余字符(默认删除空格) * rtrim() 去除右侧多余字符(默认删除空格) * trim() 去除两侧多余字符(默认删除空格\t\r\n之类的特殊符号) * explode() 字符串拆分函数 * implode() 字符串组合函数 * $_SERVER['REMOTE_ADDR'] 浏览当前脚本用户的ip地址 * date() 获取当前的系统时间的函数 * time() 获取当前系统时间戳 * file_get_contents() 获取文档当中的信息 * file_put_contents() 在文档当中写入信息 */ ?> ==========================================
留言板实例
liuyan.zip
上课代码
lesson15_string.zip
preg与log_errors
正则表达式
定义:处理模糊匹配、分割、查询、替换功能;
种类:
1> PCRE:perl:我们用的是这个是由PCRE(Perl Compatible Regular Expression)库提供的。使用“preg_”为前缀命名的函数
2> POSIX:由POSIX(Portable Operating System Interface of Unix )扩展提供的。使用以“ereg_”为前缀命名 的函数;
格式及执行步骤:
1>定界符:我们最常用的是 /正则表达式/[修正符] 正斜杠其实:定界符可以是其他的字符,出了数字、字母 \反斜杠##、||、@@、%%
2>原子:组成正则表达式的基本单位,在分析正则表达式时,应作为一个整体。
内容:> 单个字符、数字,如a-z,A-Z,0-9。 > 模式单元,如(ABC)可以理解为由多个原子组成的大的原子。 > 原子表,如 [ABC]。 > 重新使用的模式单元,如:\\1 > 普通转义字符,如:\d, \D, \w > 转义元字符,如:\*,\. *> 元字符
3>元字符(具有特殊意义的字符)
[] 表示单个字符的原子表 例如:[aoeiu] 表示任意一个元音字母 [0-9] 表示任意一位数字 [a-z][0-9]表示小写字和一位数字构成的两位字符 [a-zA-Z0-9] 表示任意一位大小字母或数字 [^] 表示除中括号内原子之外的任何字符 是[]的取反 例如:[^0-9] 表示任意一位非数字字符 [^a-z] 表示任意一位非小写字母 {m} 表示对前面原子的数量控制,表示是m次 例如:[0-9]{4} 表示4位数字0000-9999 [1][3-8][0-9]{9} 手机号码 [\-]?[0-9]+ {m,} 表示对前面原子的数量控制,表示是至少m次 例如: [0-9]{2,} 表示两位及以上的数字 {m,n}表示对前面原子的数量控制,表示是m到n次 例如: [a-z]{6,8} 表示6到8位的小写字母bb * 表示对前面原子的数量控制,表示是任意次,等价于{0,} + 表示对前面原子的数量控制,表示至少1次,等价于{1,} ? 表示对前面原子的数量控制,表示0次或1次(可有可无) 等价于{0,1} 例如:正整数:[1-9][0-9]* 整数:[\-]?[0-9]+ email: () 表示一个整体原子,【还有一个子存储单元的作用】 【还有重复模式单元的使用方法】 也可以使用?:来拒绝子存储。 (?:.*?) 例如:(red) 字串red (red|blue) 字串red或blue (abc){2} 表示两个abc | 表示或的意思 (rea|blue) 字串red或blue ^ 用在正则单元块的开头处,表示必须以指定的开头 $ 用在正则单元块的结尾处,表示必须以指定的结尾 . 表示任意一个除换行符之外的字符 常用组合: .*? 或 .+? 表示最小匹配所有字符(拒绝贪婪匹配)
普通转义字符:
*\d 匹配一个数字;等价于[0-9] *\D 匹配除数字以外任何一个字符;等价于[^0-9] *\w 匹配一个英文字母、数字或下划线;等价于[0-9a-zA-Z_] *\W 匹配除英文字母、数字和下划线以外任何一个字符;等价于[^0-9a-zA-Z_] *\s 匹配一个空白字符;等价于[\f\n\r\t\v] *\S 匹配除空白字符以外任何一个字符;等价于[^\f\n\r\t\v] \f 匹配一个换页符等价于 \x0c 或 \cL *\n 匹配一个换行符;等价于 \x0a 或 \cJ *\r 匹配一个回车符等价于\x0d 或 \cM *\t 匹配一个制表符;等价于 \x09\或\cl \v 匹配一个垂直制表符;等价于\x0b或\ck \oNN 匹配一个八进制数字 \xNN 匹配一个十六进制数字 \cC 匹配一个控制字符 /^-?\d+$|^-?0[xX][\da-fA-F]+$/ 表示十进制和十六进制的一个数字 ^-?\d+$ ^-?0[xX][\da-fA-F]+$ //表示一个邮箱地址 /^[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+(\.[0-9a-zA-Z_-]+){0,3}$/
模式修整符:
i 表示不区分大小写; "/[a-zA-Z]/" <==>"/[a-z]/i" s 表示匹配视为单行(就是可以让点.支持换行) U 表示拒绝贪婪匹配
正则表达式常用函数:
preg_grep -- 返回与模式匹配的数组单元 * preg_match_all -- 进行全局正则表达式匹配 , 返回共计匹配的个数。 和下面的一样,不同的是匹配到最后(全局匹配) * preg_match -- 进行正则表达式匹配,只匹配一次,返回1,否则0, 格式:preg_match("正则表达式","被匹配的字串",存放结果的变量名,PREG_OFFSET_CAPTURE,起始偏移量) 其中:PREG_OFFSET_CAPTURE表示获取匹配索引位置 起始偏移量:从指定位置开始匹配 preg_quote -- 转义正则表达式字符 preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换 *preg_replace -- 执行正则表达式的搜索和替换 *preg_split -- 用正则表达式分割字符串
log_errors日志处理
错误处理:写代码的时候难免会遇到错误。(有错不可怕,我们要做的是知道是哪里出的错,为什么会出错,并且利用之前学过的知识来将其解决)
常用的调试代码的技巧
1.注意提示(查看报错的代码行数,以及它上面的相邻的行数)
2.输出调试法
3.断点调试法
PHP程序的错误类型
1.语法错误,最常见的,也比较容易修复;特点:会阻止脚本运行
2.运行时的错误,输出一条错误,但是php脚本继续执行
3.逻辑错误,最麻烦,最不容易找出的错误,它有时不会报错,但是得出的结果不是你想要的!
如何可以有效的防止出现上述各类错误
写一点,执行一点,发现错误及时处理(最好以一个小功能为基准测试)
错误的运行级别
1.致命错误:阻止脚本运行,相当于脑袋掉了 E_ERROR:报一个致命的错误
2.警告错误:部分功能失效,但脚本继续执行(左手掉了,还有右手) E_WARNING:运行时的警告
3.注意级别:基本没有大碍,可以正常使用(手擦破点皮儿,不会影响使用) E_NOTICE:运行时的提醒
4.E_ALL:所有的错误和警告
设置错误级别
1.在配置文件中修改
php.ini 配置文件,此文件中,每一行前面的分号表示注释掉了该行 搜索:error_reporting,可以看到当前允许的错误级别 &:并且 |:或者 ~:除了 E_ALL & ~E_NOTICE:所有的错都显示,除了NOTICE提示信息 注意: 1.修改的时候一定要做备份!!!!!否则后果自负 2.修改完毕之后要重启服务器 3.如果你改错了,一定不要重启Web(Apache)服务器
2.在自己的脚本中进行修改(推荐使用)
1.error_reporting(); 写入和配置文件中相同的参数可实现相同的效果 注意:这种方法只在当前脚本中有效 2.display_error(); 表示是否在浏览器中显示错误信息(On:显示;Off:不显示) 3.ini_get(); 获得配置信息的函数 4.ini_set(); 在本地修改配置选项 5.ini_get_all(); 获取所有本地可以进行修改的配置选项 1> global_value:代表php.ini文件中的配置 2> local_value:本地设置的配置
日志处理:
定义
一个项目分为:开发阶段和运营阶段 开发阶段有错误:没事儿,调整一下就行了 运营阶段有错误:你摊上事儿了 如何能让网站的错误不再页面上显示呢?我们能不能将错误单独保留在一个文件中?
日志的开启与存放
1.log_errors:错误日志是否开启(可以在php.ini中查看;On:开启;Off:关闭) 2.error_log:错误日志的存放地址(可以在php.ini中查看) 1> 自定义的错误文件位置 2> 放到系统日志里面(不常用) error_log = syslog 查看系统日志:桌面 -> 我的电脑 -> 右击 -> 管理 -> 事件查看器 -> Windows日志 -> 系统
设置日志的步骤
1.Error_reporting = E_ALL 设置开启所有级别的错误警告 2.display_errors = Off 设置在浏览器中不显示错误 3.log_errors = On 开启错误日志 4.error_log = "" 设置你的错误日志要存储在什么位置
日期与时间
1.时间戳
1.它是一个整数 2.从1970年1月1日~现在的秒数(格林尼治(英国伦敦)的时间,从1970年1月1日0点0分0秒开始计算)
2.时间戳的作用:便于计算
3.关于时间戳的一些常用函数
time(); 获得当前时间的时间戳 date(); 格式化一个本地时间的函数 date(格式,时间戳) 注意:时间戳若不给定,则表示的是当前时间的时间戳 常用的格式: Y:年份 m:月份 d:日期 H:小时 i:分钟 s:秒
4.时区的设定
时区:PHP是世界性的语言,默认的时区是英国伦敦时区 我们的时区:东八区,英国东边8个时区 PRC
5.更改时区的方法
1.修改配置文件: 在php.ini中搜索 date.timezone = 相对应的时区 时区列表:php手册中可以搜到 只要你选择一个中国的时区即可,通常使用 PRC:中华人民共和国 2.使用函数修改: date_default_timezone_set("时区"); //设置时区 date_default_timezone_get(); //获得时区 注意:不管时区是什么,你的时间戳不会变。设置时区只不过是设置了显示的时间而已
6.其他的一些时间函数
获得你生日的时间戳 mktime(时,分,秒,月,日,年); //生成一个时间戳 strtotime(); //将任何英文文本的日期时间描述解析为 Unix 时间戳 echo strtotime ( "now" ), "\n" ; echo strtotime ( "10 September 2000" ), "\n" ; echo strtotime ( "+1 day" ), "\n" ; echo strtotime ( "+1 week" ), "\n" ; echo strtotime ( "+1 week 2 days 4 hours 2 seconds" ), "\n" ; echo strtotime ( "next Thursday" ), "\n" ; echo strtotime ( "last Monday" ), "\n" ;
7.实战题,用咱们学到的知识写一个万年历(以五月份为历)
td:hover{ background-color:magenta; } 五月份的万年历 /** * 制做五月份的万年历 */ $day=date('t'); if($day==31){ $arr=array( array(1,2,3,4,5,6,7,8), array(9,10,11,12,13,14,15,16), array(17,18,19,20,21,22,23,24), array(25,26,27,28,29,30,31) ); }else if($day==30){ $arr=array( array(1,2,3,4,5,6,7,8), array(9,10,11,12,13,14,15,16), array(17,18,19,20,21,22,23,24), array(25,26,27,28,29,30) ); } $month=date('F'); $count=-25; foreach($arr as $t){ echo " foreach($t as $v){ $day=date('j'); $week=date('l',strtotime("{$count} day")); if($day==$v){ echo " {$month} {$v} {$week} "; }else{ echo " {$month} {$v} {$week} "; } $count++; } echo ""; } ?>
上课代码
lesson16_preg.zip
error_date_正则表达修正符(增加内容)
修正符使用
表达式的格式: "/表达式/[修正符]" 解释:其中"/"表示正则表达式的定界符,但是也可以是其他符号:如”#“,”!“ 注意:定界符不可以是字母、数字和斜线\。 像“#”、“|”、“!”等都可以的 如:/.../ #...# |....| 其中修正符是可选的,表示对表达式做额外的修饰。
PHP的错误处理
排错方法
1.解读错误信息
可以借助有道词典、金山词霸去翻译一下,当我们知道错误出在哪 并且可以完整的解读报错信息时,你犯的错误会越来越少
2.输出法调试
在你感觉有错误的地方,输出一下,调试一下,问题也许就能解决
3.断点调试发:(die、exit、注释)
在你感觉有错的地方,使用die或exit或将后面代码注释的方法, 中断一下代码的执行
错误类型
1.语法错误
它是比较容易排除的,直接通过报错信息,找到对应行数 即可解决问题 注意:语法错误需要在报错行上下看一下,一般错误都在 报错行上一行
2.运行时的错误
它相对来说也是比较容易解决的
3.逻辑错误
这种错误是最难排除的
错误的级别
1. E_ERROR 致命级别:(就相当于你脑袋没了,你后边想干的事儿都干不了了)当遇到致命错误时,后面的一切代码都不再执行 2. E_WARNING 警告级别:(就相当于你的左手受伤了,但你还有右手啊)当遇到警告错误时,只是报错行不能执行,其他的地方正常执行 3. E_NOTICE 提示错误:(就相当于你的手擦破了一点皮儿) 它不会对程序产生什么影响 4. E_ALL 所有的错误和提示(所有级别的错误)
如何设置各种错误信息的提示
1.在配置文件里面将错误信息关闭
1> 找到 php.ini 文件,搜索 error_reporting = E_ALL & ~E_NOTICE 注意: 配置文件修改的时候,一定要做备份!!!!!!!!!! &:并且 |:或者 ~:除了 注意:修改完配置文件之后,需要重启服务器 你们不许从这里操作错误级别的提示
2.在当前文件里面将错误信息关闭
error_reporting(); //在你想要关闭错误的文件当中去写(推荐使用) display_errors = On //显示所有错误(Off 屏蔽所有错误) 注意:在配置文件中搜索 display_errors 将 On 改成 Off 即可关闭 所有级别的错误 ini_get(); //获取本地配置的设置信息 ini_get("配置名"); ini_set(); //在本地进行配置信息设置 ini_set("配置名","配置值"); ini_get_all(); //获取我们所有可以从页面中设置的配置信息 global:php.ini配置文件中的设置信息 local: 在本地页面中的设置信息
PHP当中的日志
php当中的日志,就是用来记录我们服务器的一些信息的是存放在一个地方的,wamp -> logs目录中 1> 开启或关闭错误日志 log_errors:开启或者关闭错误日志记录(On、Off) error_log:存放错误日志的路径 2> 真实项目是怎么处理的 开发环境:可以犯错 测试环境:可以犯错 上线运营:不能犯错 步骤:1. error_reporting = E_ALL 显示所有级别的错误 2. display_errors = Off 不在页面上显示所有错误 3. log_errors = On 开启错误日志记录 4. error_log = 路径 设置错误日志的存放路径
PHP中的时间与时区
时间戳
time() 获取当前时间的时间戳 php当中的时间戳,使用一个整数来进行存储的 -2147483648 ~ 2147483647 0秒的时间 1970-1-1 0:0:0 Unix(英国的格林威治时间) 1970-1-1 0:0:0 ~ 2038-1-19 3:14:19
时区
PRC 中华人民共和国时区 UTC 大不列颠及北爱尔兰联合众国 1.当前页面设置 date_default_timezone_set("PRC"); //设置我们当前时区是中华人民共和国时区 date_default_timezone_get(); 注意:时区在手册当中可以搜到,自己去看一下,看不懂的就算了 2.配置文件设置 date.timezone = "UTC" 你可以通过这种方式,将当前时区改为 PRC
关于日期的函数
time() 时间戳 date() 格式化时间格式的函数(如果不给定时间戳,则默认为当前系统时间的时间戳) mktime() 创建一个时间戳 格式mktime(时,分,秒,月,日,年) strtotime() 将一个字符串类型的日期转为时间戳格式 字串格式需要注意,按照我们常用的格式去写就行了,别找例外
上课代码
lesson17_error_date.zip
动态修改配置文件实例
config.zip
GD库
需要注意的事项
1.你的php是否支持画画
1.phpinfo(); 从配置信息当中搜索GD看是否有GD的插件,如果没有执行下边一步 2.php.ini 从配置文件当中搜索 extension=php_GD2.dll 把前边的分号去掉 3.如果还是不行,要从 Wamp 根目录下找到 bin 目录,并打开里面的php目录, 在php目录当中的 ext 目录当中查看是否有 php_gd2.dll 这个文件,如果没有 你可以从php官网上去下载
2.我们常见的图像格式
1.jpeg 质量比较低(像素点比较明显) 2.png 质量相对较高(比如你想看苍老师的,那么建议你用png格式的)支持透明 3.gif 质量相对较低,因为它是一个动态图
3.绘画步骤
//设置请求头 header("Content-Type:image/png"); (可以改成 image/jpeg 或 image/gif ) 1> 准备画布、画笔、颜料 $im = imagecreate(宽度,高度); //准备了一个256色的画布(不推荐使用) $im = imagecreatetruecolor(宽度,高度); //准备了一个(256*256*256)色的画布//真彩画布 $bg = imagecolorallocate(画布,230,230,230); //准备了一个背景颜色 $hb = imagecolorallocate(画布,255,255,255); //准备了一个画笔的颜色 2> 开始绘画 imagefill($im,0,0,$bg); 3> 输出图像 imagepng($im); //输出一个png格式的图片 imagejpeg($im); //输出一个jpeg格式的图片 imagegif($im); //输出一个gif格式的图片 imagepng($im,"./1.png"); //将生成的图像另存为一份保存到指定路径 4> 释放资源\ imagedestroy($im); 简化绘画四步骤 //0.设置请求头 header("Content-type:image/png"); //1.准备画布、画笔、颜料 $im = imagecreatetruecolor(400,400); //准备400*400画布 $bg = imagecolorallocate($im,230,230,230); //准备一个背景色 //2.开始绘画(重要) imagefill($im,0,0,$bg); //3.输出图像 imagepng($im); //4.释放资源 imagedestroy($im);
绘画常用的函数
*imagesetpixel($im,x坐标,y坐标,颜色); //绘制像素点 *imageline($im,起始x,起始y,终止x,终止y,颜色); //绘制线条 imagerectangle($im,左上角x,左上角y,右下角x,右下角y,颜色); //绘制矩形 imagefilledrectangle(同上); //绘制实心矩形 imagepolygon($im,array(顶点坐标),顶点数,颜色); //绘制多边形(按逆时针连接线条 imagefilledpolygon(同上); //绘制实心多边形 imageellipse($im,圆心x,圆心y,宽度,高度,颜色); //绘制椭圆形 imagefilledellipse(同上); //绘制实心椭圆形 imagearc($im,圆心x,圆心y,宽度,高度,起始角度,终止角度,颜色); imagefilledarc(同上,样式); imagestring($im,大小,坐标x,坐标y,字符内容,颜色); //绘制字符串(大小0-5) imagestringup(同上); //垂直绘制字符串内容 *imagettftext($im,字体大小,旋转角度,坐标x,坐标y,颜色,字体,内容);
标准的步骤
一、支持:需要php支持gd库
二、绘画步骤
1. 创建一个画布(画板)、画笔、色彩。 2. *开始绘画 3. 输出图像(复制型) 4. 销毁图像资源(释放内存) 示例: //1.创建一个画布,颜色 $im = imagecreate(200,200); $red = imagecolorallocate($im,255,0,0); //创建一个颜色:红色 $blue = imagecolorallocate($im,0,0,255); //创建一个颜色:蓝色 $c1 = imagecolorallocate($im,200,200,200); //2.开始绘画 imagefill($im,0,0,$c1); //填充背景 //.... //3.输出图像 header("Content-Type: image/jpeg");//设置响应头信息为一个jpeg的图片 imagejpeg($im);//输出一个jpeg图片 //4.销毁 imagedestroy($im); //
三、图片的具体绘制
3.1 创建一个画布
imagecreate(宽,高)--创建一个基于256色的画布 imagecreatetruecolor( int x_size, int y_size ) -- 新建一个真彩色图像 //还有基于某个图片的画布 imagecreatefromgif( string filename ) imagecreatefrompng( string filename ) imagecreatefromjpeg( string filename )
3.2 绘画
//分配定义颜色 $red = imagecolorallocate($im,255,0,0); //分配一个颜色 //填充背景 bool imagefill(resource image,int x,int y, int color ); //填充背景 //画点 bool imagesetpixel(resource image,int x,int y,int color );//画一个像素点 //画一个线段的函数 bool imageline ( resource image, int x1, int y1, int x2, int y2, int color ) //画矩形框(不填充) bool imagerectangle ( resource image, int x1, int y1, int x2, int y2, int color ) //画矩形框(填充) bool imagefilledrectangle ( resource image, int x1, int y1, int x2, int y2, int color ) //绘制多边形 bool imagepolygon ( resource image, array points, int num_points, int color ) bool imagefilledpolygon ( resource image, array points, int num_points, int color ) //绘制椭圆(正圆) imageellipse ( resource image, int cx, int cy, int w, int h, int color ) imagefilledellipse ( resource image, int cx, int cy, int w, int h, int color ) //绘制圆弧(可填充) imagearc ( resource image, int cx, int cy, int w, int h, int s, int e, int color) imagefilledarc ( resource image, int cx, int cy, int w, int h, int s, int e, int color, int style ) //绘制字串 bool imagestring ( resource image, int font, int x, int y, string s, int col ) bool imagestringup ( resource image, int font, int x, int y, string s, int col ) //绘制文本: *array imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text ) 当上面的字体出现乱码时,使用下面的函数转换编码 string iconv ( string in_charset, string out_charset, string str ) $name="张三"; $str = iconv("ISO8859-1","UTF-8",$name); $str = iconv("GBK","UTF-8",$name); $str = iconv("GB2312","UTF-8",$name); //图片的裁剪、合成、缩放 **bool imagecopyresampled ( resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h ) * imagesx — 取得图像宽度 * imagesy — 取得图像高度 * array getimagesize ( string $filename [, array &$imageinfo ] ) 取得图像大小
3.3.输出图
header("Content-Type: image/jpeg");//设置响应头信息为一个jpeg的图片 imagejpeg($im);//输出一个jpeg图片 header("Content-Type: image/png");//设置响应头信息为一个png的图片 imagepng($im);//输出一个png图片 //输出到指定文件中(另存为) imagepng($im,"**.png");
3.4.销毁:imagedestroy($im);
上课代码
lesson18_GD.zip
实例:乌龟、验证码和柱形图片
HomeWork.zip
GD_file实例
比例的计算方法
比例的计算方法.png
计算起始坐标的方法
计算起始坐标.png
上课代码
lesson19_GD_file.zip
file文件
一、概述
1.1 文件类型
文件在windows系统下分为3种不同:文件、目录、未知在linux/unix系统下分为7种不同:block、char、dir、fifo、file、link和unknown七种类型
1.2 文件的常用函数
* filetype() --获取文件类型的函数: * is_dir( ) -- 判断给定文件名是否是一个目录 语法结构:bool is_dir(名称) 返回类型:如果文件名存在并且是一个目录则返回 true,否则返回 false。 is_executable( ) -- 判断给定文件名是否可执行 语法结构:bool is_executable(名称) 返回类型:如果文件存在且可执行则返回 true ,否则返回 false 。 * is_file( ) -- 判断给定文件名是否为一个正常的文件 语法结构:bool is_file(名称) 返回类型:如果文件存在且为正常的文件则返回 true 。 is_link( ) -- 判断给定文件名是否为一个符号连接 语法结构:bool is_link(名称) 返回类型:如果文件存在并且是一个符号连接则返回 true。 is_readable( ) -- 判断给定文件名是否可读 语法结构:bool is_readable(文件名称) 返回类型:如果文件存在并且可读则返回 true 。 * is_writable( ) -- 判断给定的文件名是否可写 语法结构:bool is_writable(文件名称) 返回类型:如果文件存在并且可写则返回 true 。 *file_exists( ) 检查文件或目录是否存在 *filesize() 取得文件大小(不能获取目录大小) is_readable() 判断文件是否可读 is_writable() 判断文件是否可写 *filectime() 获取文件的创建时间 filemtime() 获取文件的修改时间 fileatime() 获取文件的访问时间 stat() 获取文件大部分属性
二、目录的相关操作
2.1 路经的方式
windows系统:D:/a/b/c.php 或 D:\a\b\c.php linux/unix系统: /a/b/c.php 为统一建议使用"/"作为目录之间的分割符
2.2 路径的相关函数(4个)
1. basename("url地址"[,去除部分]) -- 获取指定url的文件名 2. dirname("url地址") -- 获取地址的路径值 示例: $url = "http://www.baidu.com/a/b/c.php"; echo $url." "; //http://www.baidu.com/a/b/c.php echo basename($url)." "; //c.php echo basename($url,".php")." "; //c (去掉".php") echo dirname($url)." "; //http://www.baidu.com/a/b *3. pathinfo(文件路径[,需要的下标])--获取文件路径的详细信息,返回一个关联数组 结果:下标:dirname 路径名 basename 文件名 extension 后缀名 filename 文件名(去掉后缀的) 示例: $url = "http://www.baidu.com/a/b/c.php"; *echo pathinfo($url,PATHINFO_DIRNAME); //http://www.baidu.com/a/b *echo pathinfo($url,PATHINFO_EXTENSION); //php 后缀名 *echo pathinfo($url,PATHINFO_BASENAME); //c.php 文件名 $a = pathinfo($url); $a结果: array(4) { ["dirname"]=> string(24) "http://www.baidu.com/a/b" ["basename"]=> string(5) "c.php" ["extension"]=> string(3) "php" ["filename"]=> string(1) "c" } 4. realpath()--获取指定文件的绝对路径 示例: echo realpath("1.php"); //D:\AppServ\www\lamp45\09_file_dir\1.php
2.3 目录的遍历函数
*opendir("") -- 打开一个目录,返回此目录的资源句柄 *readdir(资源句柄) -- 从目中读取一个目录或文件,并指针向下移动一位。 *closedir(资源句柄)-- 关闭打开的目录 rewinddir(资源句柄) -- 倒回目录指针(移至首位)
2.4 统计空间的大小
echo "当前磁盘可用大小:".(disk_free_space("./")/1024/1024/1024)."G "; echo "当前磁盘共计大小:".(disk_total_space("./")/1024/1024/1024)."G ";
2.5 目录的操作
*mkdir() -- 创建一个目录 *rmdir() -- 删除一个目录(只支持删除空目录) *unlink() -- 删除一个文件
2.6 复制文件
copy() --- 复制文件。不支持目录复制
三、文件基本操作
*1. fopen(文件名,打开模式) ---打开一个文件 模式:读(r、r+)、 清空写(w/w+), 追加写(a/a+)、 创建模式(x,x+) *打开模式: *r: 只读模式打开文件,文件指针执行首位。 r+: 可读可写模式打开文件,文件指针执行首位,若文件指针不是在最后,则是覆盖写。 *w: 以写方式打开文件,文件内容清空,若文件不存在,则尝试创建。 w+: 以写和读方式打开文件,文件内容清空,若文件不存在,则尝试创建。(也会覆盖写) *a: 以追加内容方式打开文件,指针移至最后,若文件不存在,则尝试创建。 a+: 以追加内容和可读方式打开文件,指针移至最后,若文件不存在,则尝试创建。 x: 以创建方式打开文件,可写。若文件已存在,则报错。 x+: 以创建方式打开文件,可写可读。若文件已存在,则报错。 附加模式: t: txt文本模式(字符流) b: byte字节模式(二进制)默认 (字节流) 如:fopen("a.txt","rb"); 文件的读写操作也叫流操作,其中流分为字符流(t)和字节流(b 二进制) *2. fread(打开的文件资源,读取的长度) -- 读取文件内容。 *3. fwrite(打开的文件资源,被写入的字串[,长度]) -- 向文件写入内容。 *4. fclose(打开的文件资源) -- 关闭文件 5. fgets() -- 从文件资源中读取一行 6. fgetc() -- 读取一个字符 ------------不用打开文件可直接操作文件的函数----------------------- *7. file() 将文件读出(内容是数组格式),并返回 *8. readfile() 将文件内容读出,并输出 9. file_get_contents() 读取文件内容 10.file_put_contents() 将指定内容写入文件 ---------------------文件指针的操作-------------------------------- 11. ftell() --返回文件指针的位置 12. fseek() --设置文件指针的位置 示例: fseek($f,-2,SEEK_CUR); //从当前指针位置开始,向前移动2位 fseek($f,2,SEEK_SET); //从文件指针开始位置,向后移动2位 fseek($f,-5,SEEK_END); //从文件指针的最后位置开始,向前移动5位 13. rewind() --将文件指针移至首位 ------------文件锁(了解)--------------------------- 14. bool flock ( int $handle , int $operation [, int &$wouldblock ] ) 轻便的咨询文件锁定 operation参数: 要取得共享锁定(读取的程序),将 operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。 要取得独占锁定(写入的程序),将 operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。 要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。 如果不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。 示例: $fp = fopen("/tmp/lock.txt", "w+"); if(flock($fp, LOCK_EX)) { // 进行排它型锁定 fwrite($fp, "Write something here\n"); flock($fp, LOCK_UN); // 释放锁定 } else { echo "Couldn't lock the file !"; } fclose($fp); ?> ---------------------------------------------- *15. rename() --修改文件名 16. ftruncate() — 将文件截断到给定的长度
上课代码
lesson20_file.zip
文件系统小实例
fileSystem.zip
文件的上传与下载
文件的上传和下载
1.文件上传必须设置的一些配置
客户端的一些设置: 1> 如果说你要上传那文件,必须form头的位置设置一个 enctype="multipart/form-data" 例如: 2> 上传 input 表单项的类型必须是 file 类型 例如: 3> 传值方式必须是 post 类型 例如:method="post" 4> 当文件上传以后,我们在接收文件的php文件当中,需要使用 $_FILES 来接收上传文件的信息 服务器端的设置: 我们通过php.ini 配置文件,搜索 file uploads 所查询到的都是对于表单 上传信息的设置 upload_max_filesize = 64M 允许上传的单个文件,最大不能超过64M max_file_uploads = 20 允许上传的最大文件数量不能超过 20 个 file_uploads = On 设置服务器是否允许用户上传文件 upload_tmp_dir ="E:/wam/tmp" 文件上传到服务器的临时存储目录(这个临时的介质,就相当于邮箱) post_max_size = 3M 整个form表单允许上传的最大的大小
2.文件上传的原理
用户上传了一个文件 -> 服务器的临时存储目录 -> 我们的程序需要对这个临时目录中的临时文件进行一个移动 -> 移动到一个指定的目录中 移动上传文件的函数 move_uploaded_file(临时文件路径,新文件路径); 判断用户上传的文件是不是一个有效的上传文件 is_uploaded_file(临时文件路径);
3.完整的文件上传函数
//文件上传函数 /** * 文件上传函数 * @param string $path 定义文件上传到的路径 * @param array $upfile 上传文件的详细信息 * @param array $typeList 允许上传的文件类型 ($typeList = array("image/jpeg","image/png","image/gif");) * @param int $maxSize 允许上传的最大文件大小(默认为0,表示不限制大小) * return array $res 返回文件上传成功或失败的信息(数组中info存放上传文件成功或失败的信息 error为false,表示上传失败!error为true表示上传成功) * $res = array( "info"=>"", "error"=>false ); */ function upload($path,$upfile,$typeList=array(),$maxSize=0){ //定义存放返回信息的数组 $res = array( "info"=>"", "error"=>false ); // 格式化文件上传路径信息 $path = rtrim($path,"/")."/"; //1.判断上传文件的错误号 if($upfile['error']>0){ switch($upfile['error']){ case 1:$info = "表示上传文件的大小超出了约定值!";break; case 2:$info = "表示上传文件大小超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最大值。";break; case 3:$info = "表示文件只被部分上传!";break; case 4:$info = "表示没有上传任何文件。";break; case 6:$info = "表示找不到临时文件夹。";break; case 7:$info = "表示文件写入失败。";break; default:$info = "未知的文件上传你错误!";break; } $res['info'] = "上传失败!原因:".$info; return $res; } //2.判断文件的上传类型是否合法 if(@$typeList && count(@$typeList)>0){ //判断用户上传的文件类型是否包含在服务器允许的类型之中 if(!in_array($upfile['type'],$typeList)){ $res['info'] = "上传失败!原因:不被允许的上传文件类型!"; return $res; } }else{ $res['info'] = "上传失败!原因:服务器没有设定允许上传的文件类型!"; return $res; } //3.判断上传文件的大小是否合法 if($maxSize>0 && $upfile['size']>$maxSize){ $res['info'] = "上传失败!原因:上传文件大小越界!"; return $res; } //4.随机一个文件名称 $pathinfo = pathinfo($upfile['name']); //获取上传那文件的文件名的详细信息 $ext = $pathinfo['extension']; //获取文件后缀名 do{ $newname = date("YmdHis",time()).rand(1000,9999).".".$ext; //拼装随机文件名 }while(file_exists($path.$newname)); //5.执行上传文件的移动 if(is_uploaded_file($upfile['tmp_name'])){ //判断上传文件移动是否成功 if(move_uploaded_file($upfile['tmp_name'],$path.$newname)){ $res['info'] = "恭喜,上传成功!文件名:".$newname; $res['error'] = true; return $res; }else{ $res['info'] = "上传失败!原因:移动上传文件失败!"; return $res; } }else{ $res['info'] = "上传失败!原因:不是有效的上传文件!"; return $res; } } ?>
4.在线相册管理系统(包括下载)
picSystem.zip
上课代码
lesson21_upload.zip
mysql01
一、MySQL数据库系统
MySQL数据库系统就是用来对数据库、数据的一些管理
二、数据库系统
1.数据库 就是用来存储各种数据的 2.数据库管理系统 就是用来管理各种数据库的数据的一个系统
三、常见的一些数据库系统
MySQL、DB2、Oracle、SQL Server……
四、数据库
1.关系型数据库 2.非关系型数据库
五、数据库在Web中的重要性
我们现在看到的网页,基本上没有纯HTML页面了,都是从数据库里面来,它就是我们的仓库
六、为什么选择MySQL作为php的黄金搭档
1.开源免费 2.操作简单、方便快捷 3.比较适用于中小型的企业
七、SQL结构化查询语言
必须是通过服务器,连接我们的数据库,才能进行操作 使用各种SQL语句、增、删、改、查
1.数据定义语言(DDL)
用于定义和管理数据对象,包括数据库,数据表等。 例如:CREATE,DROP,ALTER等。 数据库 -> 数据表:对数据库或数据表的创建、删除、修改等操作
2.数据操作语言(DML)
用于操作数据库对象中所包含的数据。 例如:INSERT,UPDATE,DELETE语句。 我么你对数据的 增、删、改 这些操作,就是数据操作语言
3.数据查询语言(DQL)
用于查询数据库对象中所包含的数据,能够进行单表查询, 连接查询,嵌套查询,以及集合查询等各种复杂程度不同的数据库查询,并将数据 返回客户机中显示。
4.数据控制语言(DCL)
是用来管理数据库的语言,包括管理权限及数据更改。
5.MySQL其实属于一个 C/S 软件
mysql 属于一个客户端应用 MySQL 属于数据库管理系统 它肯定有一个客户端 我们要操作的MySQL在DOS系统下 在DOS系统下进入MySQL前需要进行的一些配置 1> 环境变量 我的电脑 -> 右击属性 -> 高级系统设置 -> 环境变量 -> 新建 | 变量值:MySQL下的bin目录路径
6.进入MySQL数据库
DOS系统下清屏的命令:cls mysql -h localhost -u root -p -b mysql 数据库 -h 服务器(本地、指定服务器IP的)[本地localhost可以省略] -u 用户名(我们用的是root用户:超级管理员) -p 用户密码(不需要再它后面写密码,密码是回车之后写的) -b 蜂鸣器(当命令敲错了,报错时提示的声音)
7.进入MySQL数据库以后的命令
注意: 1> 每一行命令结束了以后,请使用 ; 或 \g 来结束,否则命令可以一直写下去 2> 在MySQL的命令中,如果一行命令没有敲完,就回车了,它会继续执行下去,前提是必须是一条完整的命令 3> 退出敲错的命令、或不想继续执行下去的命令时,用\c 4> 我们要想让数据竖起来显示,在命令后用\G,有时候一行盛不下了会乱, \G可以解决这个问题 5> \s 可以显示当前服务器的配置 6> help 查看所有可以使用的快捷命令
8. 退出数据库服务器
\q exit quit
9.操作数据库的一些命令
1.创建数据库 create database 数据库名; 注意: 1.如果数据库已存在,不能创建同名的数据库 if not exists 如果数据库已存在,加上前面的关键字可以避免报错 2.删除数据库 drop database 数据库名; 3.查看已创建的数据库 show databases; 4.使用一个数据库 use 数据库名; 5.查看建库语句 show create database 数据库名; 注意:通过该命令,我们可以看到所建数据库的建库语句、编码类型; 注意: 1.MySQL数据库中命令不区分大小写。 2.每创建一个数据库,就会在data目录下创建一个以此数据库名称命名的文件夹。 3.在Windows下,数据库名称也是不区分大小写的,但在Linux下,数据库名称严格区分大小写。
10. 对数据表的操作
注意:表中的字段,其实就是一个表头 1>创建数据表 create table 表名( 字段名1(字段类型), 字段名2(字段类型), 字段名3(字段类型) ); 注意: 1.创建一个数据表时,它的每个字段之间用逗号","隔开; 2.最后一个字段不用逗号","; 3.创建完表以后,最后的括号后面使用分号结束 4.建表时,表名后面的括号中写表的字段名(字段类型) 2> 查看表结构 desc 表名; 3> 查看建表语句 show create table 表名; 4> 查看当前数据库存在的数据表 show tables; 5> 删除数据表 drop table 表名
11.对数据的操作
1> 添加数据 ① insert into 表名 (字段1,字段2……) values (值1,值2……); ② insert into 表名 values (值1,值2……),(值1,值2……); ③ insert into 表名 (字段1,字段2……) values (值1,值2……),(值1,值2……); 注意: 1.值和字段名要一一对应,否则会报错 2.你写入的值一定要和数据类型相匹配 2> 删除数据 delete from 表名 where 条件; 注意:删除数据的时候,也一定要加上where条件,否则会删除所有的数据 3> 修改数据 update 表名 set 要修改的字段=修改后的值 where 条件 注意:修改数据的时候,一定要加上where条件,否则会修改所有的数据 4> 查找数据 select *(所有字段) from 表; select 字段1,字段2.. from 表;
上课代码
lesson22_mysql.zip
mysql02
一、将数据导出
1.将整个数据库导出到本地文件(另存一份)
1.在DOS命令下执行的语句 mysqldump -u root -p lamp149 > E:\wamp\www\lamp149\lesson23_mysql02\lamp149.sql
2.将某一张指定的表导出到本地
2.在DOS命令下执行的语句 mysqldump -u root -p lamp149 stu > E:\wamp\www\lamp149\lesson23_mysql02\stu.sql
3.将整个数据库导出到本地文件(不导出数据,只导出表结构)
3.在DOS命令下执行的语句 mysqldump -u root -p -d lamp149 > E:\wamp\www\lamp149\lesson23_mysql02\nlamp149.sql
4.将某一张指定的表导出到本地(不到处数据,只导出表结构)
4.在DOS命令下执行的语句 mysqldump -u root -p -d lamp149 stu > E:\wamp\www\lamp149\lesson23_mysql02\nstu.sql
二、将数据导入
1.在MySQL服务器下执行的语句
source E:\wamp\www\lamp149\lesson23_mysql02\lamp149.sql 注意: 1.导入的时候,需要手动创建数据库,并进入该数据库,再使用source进行导入 2.导入时,source后所跟随的路径,必须保证为正斜杠"/"
2.在DOS下将数据文件导入进来
mysql -u root -p lamp149
三、修改用户密码
1.在DOS命令下进行的修改
1.mysqladmin -u root -p password 新密码
2.在MySQL服务器下进行的修改
2.set password for '用户名'@'服务器名' = password('新密码');
四、如果你的服务器崩了,你要做的两件事儿
1.把 wamp 目录下的 www 目录弄出来,另存一份 2.把 wamp 目录下的 bin 目录下的 mysql 目录下的 mysql5.7.9 目录下的 data 目录,另存一份
四、如果你忘记密码咋办
1.关闭MySQL服务器 2.打开一个DOS命令窗口 3.在DOS下将目录切换到你的MySQL的bin目录下 E:\wamp\bin\mysql\mysql5.7.9\bin> 4.输入命令 mysqld --skip-grant-tables 回车 _ 下划线杠在一直闪,没事儿,就让它闪 5.打开一个新的DOS命令窗口,并输入mysql 6.进入mysql数据库 7.执行修改命令 update user set authentication_string=password('123456'); 8.flush privileges; 刷新 9.所有的DOS都可以关闭了,关闭后重新打开DOS,登陆root用户新的密码即可
五、建表的时候需要注意的一些事项
整型、浮点型、定点数、 字符串型、时间日期型、枚举型、集合类型
1. 整型
注意: 1.如果给定整型的长度,则它会选择指定的整型长度;如果不给,默认11位 2.我们在建表时给定int的类型,如果我们输入的值大于它的范围,则报错 3.插入数据是,要注意是有符号的数据还是无符号的数据 4.在定义一个整数类型的值时,可以忽略它后面的长度 5.它是根据不同类型的范围来进行判断
2.浮点型(float)
单精度 float: 双精度 double: 定点数 decimal: 注意: 1.我们在定义一个浮点型或定点型的值时,需要在类型名后给一个括号(M,D) 精度:M:总长度(整数位+小数位) 标度:D:小数位 2.如果说你给定的小数位超出了定义时的长度,则会自动截断(四舍五入) 3.如果说要是进行一些比较精确的计算,尽量不要使用float类型,因为 它存在误差 4.decimal 它所计算的值是相对准确的
3.字符串型
char() varchar() 注意: 1.char和varchar的长度一定要给定,否则会报错 2.如果说我们输入的内容超出了指定的长度,则会报错 3.char 是一个定长类型(给定多长就是多长了,不会变了) 4.varchar 是一个变长类型(给定多长,在这个范围内,它会自动伸缩)
4.日期时间类型
日期时间在mysql当中可以有三种方式来表示; 1、datetime类型: 不用给长度,默认格式:2016-06-22 16:06:01 2、date类型: 也是一样不用给长度,默认格式:2016-06-22 以上两种输出都是字符串类型,记得加单引号; 3、int类型: 利用时间戳来做time();
5.枚举型
enum('dabolang','xiaobolang','meibolang','lang'); 注意: 1.枚举类型列举出来的一系列的单元,是我们可以选择的,这一系列之外的 值,是不能够添加进去的,如果你任性,非要添加,则会报错!! 2.枚举类型必须给定单引号或双引号否则,会报错
6.集合类型
set('dabolang','xiaobolang','meibolang','lang'); 注意: 1.在添加集合类型的值是,一定要注意,是在集合中选择多个值,放入一个 字符串之中,不能分开写、也不能没有双引号,否则会报错 2.集合类型可以选择多个值 3.这是集合和枚举的区别
六、约束条件
null:可以为空 not null:不能为空 注意: 1.如果你给某个字段添加了不能为空的约束条件,就必须给定它值或者 给定它一个默认值,否则,报错! default:默认值 注意: 1.你的当前字段的类型是什么,你在添加默认值的时候,默认值的类型要和字段的类型保证一致,否则也会报错专门为整型准备的 zerofill:自动前导零, 注意: 1.整型中的int(10)长度,是专门为前导零约束条件准备的, 2.有了前导零,就不要再加负号了,否则报错 unsigned:无符号关键字 注意: 1.它必须跟在字段类型后面 2.加上次关键字之后,就不能再添加负值了,否则会报错 aotu_increment:自增关键字 注意: 1.id这个字段基本上都会使用 aotu_increment 关键字 2.aotu_increment 每次自增1,同时呢它会去找上次出现过的最大的那个值,进行自增 3.aotu_increment 必须和 primary_key 或 unique 同时出现 4.如果你的id值是自增的,则可以省略不写;如果你非要任性写上,写null即可
课堂资料
lesson23_mysql02.zip
小实例:利用PDO写的在线相册系统
onlinepic_mysql.zip
mypicture.sql
mysql03
一、索引
就是用来提高搜索性能的 只有我们数据量非常大的时候,索引可以展现出它的优势来! 注意:索引,我们在添加了以后,不用刻意的去使用它,它会自动生效
1. 常规索引(index)
1> 在建表时创建普通索引 create table t1( id int unsigned not null, name varchar(32), index id(id) // index 索引名(字段名) ); 2> 在建表之后给表字段添加普通索引 create index id on t2(id); create 索引类型 索引名 on 表名(字段名); 3> 删除表中的普通索引 drop index id on t2; drop 索引类型 索引名 on 表名;
2. 唯一索引(unique)
定义了唯一索引的数据列,它里面的内容,必须保证没有重复的,如果出现重复的内容,则会报错! 1> 在创建表的时候定义唯一索引 create table t1( id int unsigned not null, name varchar(32), unique index name(name) //索引类型 索引名(字段名) ); 2> 在创建表的时候定义唯一索引2 create table t1( id int unsigned not null, name varchar(32) unique //直接在建表时将索引名写在指定字段后 ); 3> 表创建以后添加唯一索引 create unique index name on t1(name); create 索引类型 索引名 on 表名(字段名) 4> 删除唯一索引 drop index name on t1; drop index 索引名 on 表名;
3. 主键索引(primary key)
主键索引类似于唯一索引,它的数据列也必须保证是唯一的,它跟唯一索引的区别在于,它只能在一个表中定义一次 1> 创建表是添加主键索引 create table t1( id int unsigned not null auto_increment primary key, name varchar(32) ); 2> 在建表之后加主键索引 因为主键索引比较特殊,它只能在一个表中出现一次,所以在建表后添加主键索引使用下面的方法 alter table t7 change id id int unsigned not null auto_increment primary key; alter table 表名 change 原字段 新字段 类型(长度) 约束条件; 3> 删除主键索引 ① 首先,看一下你的表中是否有 auto_increment 这个约束条件 ② 如果有,先将其删除 alter table 表名 change id id int unsigned not null; ② 最后,可以删除主键索引 alter table 表名 drop primary key; 4. 全文索引
二、存储引擎
1.选择存储引擎
1> MyISAM //因为它不支持事务的处理,不占用磁盘的空间,所以访问速度快当我们执行查询的频率比较高时,使用MyISAM这种存储引擎 2> InnoDB //可以支持事务处理的,占用磁盘的空间,会降低访问速度,因为它安全,因此我们在执行一些具有风险的操作时,建议使用InnoDB存储引擎,修改、删除
2.查看当前我们所使用的存储引擎
show variables like 'default_storage_engine'; +------------------------+--------+ | Variable_name | Value | +------------------------+--------+ | default_storage_engine | MyISAM | +------------------------+--------+ 1 row in set, 1 warning (0.00 sec)
3. 在建表时指定存储引擎
mysql> create table t8( -> id int unsigned not null auto_increment primary key, -> name varchar(32) not null unique -> )engine=InnoDB[MyISAM]; //这里是指定存储引擎的地方
4. 查看表存储引擎的方法
show create table 表名; 查看建表语句即可
三、字符编码
查看当前服务器或数据库的编码,使用 \s 即可 1> 服务器级 2> 数据库级 3> 数据表级 4> 数据字段级 如果说你想要让数据库中的数据不出现乱码,就必须保证上面四个级别编码统一 都是 utf8 1.我们可以设置的编码,到底有多少种 show character set; 注意:因为我们MySQL中,编码设置具有遗传性、继承性,所以,我们只设置 服务器级别的编码设置为 utf8 ,那么无论他下面的数据库、数据表、数据字段都会继承 utf8 的编码
1. 服务器级别的编码如何来进行设置
set character_set_server = '编码';
2. 数据库级别的编码进行设置
创建时给定编码: create database 数据库名 default charset = 'utf8'; 修改数据库编码:set character_set_database = '编码';
3. 数据表级别的编码进行设置
创建数据表时给定编码: create table t9( id int unsigned not null auto_increment primary key, name varchar(32) )engine=MyISAM default charset=utf8; //进行设置数据表编码的位置 修改表的编码:alter table t9 charset='utf8';
4. 对数据字段级别的编码进行设置
必须是字符串型的数据才会有编码 alter table t9 change name name varchar(32) character set 'utf8';
四、修改表结构
1.添加字段
alter table 表名 add 字段名 字段类型(长度) 约束条件; alter table stu add aihao set("dabolang","xiaobolang"); alter table stu add xiaoming varchar(32) after name; alter table stu add sid int unsigned not null .. first; 注意:我们在添加字段时,可以规定它添加的位置,通过 after 或 first 来控制默认位置为最后一个字段后
2.删除字段
alter table 表名 drop 字段名; 注意:删除字段是,关键字是 drop 而不是 delete 这点要注意 再次注意:drop 是针对于数据库或数据表或数据表结构执行删除时的关键字,delete 是针对数据表中的数据执行删除时的关键字
3.修改字段
alter table 表名 change 原字段名 新字段名 类型(长度) 约束条件; 例如:alter table stu change classid classname varchar(32) default 'lamp149'; alter table 表名 modify 原字段名 类型(长度) 约束条件; 例如:alter table stu modify classname varchar(64) default 'lamp149'; 注意:使用change 关键字可以将字段名同时进行修改,但是modify不具有重命名的效果,只能修改数据类型和约束条件
4.修改表名
alter table 表名 rename 新表名; 例如:alter table stu rename stu1;
五、一些常用函数
1.count() 用来进行计数
mysql> select count(*) from stu1; +----------+ | count(*) | +----------+ | 8 | +----------+ 1 row in set (0.02 sec)
2.min()最小值
mysql> select min(age) from stu1; +----------+ | min(age) | +----------+ | 19 | +----------+ 1 row in set (0.00 sec)
3.max()最大值
mysql> select max(age) from stu1; +----------+ | max(age) | +----------+ | 2048 | +----------+ 1 row in set (0.00 sec)
4.sum()求和
mysql> select sum(age) from stu1; +----------+ | sum(age) | +----------+ | 4409 | +----------+ 1 row in set (0.00 sec)
5.avg()平均数
mysql> select avg(age) from stu1; +----------+ | avg(age) | +----------+ | 551.1250 | +----------+ 1 row in set (0.00 sec)
六、group by 分组--子句
格式1: group by 字段名
按照字段名进行分组 mysql> select name,count(name) from company group by name; +--------------------+-------------+ | name | count(name) | +--------------------+-------------+ | 北京热影视有限公司 | 1 | | 国栋能力有限公司 | 1 | | 捡肥皂科技有限公司 | 3 | | 海龙夜店公司 | 1 | | 超超重启有限公司 | 1 | | 野战军第二部对 | 1 | +--------------------+-------------+ 6 rows in set (0.00 sec)
格式2: group by 字段名 having 条件
对分组之后的数据再次进行过滤 mysql> select name,count(name) from company group by name having count(name)>1; +--------------------+-------------+ | name | count(name) | +--------------------+-------------+ | 捡肥皂科技有限公司 | 3 | +--------------------+-------------+ 1 row in set (0.02 sec)
注意
1.where是数据没有分组之前进行的过滤,having子句是对分组后的数据再次过滤 select->from->where->group by->having->order by->limit mysql> select name,code,count(name) from company group by name having code order by count(name); +--------------------+-------+-------------+ | name | code | count(name) | +--------------------+-------+-------------+ | 北京热影视有限公司 | 10002 | 1 | | 超超重启有限公司 | 10003 | 1 | | 野战军第二部对 | 10004 | 1 | | 海龙夜店公司 | 10005 | 1 | | 捡肥皂科技有限公司 | 10001 | 3 | +--------------------+-------+-------------+ 5 rows in set (0.00 sec)
七、起别名(数据表、字段) as
数据表和字段都可以起别名 格式:select count(*) as zongshu from 表名; mysql> select count(*) as num from stu1; +-----+ | num | +-----+ | 8 | +-----+ 1 row in set (0.00 sec)
八、拼接字段 concat(字段1,字段2)
格式:select concat(字段名1,字段名2...) from 表名; 注意:这里的拼接字段就和字符串中的点连接一样。 mysql> select concat(id,name,code) from company; +--------------------------+ | concat(id,name,code) | +--------------------------+ | 1捡肥皂科技有限公司10001 | | 2北京热影视有限公司10002 | | 3超超重启有限公司10003 | | 4野战军第二部对10004 | | 5捡肥皂科技有限公司10001 | | 6海龙夜店公司10005 | | 7捡肥皂科技有限公司10006 | | 8国栋能力有限公司10006 | +--------------------------+ 8 rows in set (0.00 sec) mysql> select concat(id,'xxoo',name,code) from company; +------------------------------+ | concat(id,'xxoo',name,code) | +------------------------------+ | 1xxoo捡肥皂科技有限公司10001 | | 2xxoo北京热影视有限公司10002 | | 3xxoo超超重启有限公司10003 | | 4xxoo野战军第二部对10004 | | 5xxoo捡肥皂科技有限公司10001 | | 6xxoo海龙夜店公司10005 | | 7xxoo捡肥皂科技有限公司10006 | | 8xxoo国栋能力有限公司10006 | +------------------------------+ 8 rows in set (0.00 sec)
九、关联查询
1.找关系:找出两个表中有关系的字段 2.先写出:select * from 表1,表2 3.找条件:where 条件 4.将 * 替换成你想要的数据 例如:select 表1.name,表2.level from 表1,表2 where 表1.条件=表2.条件 mysql> select * from honglou,level where honglou.job=level.id; +----+------+-----+------+----+------------+ | id | name | sex | job | id | job | +----+------+-----+------+----+------------+ | 1 | 潇潇 | w | 1 | 1 | 翠红楼头牌 | | 2 | 凯飞 | w | 2 | 2 | 翠红楼老鸨 | | 3 | 致峰 | m | 3 | 3 | 翠红楼龟公 | | 4 | 晓飞 | m | 4 | 4 | 翠红楼老板 | | 5 | 刚刚 | w | 1 | 1 | 翠红楼头牌 | +----+------+-----+------+----+------------+ 5 rows in set (0.00 sec) mysql> select honglou.name,level.job from honglou,level where honglou.job=level. id; +------+------------+ | name | job | +------+------------+ | 潇潇 | 翠红楼头牌 | | 凯飞 | 翠红楼老鸨 | | 致峰 | 翠红楼龟公 | | 晓飞 | 翠红楼老板 | | 刚刚 | 翠红楼头牌 | +------+------------+ 5 rows in set (0.00 sec)
十、子查询
使用子查询的方法实现和关联查询一样的效果 mysql> select name,max(age) from stu1; +------+----------+ | name | max(age) | +------+----------+ | 阿潇 | 2048 | +------+----------+ 1 row in set (0.00 sec) mysql> select name,max(age) from stu1 where age=(select max(age) from stu1); +------+----------+ | name | max(age) | +------+----------+ | 海龙 | 2048 | +------+----------+ 1 row in set (0.01 sec) mysql> select name,min(age) from stu1 where age=(select min(age) from stu1); +------+----------+ | name | min(age) | +------+----------+ | 飞飞 | 19 | +------+----------+ 1 row in set (0.00 sec)
十一、修改数据
update 表名 set 字段1=值1,字段2=值2 where 条件;
十二、删除数据
注意: 1.我们删除表数据时,一定要加 where 条件限制 2.再删除大量数据之前,为了确保不会错误删除数据,我们一般先使用 select 查询语句进行测试,当查到的数据使我们想要的数据时,再去执行删除 3.要删除表中所有数据时,不要使用delete,可以使用 truncate table 表名它的效果是将表删除并按原结构重建 mysql> truncate table company; Query OK, 0 rows affected (0.03 sec)
课堂资料
lesson24_mysql03.zip
mysql04
一、对数据的操作(详细版)
1.添加数据
1> insert into 表名 (字段1,字段2,…) values (值1,值2,……); 注意:添加数据要注意,只有id(有自增条件),我们在写值是可以用null来代替 2> insert into 表名 (字段1,字段2,…) values (值1,值2,……),(值1,值2,……); 3> insert into 表名 values (值1,值2,……),(值1,值2,……); 注意:所有的值必须都给,而且必须和表中的字段一一对应 4> insert into 表名 set 字段名=值,字段名1=值1; 这种方式使用的较少,了解一下就行了
2.删除数据
delete from 表名; //如果不加where条件,所有的数据都会被删除, 如果说你出现这种情况,谁也救不了你!(做备份) delete from 表名 where 条件(算术运算符,比较运算符,逻辑运算符) 一般呢,我们在执行删除数据的SQL语句时,可以先查出你要删除的那些数据,确保没有任何问题,就可以进行数据的删除了 truncate table 表名; 删除表内所有的数据,并保持表的结构 注意:如果说你的数据是有效数据(真实数据,就不要执行此命令了)
3.修改数据
① update 表名 set 字段名=值 where 条件; 修改一个字段的信息 ② update 表名 set 字段名1=值1,字段名2=值2,…… where 条件 修改多个字段的信息 注意: 一定要加上where条件,否则会导致所有的数据都被改掉
4.查询数据
① select 主句
select database(); select version(); select 1+2; //3 注意:select 主句可以单独执行一些命令
② from 子句
select * from 表名; 查看该表加的所有数据 select name,sex,age from 表名; 查看该表指定的几个字段的信息
③ where 子句
包含条件、算术运算符、逻辑运算符、比较运算符 算术运算符:+ - * / % 比较运算符:> = 逻辑运算符:逻辑或(or ||)、逻辑与(and &&)、逻辑非(not !) 提升运算符的优先级:()括弧 1.搜索stu表中id>20的所有数据; select * from stu where id>20; 2.搜索stu表中id在20-40之间的数据; select * from stu where id>20 && id 3.搜索stu表中id除了20-40之间的数据; select * from stu where id=40; 4.搜索stu表中id在1,3,5,7,9之中的数据; select * from stu where id%2=1 && id select * from stu where id=1 || id=3 || id=5 || id=7 || id=9; 5.搜索id%2=0的所有数据 select * from stu where id%2=0; in 关键字: 搜索stu表中id在1,3,5,7,9之中的数据; select * from stu where id in(1,3,5,7,9); between...and... 关键字: 搜索stu表中id在20-40之间的数据; select * from stu where id between 20 and 40; not 关键字: 搜索stu表中id不在20-40之间的数据; select * from stu where id not between 20 and 40; like 关键字(模糊查询): %:任意长度的任意内容(很常用) _:一个长度的任意内容 查询班级信息中以9结尾的数据 select * from stu where classname like '%9'; 查询班级信息中以9开头的数据 select * from stu where classname like '9%'; 查询班级信息中包含9的数据 select * from stu where classname like '%9%';
④ group by 分组子句
mysql> select count(*),classname from stu where id 该语句的含义为,查询 stu 表中按 classname 分组之后的各班学生总数的信息; +----------+-----------+ | count(*) | classname | +----------+-----------+ | 5 | lamp145 | | 6 | lamp146 | | 4 | lamp148 | | 4 | lamp149 | | 1 | lamp151 | +----------+-----------+ 这里需要注意,进行分组时,在分组前进行条件筛选,我们使用的是where 分组之后,我们使用的筛选条件是having 注意:在进行分组的时候,你要清晰的知道要对谁进行分组,然后,你可以使用 count(*)的方法来计数,最后加上分组的字段,你就知道每一组里共有多少数据 //统计stu表中id mysql> select * from stu where id +----+-------+------+------+-----------+ | id | name | sex | age | classname | +----+-------+------+------+-----------+ | 1 | 子建 | w | 30 | lamp151 | | 2 | 张三0 | w | 18 | lamp149 | | 3 | 张三1 | w | 18 | lamp149 | | 4 | 张三2 | m | 25 | lamp145 | | 5 | 张三3 | w | 25 | lamp148 | | 6 | 张三4 | m | 21 | lamp145 | | 7 | 张三5 | m | 22 | lamp146 | | 8 | 张三6 | m | 18 | lamp145 | | 9 | 张三7 | m | 21 | lamp148 | +----+-------+------+------+-----------+ 9 rows in set (0.00 sec) //对重复出现频率最高的classname进行分组 mysql> select * from stu where id +----+-------+------+------+-----------+ | id | name | sex | age | classname | +----+-------+------+------+-----------+ | 4 | 张三2 | m | 25 | lamp145 | | 7 | 张三5 | m | 22 | lamp146 | | 5 | 张三3 | w | 25 | lamp148 | | 2 | 张三0 | w | 18 | lamp149 | | 1 | 子建 | w | 30 | lamp151 | +----+-------+------+------+-----------+ 5 rows in set (0.00 sec) //统计分好组的每个班有多少个人(count(*)) mysql> select count(*) from stu where id +----------+ | count(*) | +----------+ | 3 | | 1 | | 2 | | 2 | | 1 | +----------+ 5 rows in set (0.00 sec) //光有count(*)不够,我们还得知道对应的班级,所以,加上classname字段 mysql> select count(*),classname from stu where id +----------+-----------+ | count(*) | classname | +----------+-----------+ | 3 | lamp145 | | 1 | lamp146 | | 2 | lamp148 | | 2 | lamp149 | | 1 | lamp151 | +----------+-----------+ 5 rows in set (0.00 sec) //分完组以后,我还想进行一下条件的筛选,就不能用 where 了,我们得用 having mysql> select count(*),classname from stu where id1; +----------+-----------+ | count(*) | classname | +----------+-----------+ | 3 | lamp145 | | 2 | lamp148 | | 2 | lamp149 | +----------+-----------+ 3 rows in set (0.00 sec) //如果你觉得名字不合适,你可以起个别名,起别名在字段后加一个 as 新名字 mysql> select count(*) as sum,classname from stu where id1; +-----+-----------+ | sum | classname | +-----+-----------+ | 3 | lamp145 | | 2 | lamp148 | | 2 | lamp149 | +-----+-----------+ 3 rows in set (0.00 sec)
⑤ order by 排序子句
order by 排序子句有两个关键字,[asc(升序) | desc(降序)] select * from stu where id
⑥ limit 分页子句
// 查询stu表中的数据,只显示10条 mysql> select * from stu limit 10; +----+-------+------+------+-----------+ | id | name | sex | age | classname | +----+-------+------+------+-----------+ | 1 | 子建 | w | 30 | lamp151 | | 2 | 张三0 | w | 18 | lamp149 | | 3 | 张三1 | w | 18 | lamp149 | | 4 | 张三2 | m | 25 | lamp145 | | 5 | 张三3 | w | 25 | lamp148 | | 6 | 张三4 | m | 21 | lamp145 | | 7 | 张三5 | m | 22 | lamp146 | | 8 | 张三6 | m | 18 | lamp145 | | 9 | 张三7 | m | 21 | lamp148 | | 10 | 张三8 | w | 18 | lamp146 | +----+-------+------+------+-----------+ 10 rows in set (0.00 sec) //查询stu表中的数据,进行分页 注意:分页时,limit 0,10 前面的0代表的是数据的下标,后面的10代表每页显示10条在第一页的时候,下标走到了9,所以呢,我们要显示第二页的数据,下标就从10开始 mysql> select * from stu limit 0,10; +----+-------+------+------+-----------+ | id | name | sex | age | classname | +----+-------+------+------+-----------+ | 1 | 子建 | w | 30 | lamp151 | | 2 | 张三0 | w | 18 | lamp149 | | 3 | 张三1 | w | 18 | lamp149 | | 4 | 张三2 | m | 25 | lamp145 | | 5 | 张三3 | w | 25 | lamp148 | | 6 | 张三4 | m | 21 | lamp145 | | 7 | 张三5 | m | 22 | lamp146 | | 8 | 张三6 | m | 18 | lamp145 | | 9 | 张三7 | m | 21 | lamp148 | | 10 | 张三8 | w | 18 | lamp146 | +----+-------+------+------+-----------+ 10 rows in set (0.00 sec) //根据上面的推算,这里的下标应该从10开始,以此类推 mysql> select * from stu limit 10,10; +----+--------+------+------+-----------+ | id | name | sex | age | classname | +----+--------+------+------+-----------+ | 11 | 张三9 | w | 21 | lamp146 | | 12 | 张三10 | w | 19 | lamp146 | | 13 | 张三11 | w | 19 | lamp145 | | 14 | 张三12 | w | 19 | lamp148 | | 15 | 张三13 | w | 25 | lamp146 | | 16 | 张三14 | m | 18 | lamp145 | | 17 | 张三15 | w | 19 | lamp146 | | 18 | 张三16 | w | 21 | lamp149 | | 19 | 张三17 | w | 25 | lamp148 | | 20 | 张三18 | m | 20 | lamp149 | +----+--------+------+------+-----------+ 10 rows in set (0.00 sec) mysql> select * from stu limit 20,10; +----+--------+------+------+-----------+ | id | name | sex | age | classname | +----+--------+------+------+-----------+ | 21 | 张三19 | w | 20 | lamp145 | | 22 | 张三20 | w | 25 | lamp148 | | 23 | 张三21 | m | 22 | lamp145 | | 24 | 张三22 | m | 22 | lamp147 | | 25 | 张三23 | w | 19 | lamp145 | | 26 | 张三24 | w | 20 | lamp149 | | 27 | 张三25 | w | 24 | lamp148 | | 28 | 张三26 | m | 21 | lamp146 | | 29 | 张三27 | w | 22 | lamp146 | | 30 | 张三28 | m | 24 | lamp146 | +----+--------+------+------+-----------+ 10 rows in set (0.00 sec) 再进行查询时,子句的顺序如下: select 字段信息 from 表名 where 条件 group by 分组字段 having 条件 order by 排序字段 [asc|desc] limit 分页信息 selet -> from -> where -> group by -> having -> order by -> limit
⑦ as 关键字给字段起别名
//这条信息时没有起别名时的数据信息 mysql> select count(*) from stu; +----------+ | count(*) | +----------+ | 102 | +----------+ 1 row in set (0.00 sec) //起别名之后的数据信息 mysql> select count(*) as sum from stu; +-----+ | sum | +-----+ | 102 | +-----+ 1 row in set (0.00 sec) 第二种起别名的方法: 省略as关键字的效果是一样的 select count(*) sum from stu; +-----+ | sum | +-----+ | 102 | +-----+
⑧ MySQL中常用的一些函数
count();//统计函数 max(); //查找最大值的函数 mysql> select max(age) from stu; +----------+ | max(age) | +----------+ | 30 | +----------+ 1 row in set (0.00 sec) min(); //查找最小值的函数 mysql> select min(age) from stu; +----------+ | min(age) | +----------+ | 18 | +----------+ 1 row in set (0.00 sec) sum(); //求和函数 mysql> select sum(age) from stu; +----------+ | sum(age) | +----------+ | 2177 | +----------+ 1 row in set (0.00 sec) avg(); //求平均值的函数 mysql> select avg(age) from stu; +----------+ | avg(age) | +----------+ | 21.3431 | +----------+ 1 row in set (0.00 sec)
⑨ 子查询(嵌套查询)
//通过下面这条语句搜索年龄最大的学生信息是错误的写法 mysql> select *,max(age) from stu; +----+------+------+------+-----------+----------+ | id | name | sex | age | classname | max(age) | +----+------+------+------+-----------+----------+ | 1 | 子建 | w | 30 | lamp151 | 100 | +----+------+------+------+-----------+----------+ 1 row in set (0.00 sec) //这种方法也是错误的,不能这么写 mysql> select * from stu where age=max(age); ERROR 1111 (HY000): Invalid use of group function //这是正确的查询方法,属于嵌套查询,也可以叫子查询 mysql> select * from stu where age=(select max(age) from stu); +-----+------+------+------+-----------+ | id | name | sex | age | classname | +-----+------+------+------+-----------+ | 103 | 王浩 | m | 100 | lamp149 | +-----+------+------+------+-----------+ 1 row in set (0.02 sec)
5. 关联查询
mysql> select * from qinglou; +----+------+------+------+------+ | id | name | sex | age | job | +----+------+------+------+------+ | 1 | 乐乐 | m | 22 | 1 | | 2 | 子建 | w | 18 | 2 | | 3 | 王浩 | m | 17 | 3 | | 4 | 高兴 | w | 20 | 1 | | 5 | 伟哥 | m | 24 | 4 | | 6 | 晓飞 | m | 16 | 5 | +----+------+------+------+------+ 6 rows in set (0.00 sec) mysql> select * from level; +----+--------------+ | id | job | +----+--------------+ | 1 | 花满楼头牌 | | 2 | 花满楼老鸨 | | 3 | 花满楼拉皮条 | | 4 | 花满楼技师 | | 5 | 花满楼老板 | +----+--------------+ 5 rows in set (0.00 sec) 1> 先找关系:上面两个表有关联的字段是(qinglou.job -> level.id) 2> 就先写出:select * from qinglou,level; 3> 建立关联:select * from qinglou,level where qinglou.job = level.id; 4> 修改查询字段:select qinglou.name,level.job from qinglou,level where qinglou.job = level.id; // 建立关联后,加上两个表相关联的字段条件 mysql> select * from qinglou,level where qinglou.job=level.id; +----+------+------+------+------+----+--------------+ | id | name | sex | age | job | id | job | +----+------+------+------+------+----+--------------+ | 1 | 乐乐 | m | 22 | 1 | 1 | 花满楼头牌 | | 2 | 子建 | w | 18 | 2 | 2 | 花满楼老鸨 | | 3 | 王浩 | m | 17 | 3 | 3 | 花满楼拉皮条 | | 4 | 高兴 | w | 20 | 1 | 1 | 花满楼头牌 | | 5 | 伟哥 | m | 24 | 4 | 4 | 花满楼技师 | | 6 | 晓飞 | m | 16 | 5 | 5 | 花满楼老板 | +----+------+------+------+------+----+--------------+ 6 rows in set (0.00 sec) //筛选出你要查询的字段信息 mysql> select qinglou.name,level.job from qinglou,level where qinglou.job=level.id; +------+--------------+ | name | job | +------+--------------+ | 乐乐 | 花满楼头牌 | | 子建 | 花满楼老鸨 | | 王浩 | 花满楼拉皮条 | | 高兴 | 花满楼头牌 | | 伟哥 | 花满楼技师 | | 晓飞 | 花满楼老板 | +------+--------------+ 6 rows in set (0.00 sec)
6.拼接字段 concat(字段1,字段2,字段3)
mysql> select name,sex,age from stu where id +-------+------+------+ | name | sex | age | +-------+------+------+ | 子建 | w | 30 | | 张三0 | w | 18 | | 张三1 | w | 18 | | 张三2 | m | 25 | | 张三3 | w | 25 | | 张三4 | m | 21 | | 张三5 | m | 22 | | 张三6 | m | 18 | | 张三7 | m | 21 | +-------+------+------+ 9 rows in set (0.00 sec) ERROR: No query specified mysql> select concat(name,sex,age) from stu where id +----------------------+ | concat(name,sex,age) | +----------------------+ | 子建w30 | | 张三0w18 | | 张三1w18 | | 张三2m25 | | 张三3w25 | | 张三4m21 | | 张三5m22 | | 张三6m18 | | 张三7m21 | +----------------------+ 9 rows in set (0.00 sec) ERROR: No query specified mysql> select concat(name,'-',sex,'-',age) from stu where id +------------------------------+ | concat(name,'-',sex,'-',age) | +------------------------------+ | 子建-w-30 | | 张三0-w-18 | | 张三1-w-18 | | 张三2-m-25 | | 张三3-w-25 | | 张三4-m-21 | | 张三5-m-22 | | 张三6-m-18 | | 张三7-m-21 | +------------------------------+ 9 rows in set (0.00 sec)
二、php和MySQL的合体
1.php操作MySQL的方式
① mysql 纯过程化 ② mysqli 过程化+面向对象 ③ pdo 纯面向对象操作MySQL
2.如何通过php操作MySQL
1、连接数据库(连接成功将结果放入变量,结果是对象) *$link = mysqli_connect('主机名','用户名','密码'); 2、判断错误号: *mysqli_error(); 获取刚刚(最后)执行数据库时操作的错误信息 *mysqli_errno(); 获取刚刚(最后)执行数据库时操作的错误号(0表示没错) 3、选择数据库: *mysqli_select_db($link,'数据库名'); 4、设置字符集: *mysqli_set_charset($link,'字符编码'); 5、发送sql语句: *$result = mysqli_query($link,sql语句);(查询情况下,需将结果放入变量) *mysqli_query($link,sql语句);(其他情况下) 6、解析结果集(如果是查询操作): *mysqli_fetch_assoc($result); //将结果解析成关联式数组 mysqli_fetch_array(结果集); //将结果解析成关联和索引两种数组 mysqli_fetch_row(结果集); //将结果集解析成索引式数组 mysqli_fetch_object(结果集); //以对象的形式解析数组(高级课用) 7、获取结果集中的数据条数: *mysqli_num_rows(结果集); 8、获取结果集中的列数: mysqli_num_fields(结果集); 9、获取上一次出现 MySQL 操作影响的记录行数(主要针对增、删、改) *mysqli_affected_rows(); 10、取得上一步 INSERT 插入数据所获得的ID *mysqli_insert_id();
三、学生管理系统(小实例)
test.zip
课堂资料
lesson25_mysql04.zip
session与cookie
一、Cookie(小甜点)
原理:当用户在访问一个网站时,网站会将自己的一些信息存储在一个文件当中在你访问的那一刻存储到你的客户端电脑当中,不同的浏览器会存储到不同的位置;你第一次访问该网站时,它会将这个信息设置到你的电脑中,往后,当你每次访问我的网站时,我都会先从你的客户端电脑当中去寻找有没有本网站的Cookie文件,如果有,直接拿过来用;
1.Cookie怎么看
Google:设置 -> 最下边(显示高级设置) -> 隐私设置 -> 内容设置 -> 所有Cookie和网站设置 FireFox:右上角(选项) -> 左边(隐私) -> 历史记录(使用自定义设置) -> 显示Cookie
2.Cookie存在本地的什么位置
C:\Users\用户名\AppData\Local\Microsoft\Windows\Temporary Internet Files
3.如何来设置Cookie
setcookie(名字,值,[生存周期],[路径]); 注意:如果生存周期省略,则在关闭浏览器时,Cookie信息就被销毁掉了
4.如何来获取Cookie信息
因为Cookie信息会存到一个超全局数组当中,因此我么你在使用Cookie的值时直接 $_COOKIE['名字'];
5.如何销毁呢
setcookie("名字","",time()-1,路径); 注意:删除时,如果不指定路径,它会默认为是删除当前路径下的cookie信息,如果设置的cookie和销毁cookie的文件不再同一个目录下,这个时候,需要设置第四个参数
二、Session
1.原理
它也是依靠cookie的机制,session进行存储的时候,通过cookie在你本地存储了一个cookie的文件,这个文件的名字是 PHPSESSID 值,是一个唯一的值,同时,在服务器的某个目录下也同时存储了一个SESSION文件,这个SESSION文件的名字和PHPSESSID 所对应的值是相同的;
2.我们如何设置SESSION呢
1> 第一步:session_start(); 开启session (最好放在页面最上面) 2> 第二部:$_SESSION['名字1'] = 值1; $_SESSION['名字2'] = 值2;
3.在服务器下存储的SESSION文件在哪
wamp -> tmp -> 和PHPSESSID同名的session文件
4.如何销毁session
1> 开启session session_start(); 2> 销毁session unset($_SESSION['名字']); 3> 删除session文件 session_destroy(); 4> 删除本地的cookie文件 setcookie("PHPSESSID","",time()-1); 注意: 1.PHPSESSID这个名字,可以自行在配置文件当中来进行设置(session_name()可以获取名字) 2.session.save_path ="E:/wamp/tmp" 设置session在服务器的存储位置
课堂资料
lesson26_session_cookie.zip
项目分析
1.项目分析
项目分析: 咱们在写一个项目的时候,写BBS论坛,首先我们要制定一些规范,编码规范、网站的功能数据库的设计、搭建网站目录、服务器上。 www.17sucai.com 一、编码规范: 1.语言标记: 2.编码格式:UTF-8 无BOM头 3.空 行:每一行带注释的代码前,空一行;函数代码空两行 4.代码注释: 注释:一定要加,一些逻辑性比较强的代码上、步骤性的代码上、比较难以理解的 地方,都要加上代码注释!!! 1> 单行注释://单行注释,要写在代码的上方或右侧 2> 多行注释:/**/ 多行注释,我们就写在代码的上方(调试代码) 3> 函数注释:/** * @author 作者 * @date 时间 * * 函数的功能 * @param 类型1 参数名1 参数的详细解释 * @param 类型2 参数名2 参数的详细解释 * return 类型 结果 结果的注释 */ 5.代码缩进: 4个空格、一个Tab键(父子的关系怎样才能区分的特别清晰呢?就是靠缩进) 6.变量命名规则:尽量不要使用拼音,命名时,还要遵从驼峰命名法的规则 例如:doLogin、doLogout、doAction、backgroundColor…… 二、功能的分析: 网站它都是有前台和后台的,我们在写项目时,要按照一套逻辑思维来写,来自于用户前台和后台是需要搭配着来写的。 前台: 1.用户模块 1> 用户注册(验证码、加积分) 2> 用户登陆(验证码、加积分) 3> 个人中心(用户资料设置[昵称、姓名、性别、年龄、爱好、qq、邮箱、头像]) 4> 修改密码(你可以直接修改,加个验证更完善) 5> 用户退出 4.遍历出所有的分区、版块 5.帖子模块 1> 帖子发布(加积分,若没有登陆,提示你先去登陆) 2> 帖子列表(指定版块下的帖子,加精、置顶的图标;作者、回复、最后发布时间) 3> 搜索分页(帖子列表) 4> 帖子详情(楼主的信息、帖子的内容) 5> 帖子回复(回复的时候,注意各个id之间的关系,回复时也要判断是否登陆) 6> 帖子详情页要有楼层展示,(搜索、分页) 后台: 2.用户管理模块: 1> 用户浏览(分页、搜索、显示所有用户数据) 2> 用户权限(为了避免用户非法操作设置的) 3> 用户编辑(改用户的权限[管理员、普通用户]) 4> 添加用户(添加管理员) 5> 删除用户 3.分区管理模块: 1> 添加父分区 2> 浏览分区(看到所有的父分区和子版块) 3> 删除分区 注意: ① 如果父分区下有子版块,不能删除(隐藏删除按钮) ② 如果子版块下有帖子,不能删除(隐藏删除按钮) 4> 修改分区的名称 5> 子版块(查看子版块下的帖子) 6> 父分区(在父分区下添加子版块) 6.帖子管理模块: 1> 帖子浏览(所有帖子的信息,搜索分页) 2> 查看帖子信息() 3> 编辑帖子信息 4> 放入回收站(前台就不能显示了) 5> 帖子加精、置顶 6> 查看回复(回复的删除) 7.网站配置模块 1> 修改网站标题 2> 修改网站关键字 3> 修改网站的Logo 4> 修改网站的版权 5> 网站的开启或关闭 8.友情链接模块 1> 添加友情链接 2> 修改友情链接 3> 删除友情链接 三、设计数据库 数据库表已经设计完毕,回去以后自己把表建出来,分析一下每个表之间的关系 四、网站目录设计 bbs149/ 项目的根目录 | |-- admin/ 后台目录 | | | |-- user/ 用户管理模块 | | | |-- type/ 分区管理模块 | | | |-- post/ 帖子管理模块 | | | |-- config/ 网站配置模块 | | | |-- friendLink/ 友情链接模块 | | | |-- public/ 框架信息的目录 | | | |-- index.php 后台框架的主框架 | | | |-- login.php 登陆后台的页面 | | | |-- doLogin.php 执行登陆的页面 | | | |-- doLogout.php 执行退出的页面 | |-- home/ 前台目录 | | | |-- 需要你自己来设计 | |-- public/ 公共目录 | | | |-- admin/ 后台公共文件目录 | | | | | |-- css/ 后台框架css目录 | | | | | |-- img/ 后台框架img目录 | | | | | |-- js/ 后台框架js目录 | | | |-- home/ 前台公共文件目录 | | | | | |-- css/ 后台框架css目录 | | | | | |-- img/ 后台框架img目录 | | | | | |-- js/ 后台框架js目录 | | | |-- uploads/ 公共文件上传目录 | | | |-- functions.php 公共函数库 | | | |-- code.php 公共验证码函数 | | | |-- config.php 公共配置文件 | |-- index.php 入口文件
2.数据字典
数据字典.xls
3.效果图
效果图.zip
4.前台与后台
前台与后台
lesson28_Project02.zip
二级标题思路图
思路图.zip