细说PHP

[复制链接]

8

主题

135

帖子

3270

积分

超级月卡

Rank: 7Rank: 7Rank: 7

积分
3270
发表于 2020-9-13 12:23:41 | 显示全部楼层 |阅读模式
本帖最后由 why 于 2020-9-13 12:27 编辑

我们先来看个入门的PHP,死磕这玩意,虽然PHP and MySQL web development比较不容易看懂,但还是学到了不少东西,比如PHP的语法和变量这些都多少有些了解了,我们学点基础先

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

135

帖子

3270

积分

超级月卡

Rank: 7Rank: 7Rank: 7

积分
3270
 楼主| 发表于 2020-9-13 22:56:41 | 显示全部楼层
本帖最后由 why 于 2020-9-14 21:01 编辑

本书第1章介绍了Apache,MySQL,PHP的关系以及发展历程,它们是怎么配合的,大致的工作流程.第2章介绍了怎么安装环境,第3章介绍的基本操作符,基本语法,变量这些最基本的常识性概念.这些都是比较基础的,当然对于没有接触过的新手,确实是非常友好的,起码能了解PHP在环境中充当的什么角色,也能搭建个环境出来要到第7章才能接触到面向对象,看到这一章的时候再详细的记录吧,
写个乘法口诀表:
  1. echo "<br>";
  2. for($i=1;$i<=9;$i++)
  3. {
  4.     for($j=1;$j<=$i;$j++)
  5.         {
  6.                 if($j*$i<10){
  7.                         echo "$j"."x"."$i=&nbsp;".$j*$i."&nbsp;&nbsp;&nbsp;";
  8.                 }else{
  9.                         echo "$j"."x"."$i=".$j*$i."&nbsp;&nbsp;&nbsp;";
  10.                 }
  11.                
  12.         }
  13.         echo "<br />";
  14. }  
复制代码

输出如下:
  1. 1x1= 1   
  2. 1x2= 2   2x2= 4   
  3. 1x3= 3   2x3= 6   3x3= 9   
  4. 1x4= 4   2x4= 8   3x4=12   4x4=16   
  5. 1x5= 5   2x5=10   3x5=15   4x5=20   5x5=25   
  6. 1x6= 6   2x6=12   3x6=18   4x6=24   5x6=30   6x6=36   
  7. 1x7= 7   2x7=14   3x7=21   4x7=28   5x7=35   6x7=42   7x7=49   
  8. 1x8= 8   2x8=16   3x8=24   4x8=32   5x8=40   6x8=48   7x8=56   8x8=64   
  9. 1x9= 9   2x9=18   3x9=27   4x9=36   5x9=45   6x9=54   7x9=63   8x9=72   9x9=81  
复制代码


变量函数也称为可变函数,如果一个变量名后有圆括号,PHP将寻找与变量值通码的函数,并且将尝试执行它
  1. <?php
  2. function one($a,$b){
  3.         return $a+$b;
  4. }
  5. function two($a,$b){
  6.         return $a*$b+$b*$b;
  7. }
  8. function three($a,$b){
  9.         return $a*$a*$a+$b*$b*$b;
  10. }

  11. echo "运算结果是:".$result(2,3);    //本行显示错误,说明调用变量函数只能寻找到本函数的上边一条赋值结果
  12. $result="one";                             //以字符串形式形式把函数赋值给变量$result,$result()寻址字符串名称的函数进行调用
  13. echo "运算结果是:".$result(2,3);   //本行输出调用one()结果
  14. $result="two";
  15. echo "运算结果是:".$result(2,3);    //本行输出调用two()结果
  16. $result="three";

  17. echo "运算结果是:".$result(2,3);    //本行输出调用three()结果,若干上边3条echo不存在,依然只输出three()的结果,证明变量函数只能调用它上边的第一条函数                 
  18. ?>
复制代码


可以使用变量函数实现回调函数
  1. <?php
  2. echo "<br>";
  3. function filter($fun){                 
  4.         for($i=0;$i<=20;$i++){
  5.                 if($fun($i))                  //调用函数,将$i的值传递给函数;
  6.                         continue;                //如果函数返回的值为turn,执行跳出本次循环
  7.                 echo $i."\n";                //否则输出$i
  8.         }
  9.         echo ";"."<br>";
  10. }       

  11. function one($num){
  12.         return $num%3==0;                   //取余,余数为0返回trun,否则返回false
  13. }

  14. function two($num){
  15.         return $num!=strrev($num);          //strrev()倒序输出字符串,如果数值被倒序输出后不相等返回turn,否则返回false
  16. }

  17. filter("one");                   //调用filter函数,将变量函数传递给函数
  18. filter('two');
  19. ?>
复制代码

输出结果:
1 2 4 5 7 8 10 11 13 14 16 17 19 20 ;
0 1 2 3 4 5 6 7 8 9 11 ;

回复

使用道具 举报

8

主题

135

帖子

3270

积分

超级月卡

Rank: 7Rank: 7Rank: 7

积分
3270
 楼主| 发表于 2020-9-15 23:00:29 | 显示全部楼层
看到第10章了,这本书确实比较简单,当然应该是先看了一遍PHP and MySQL web development的缘故,基本的语法都能看得懂了,开始看第10章"文件处理系统"还是老规矩记录一下
回复

使用道具 举报

8

主题

135

帖子

3270

积分

超级月卡

Rank: 7Rank: 7Rank: 7

积分
3270
 楼主| 发表于 2020-9-18 17:57:27 | 显示全部楼层
文件上传与下载
  1. <HTML>
  2.     <head><title>文件上传</title></head>
  3.     <body>
  4.         <form action="upload.php" method="post" enctype="multipart/form-data">
  5.             <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
  6.                 选择文件:<input type="file" name="myfile">
  7.                 <input type="submit" value="上传文件">
  8.         </form>
  9.     </body>
  10. </html>
复制代码



以下文件保存为upload.php
  1. <?php
  2. $allowtype=array("gif","png","jpg");                   //设置允许上传的文件类型
  3. $size=1000000;                                                //限制上传文件大小为1M
  4. $path="./updoads";                                          //设置上传后保存文件的路径

  5. if($_FILES['myfile']['error']>0){                          //判断文件是否可以成功上传到服务器,为0上传成功,否则失败
  6.         echo'上传错误:';
  7. switch($_FILES['myfile']['error']){                       //错误类型
  8.         case 1:die('上传文件超出了PHP配置文件中的约定值:upload_max_filesize');
  9.         case 2:die('上传文件大小超出了表单中的约定值:MAX_FILE_SIZE');
  10.         case 3:die('文件只被部分上载');
  11.         case 4:die('没有上传任何文件');
  12.         default:die('未知错误');
  13.    }       
  14. }

  15. $hz=array_pop(explode(".",$_FILES['myfile']['name']));            
  16. if(!in_array($hz,$allowtype)){                                                  //通过文件后缀名判断上传的文件是否为允许的文件类型
  17.         die("这个后缀是<b>{$hz}<b>,不是允许的文件类型!");
  18. }

  19. if($_FILES['myfile']['name']>$size){                                         //通过文件名判断是否为允许大小
  20.         die("超过了允许的<b>{$size}<b>字节大小");
  21. }

  22. $filename=date("YmdHis").rand(100,999).".".$hz;                    //为了系统安全,也为了同名文件不会被覆盖,上传后将文件名使用系统自定义

  23. if(is_uploaded_file($_FILES['myfile']['tmp_name'])){                 //判断是否为上传文件,特别注意win服务器的tmp_name必须更换成绝对地址
  24.         if(!move_uploaded_file($_FILES['myfile']['tmp_name'],$path.'/'.$filename)){          //这里得tmp_name也要改成绝对地址
  25.                 die('问题:不能将文件移动到指定目录.');
  26.         }
  27.         else{
  28.                 die("问题:上传文件{$_FILES['myfile']['name']}不是一个合法文件:");
  29.         }

  30. }
  31. echo "文件${$upfile}上传成功,保存在目录{$path}中,大小为{$_FILES['myfile']['size']}字节";        //如果文件属于合法上传文件,移动到相应位置并输出提示
  32. ?>
复制代码

执行后输出结果:
文件上传成功,保存在目录./updoads中,大小为5073字节

需要在服务器根目录下新建updoads文件目录,临时文件存储(tmp_name)目录,并给两个目录文件Everyone设置读写权限,特别注意win服务器的
if(is_uploaded_file($_FILES['myfile']['tmp_name']))代码中['tmp_name']必须是绝对地址才行,按照书本上的写法这段代码一直保存

处理多个文件上传
  1. <HTML>
  2.     <head><title>文件上传</title></head>
  3.     <body>
  4.         <form action="upload.php" method="post" enctype="multipart/form-data">
  5.             <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
  6.                 选择文件1:<input type="file" name="myfile[]">
  7.                         <!--选择文件2:<input type="file" name="myfile[]">
  8.                         选择文件3:<input type="file" name="myfile[]">-->
  9.                 <input type="submit" value="上传文件">
  10.         </form>
  11.     </body>
  12. </html>
复制代码

使用print_r($_FILES);输出后得到一个多维数组如下:
  1. Array (
  2.     [myfile] => Array (
  3.            [name] => Array ( [0] => c31db1aac05184384616551c7ca37a46.png
  4.                                        [1] => logo.png
  5.                                        [2] => timg.jpg )
  6.              [type] => Array ( [0] => image/png
  7.                                        [1] => image/png
  8.                                        [2] => image/jpeg )
  9.     [tmp_name] => Array ( [0] => C:\WINDOWS\php9740.tmp
  10.                                        [1] => C:\WINDOWS\php9741.tmp
  11.                                        [2] => C:\WINDOWS\php9742.tmp )
  12.             [error] => Array ( [0] => 0
  13.                                        [1] => 0
  14.                                        [2] => 0 )
  15.               [size] => Array ( [0] => 6448
  16.                                        [1] => 5073
  17.                                        [2] => 7064 ) ) )
复制代码

拆分以上二维数组后,就可以处理多文件同时上传的问题

文件下载:               
  1. <?php
  2. $filename="test.gif";                           
  3. header('content-type:image/gif');                                                             //指定下载文件类型
  4. header('content-disposition:attachment;filename="'.$filename.'"');              //指定下载文件的描述
  5. header('content-length:'.filesize($filename));                                            //指定下载文件的大小

  6. readfile($filename);                                                                               //将内容读出并直接下载
  7. ?>
复制代码



回复

使用道具 举报

8

主题

135

帖子

3270

积分

超级月卡

Rank: 7Rank: 7Rank: 7

积分
3270
 楼主| 发表于 2020-9-19 10:54:19 | 显示全部楼层
本帖最后由 why 于 2020-9-19 11:08 编辑

数组
  • array_change_key_case — 将数组中的所有键名修改为全大写或小写
  • array_chunk — 将一个数组分割成多个
  • array_column — 返回数组中指定的一列
  • array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
  • array_count_values — 统计数组中所有的值
  • array_diff_assoc — 带索引检查计算数组的差集
  • array_diff_key — 使用键名比较计算数组的差集
  • array_diff_uassoc — 用用户提供的回调函数做索引检查来计算数组的差集
  • array_diff_ukey — 用回调函数对键名比较计算数组的差集
  • array_diff — 计算数组的差集
  • array_fill_keys — 使用指定的键和值填充数组
  • array_fill — 用给定的值填充数组
  • array_filter — 用回调函数过滤数组中的单元
  • array_flip — 交换数组中的键和值
  • array_intersect_assoc — 带索引检查计算数组的交集
  • array_intersect_key — 使用键名比较计算数组的交集
  • array_intersect_uassoc — 带索引检查计算数组的交集,用回调函数比较索引
  • array_intersect_ukey — 用回调函数比较键名来计算数组的交集
  • array_intersect — 计算数组的交集
  • array_key_exists — 检查数组里是否有指定的键名或索引
  • array_key_first — 获取指定数组的第一个键值
  • array_key_last — 获取一个数组的最后一个键值
  • array_keys — 返回数组中部分的或所有的键名
  • array_map — 为数组的每个元素应用回调函数
  • array_merge_recursive — 递归地合并一个或多个数组
  • array_merge — 合并一个或多个数组
  • array_multisort — 对多个数组或多维数组进行排序
  • array_pad — 以指定长度将一个值填充进数组
  • array_pop — 弹出数组最后一个单元(出栈)
  • array_product — 计算数组中所有值的乘积
  • array_push — 将一个或多个单元压入数组的末尾(入栈)
  • array_rand — 从数组中随机取出一个或多个单元
  • array_reduce — 用回调函数迭代地将数组简化为单一的值
  • array_replace_recursive — 使用传递的数组递归替换第一个数组的元素
  • array_replace — 使用传递的数组替换第一个数组的元素
  • array_reverse — 返回单元顺序相反的数组
  • array_search — 在数组中搜索给定的值,如果成功则返回首个相应的键名
  • array_shift — 将数组开头的单元移出数组
  • array_slice — 从数组中取出一段
  • array_splice — 去掉数组中的某一部分并用其它值取代
  • array_sum — 对数组中所有值求和
  • array_udiff_assoc — 带索引检查计算数组的差集,用回调函数比较数据
  • array_udiff_uassoc — 带索引检查计算数组的差集,用回调函数比较数据和索引
  • array_udiff — 用回调函数比较数据来计算数组的差集
  • array_uintersect_assoc — 带索引检查计算数组的交集,用回调函数比较数据
  • array_uintersect_uassoc — 带索引检查计算数组的交集,用单独的回调函数比较数据和索引
  • array_uintersect — 计算数组的交集,用回调函数比较数据
  • array_unique — 移除数组中重复的值
  • array_unshift — 在数组开头插入一个或多个单元
  • array_values — 返回数组中所有的值
  • array_walk_recursive — 对数组中的每个成员递归地应用用户函数
  • array_walk — 使用用户自定义函数对数组中的每个元素做回调处理
  • array — 新建一个数组
  • arsort — 对数组进行逆向排序并保持索引关系
  • asort — 对数组进行排序并保持索引关系
  • compact — 建立一个数组,包括变量名和它们的值
  • count — 计算数组中的单元数目,或对象中的属性个数
  • current — 返回数组中的当前单元
  • each — 返回数组中当前的键/值对并将数组指针向前移动一步
  • end — 将数组的内部指针指向最后一个单元
  • extract — 从数组中将变量导入到当前的符号表
  • in_array — 检查数组中是否存在某个值
  • key_exists — 别名 array_key_exists
  • key — 从关联数组中取得键名
  • krsort — 对数组按照键名逆向排序
  • ksort — 对数组按照键名排序
  • list — 把数组中的值赋给一组变量
  • natcasesort — 用“自然排序”算法对数组进行不区分大小写字母的排序
  • natsort — 用“自然排序”算法对数组排序
  • next — 将数组中的内部指针向前移动一位
  • pos — current 的别名
  • prev — 将数组的内部指针倒回一位
  • range — 根据范围创建数组,包含指定的元素
  • reset — 将数组的内部指针指向第一个单元
  • rsort — 对数组逆向排序
  • shuffle — 打乱数组
  • sizeof — count 的别名
  • sort — 对数组排序
  • uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
  • uksort — 使用用户自定义的比较函数对数组中的键名进行排序
  • usort — 使用用户自定义的比较函数对数组中的值进行排序
字符串 函数
  • addcslashes — 以 C 语言风格使用反斜线转义字符串中的字符
  • addslashes — 使用反斜线引用字符串
  • bin2hex — 函数把包含数据的二进制字符串转换为十六进制值
  • chop — rtrim 的别名
  • chr — 返回指定的字符
  • chunk_split — 将字符串分割成小块
  • convert_cyr_string — 将字符由一种 Cyrillic 字符转换成另一种
  • convert_uudecode — 解码一个 uuencode 编码的字符串
  • convert_uuencode — 使用 uuencode 编码一个字符串
  • count_chars — 返回字符串所用字符的信息
  • crc32 — 计算一个字符串的 crc32 多项式
  • crypt — 单向字符串散列
  • echo — 输出一个或多个字符串
  • explode — 使用一个字符串分割另一个字符串
  • fprintf — 将格式化后的字符串写入到流
  • get_html_translation_table — 返回使用 htmlspecialchars 和 htmlentities 后的转换表
  • hebrev — 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew)
  • hebrevc — 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew),并且转换换行符
  • hex2bin — 转换十六进制字符串为二进制字符串
  • html_entity_decode — Convert HTML entities to their corresponding characters
  • htmlentities — 将字符转换为 HTML 转义字符
  • htmlspecialchars_decode — 将特殊的 HTML 实体转换回普通字符
  • htmlspecialchars — 将特殊字符转换为 HTML 实体
  • implode — 将一个一维数组的值转化为字符串
  • join — 别名 implode
  • lcfirst — 使一个字符串的第一个字符小写
  • levenshtein — 计算两个字符串之间的编辑距离
  • localeconv — Get numeric formatting information
  • ltrim — 删除字符串开头的空白字符(或其他字符)
  • md5_file — 计算指定文件的 MD5 散列值
  • md5 — 计算字符串的 MD5 散列值
  • metaphone — Calculate the metaphone key of a string
  • money_format — 将数字格式化成货币字符串
  • nl_langinfo — Query language and locale information
  • nl2br — 在字符串所有新行之前插入 HTML 换行标记
  • number_format — 以千位分隔符方式格式化一个数字
  • ord — 转换字符串第一个字节为 0-255 之间的值
  • parse_str — 将字符串解析成多个变量
  • print — 输出字符串
  • printf — 输出格式化字符串
  • quoted_printable_decode — 将 quoted-printable 字符串转换为 8-bit 字符串
  • quoted_printable_encode — 将 8-bit 字符串转换成 quoted-printable 字符串
  • quotemeta — 转义元字符集
  • rtrim — 删除字符串末端的空白字符(或者其他字符)
  • setlocale — 设置地区信息
  • sha1_file — 计算文件的 sha1 散列值
  • sha1 — 计算字符串的 sha1 散列值
  • similar_text — 计算两个字符串的相似度
  • soundex — Calculate the soundex key of a string
  • sprintf — Return a formatted string
  • sscanf — 根据指定格式解析输入的字符
  • str_getcsv — 解析 CSV 字符串为一个数组
  • str_ireplace — str_replace 的忽略大小写版本
  • str_pad — 使用另一个字符串填充字符串为指定长度
  • str_repeat — 重复一个字符串
  • str_replace — 子字符串替换
  • str_rot13 — 对字符串执行 ROT13 转换
  • str_shuffle — 随机打乱一个字符串
  • str_split — 将字符串转换为数组
  • str_word_count — 返回字符串中单词的使用情况
  • strcasecmp — 二进制安全比较字符串(不区分大小写)
  • strchr — 别名 strstr
  • strcmp — 二进制安全字符串比较
  • strcoll — 基于区域设置的字符串比较
  • strcspn — 获取不匹配遮罩的起始子字符串的长度
  • strip_tags — 从字符串中去除 HTML 和 PHP 标记
  • stripcslashes — 反引用一个使用 addcslashes 转义的字符串
  • stripos — 查找字符串首次出现的位置(不区分大小写)
  • stripslashes — 反引用一个引用字符串
  • stristr — strstr 函数的忽略大小写版本
  • strlen — 获取字符串长度
  • strnatcasecmp — 使用“自然顺序”算法比较字符串(不区分大小写)
  • strnatcmp — 使用自然排序算法比较字符串
  • strncasecmp — 二进制安全比较字符串开头的若干个字符(不区分大小写)
  • strncmp — 二进制安全比较字符串开头的若干个字符
  • strpbrk — 在字符串中查找一组字符的任何一个字符
  • strpos — 查找字符串首次出现的位置
  • strrchr — 查找指定字符在字符串中的最后一次出现
  • strrev — 反转字符串
  • strripos — 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
  • strrpos — 计算指定字符串在目标字符串中最后一次出现的位置
  • strspn — 计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度。
  • strstr — 查找字符串的首次出现
  • strtok — 标记分割字符串
  • strtolower — 将字符串转化为小写
  • strtoupper — 将字符串转化为大写
  • strtr — 转换指定字符
  • substr_compare — 二进制安全比较字符串(从偏移位置比较指定长度)
  • substr_count — 计算字串出现的次数
  • substr_replace — 替换字符串的子串
  • substr — 返回字符串的子串
  • trim — 去除字符串首尾处的空白字符(或者其他字符)
  • ucfirst — 将字符串的首字母转换为大写
  • ucwords — 将字符串中每个单词的首字母转换为大写
  • vfprintf — 将格式化字符串写入流
  • vprintf — 输出格式化字符串
  • vsprintf — 返回格式化字符串
  • wordwrap — 打断字符串为指定数量的字串


类/对象

目录函数
  • chdir — 改变目录
  • chroot — 改变根目录
  • closedir — 关闭目录句柄
  • dir — 返回一个 Directory 类实例
  • getcwd — 取得当前工作目录
  • opendir — 打开目录句柄
  • readdir — 从目录句柄中读取条目
  • rewinddir — 倒回目录句柄
  • scandir — 列出指定路径中的文件和目录

Directory — Directory 类

错误处理 函数

程序执行函数
  • escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数
  • escapeshellcmd — shell 元字符转义
  • exec — 执行一个外部程序
  • passthru — 执行外部程序并且显示原始输出
  • proc_close — 关闭由 proc_open 打开的进程并且返回进程退出码
  • proc_get_status — 获取由 proc_open 函数打开的进程的信息
  • proc_nice — 修改当前进程的优先级
  • proc_open — 执行一个命令,并且打开用来输入/输出的文件指针。
  • proc_terminate — 杀除由 proc_open 打开的进程
  • shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
  • system — 执行外部程序,并且显示输出


文件系统函数
  • basename — 返回路径中的文件名部分
  • chgrp — 改变文件所属的组
  • chmod — 改变文件模式
  • chown — 改变文件的所有者
  • clearstatcache — 清除文件状态缓存
  • copy — 拷贝文件
  • delete — 参见 unlink 或 unset
  • dirname — 返回路径中的目录部分
  • disk_free_space — 返回目录中的可用空间
  • disk_total_space — 返回一个目录的磁盘总大小
  • diskfreespace — disk_free_space 的别名
  • fclose — 关闭一个已打开的文件指针
  • feof — 测试文件指针是否到了文件结束的位置
  • fflush — 将缓冲内容输出到文件
  • fgetc — 从文件指针中读取字符
  • fgetcsv — 从文件指针中读入一行并解析 CSV 字段
  • fgets — 从文件指针中读取一行
  • fgetss — 从文件指针中读取一行并过滤掉 HTML 标记
  • file_exists — 检查文件或目录是否存在
  • file_get_contents — 将整个文件读入一个字符串
  • file_put_contents — 将一个字符串写入文件
  • file — 把整个文件读入一个数组中
  • fileatime — 取得文件的上次访问时间
  • filectime — 取得文件的 inode 修改时间
  • filegroup — 取得文件的组
  • fileinode — 取得文件的 inode
  • filemtime — 取得文件修改时间
  • fileowner — 取得文件的所有者
  • fileperms — 取得文件的权限
  • filesize — 取得文件大小
  • filetype — 取得文件类型
  • flock — 轻便的咨询文件锁定
  • fnmatch — 用模式匹配文件名
  • fopen — 打开文件或者 URL
  • fpassthru — 输出文件指针处的所有剩余数据
  • fputcsv — 将行格式化为 CSV 并写入文件指针
  • fputs — fwrite 的别名
  • fread — 读取文件(可安全用于二进制文件)
  • fscanf — 从文件中格式化输入
  • fseek — 在文件指针中定位
  • fstat — 通过已打开的文件指针取得文件信息
  • ftell — 返回文件指针读/写的位置
  • ftruncate — 将文件截断到给定的长度
  • fwrite — 写入文件(可安全用于二进制文件)
  • glob — 寻找与模式匹配的文件路径
  • is_dir — 判断给定文件名是否是一个目录
  • is_executable — 判断给定文件名是否可执行
  • is_file — 判断给定文件名是否为一个正常的文件
  • is_link — 判断给定文件名是否为一个符号连接
  • is_readable — 判断给定文件名是否可读
  • is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
  • is_writable — 判断给定的文件名是否可写
  • is_writeable — is_writable 的别名
  • lchgrp — 修改符号链接的所有组
  • lchown — 修改符号链接的所有者
  • link — 建立一个硬连接
  • linkinfo — 获取一个连接的信息
  • lstat — 给出一个文件或符号连接的信息
  • mkdir — 新建目录
  • move_uploaded_file — 将上传的文件移动到新位置
  • parse_ini_file — 解析一个配置文件
  • parse_ini_string — 解析配置字符串
  • pathinfo — 返回文件路径的信息
  • pclose — 关闭进程文件指针
  • popen — 打开进程文件指针
  • readfile — 输出文件
  • readlink — 返回符号连接指向的目标
  • realpath_cache_get — 获取真实目录缓存的详情
  • realpath_cache_size — 获取真实路径缓冲区的大小
  • realpath — 返回规范化的绝对路径名
  • rename — 重命名一个文件或目录
  • rewind — 倒回文件指针的位置
  • rmdir — 删除目录
  • set_file_buffer — stream_set_write_buffer 的别名
  • stat — 给出文件的信息
  • symlink — 建立符号连接
  • tempnam — 建立一个具有唯一文件名的文件
  • tmpfile — 建立一个临时文件
  • touch — 设定文件的访问和修改时间
  • umask — 改变当前的 umask
  • unlink — 删除文件

过滤器函数
  • filter_has_var — 检测是否存在指定类型的变量
  • filter_id — 返回与某个特定名称的过滤器相关联的id
  • filter_input_array — 获取一系列外部变量,并且可以通过过滤器处理它们
  • filter_input — 通过名称获取特定的外部变量,并且可以通过过滤器处理它
  • filter_list — 返回所支持的过滤器列表
  • filter_var_array — 获取多个变量并且过滤它们
  • filter_var — 使用特定的过滤器过滤一个变量

函数处理 函数

Hash 函数
  • hash_algos — 返回已注册的哈希算法列表
  • hash_copy — 拷贝哈希运算上下文
  • hash_equals — 可防止时序攻击的字符串比较
  • hash_file — 使用给定文件的内容生成哈希值
  • hash_final — 结束增量哈希,并且返回摘要结果
  • hash_hkdf — Generate a HKDF key derivation of a supplied key input
  • hash_hmac_algos — Return a list of registered hashing algorithms suitable for hash_hmac
  • hash_hmac_file — 使用 HMAC 方法和给定文件的内容生成带密钥的哈希值
  • hash_hmac — 使用 HMAC 方法生成带有密钥的哈希值
  • hash_init — 初始化增量哈希运算上下文
  • hash_pbkdf2 — 生成所提供密码的 PBKDF2 密钥导出
  • hash_update_file — 从文件向活跃的哈希运算上下文中填充数据
  • hash_update_stream — 从打开的流向活跃的哈希运算上下文中填充数据
  • hash_update — 向活跃的哈希运算上下文中填充数据
  • hash — 生成哈希值 (消息摘要)

PHP 选项/信息 函数

网络 函数

Output Control 函数
  • flush — 刷新输出缓冲
  • ob_clean — 清空(擦掉)输出缓冲区
  • ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
  • ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
  • ob_flush — 冲刷出(送出)输出缓冲区中的内容
  • ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
  • ob_get_contents — 返回输出缓冲区的内容
  • ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
  • ob_get_length — 返回输出缓冲区内容的长度
  • ob_get_level — 返回输出缓冲机制的嵌套级别
  • ob_get_status — 得到所有输出缓冲区的状态
  • ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
  • ob_implicit_flush — 打开/关闭绝对刷送
  • ob_list_handlers — 列出所有使用中的输出处理程序。
  • ob_start — 打开输出控制缓冲
  • output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
  • output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)

图像处理
回复

使用道具 举报

8

主题

135

帖子

3270

积分

超级月卡

Rank: 7Rank: 7Rank: 7

积分
3270
 楼主| 发表于 2020-9-20 14:02:53 | 显示全部楼层
第12章 MySQL数据库概述
创建数据库
create database[IF NOT EXISTS]bookstore;   //创建一个名为bookstore的数据库
drop database [IF NOT EXISTS]bookstore;    //删除一个名为bookstore的数据库
show database;                                          //显示所有已建立的数据库名称列表
use bookstore;                                           //打开bookstore数据库为当前数据库使用
创建数据表
create table book (
id int not null auto_increment,
bookname varchar(50) not null default '',
publisher varchar(80) not null default '',
author varchar(30) not null default '',
price double not null default 0.00,
detail text,
publishdata date,
primary key(id),
index book_bookname(bookname),
index book_price(price)
);

desc book;                                                //查看数据表详细结构


drop table book;                                   //删除数据表

向MySQL数据表插入行记录(insert)
insert into book(bookname,publisher,auto,price)values('细说PHP','电子工业出版社','高罗峰',89.00);
insert into book(bookname,publisher,author,price)values('细说PHP','电子工业出版社','高罗峰',89.00);


从MySQL数据表中查询数据记录(select)
select id,bookname,publisher,author,price from book;


更改MySQL数据表中存在的记录(update)
update book set price=79 where id=2;              //id为2的数据price修改为79


删除MySQL数据表中的记录(delete)
delete from book where id=1;                        //删除id为1的数据



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

135

帖子

3270

积分

超级月卡

Rank: 7Rank: 7Rank: 7

积分
3270
 楼主| 发表于 2020-9-20 23:20:50 | 显示全部楼层
本帖最后由 why 于 2020-9-21 12:20 编辑

第13章 MySQL数据表设计
数据表是数据库中的基本对象元素,以记录(行)和字段(列)组成的二维结构用于存储数据.
数据表由表结构和表内容两部分组成,先建立表结构,然后才能输入数据
数据表结构设计主要包括字段名称,字段类型和字段属性的设置
数据字段属性:
unsigned:该属性只能用于设置数值类型,不允许数据列出现负数
zerofill:该属性也只能用于设置数值类型,在数值之前(左端)自动用0补齐不足的位数
auto_increment:该属性用于设置字段的自动增量属性,当数值类型的字段设置为自动增量时,每增加一条新记录,该字段的值就自动增加1,且此字段不允许重复
NULL和not NULL:默认为NULL,即插入值时没有在此字段插入值,如果指定了not NULL,则必须在插入值时在此字段填入值
default:可以通过此属性来指定一个默认的值,如果没有在此列添加值,那么默认添加这个默认值作为值


创建一个用于存储用户信息表users
create table users (
id int(10) unsigned not NULL auto_increment,
username varchar(50) not NULL,
userpass varchar(50) not NULL,
telno varchar(20) not NULL,
sex enum('男','女')not NULL default '男',
brithday date not NULL default '2000-01-01',           //'2000-01-01'这里在5.7版本的MySQL中值不能为0
primary key(id),
index user_username(username,userpass)
)ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
//ENGINE=MYISAM设置默认表类型为MYISAM
//CHARSET=utf8设置字符集为utf8,因为表里出现了中文
//COLLATE utf8_general_ci校对规则
//书上用的<>写的语句,但是在5.7版本的MySQL中这样写不行,换成()就可以了


desc命令查询结果:



为指定的数据表添加一个新字段,语法格式如下所示:
alter table 表名 add 字段名(建表语句)[first|after列名];     //在某列之前|之后添加一个新字符

为上表条件一个Email字段:
alter table users add email varchar(30) not null;

在第一列前面添加一个真实姓名(name)的新列,列类型为字符串,属性设置为非空
alter table users add name varchar(30) not null first;
在原有字段userpass之后添加一个身高(height)的新列,类型为double,属性为非空并设置默认值为0.00
alter table users add height double not null default '0.00' after userpass;

删除表的一个字段
alter table cats drop pid;

为指定的数据表更改原有字段的类型,可使用change或modify语句.如果原列的名字和新列的名字相同,则change和modify的作用相同
alter table change(modify)列名(建表语句)
将user表中的电话号码字段telNo类型varchar(20)更改为数值类型int,并将默认值设置为0
alter table users modify telno int unsigned default '0';

再用change将字段telNo类型int型修改回varchar(20)类型
alter table users change telno(原字段名) phone(新字段名) varchar(20)(类型);       //change修改类型的时候需要连原字段名一起修改


为指定的数据表重新命名:
alter table 旧表名 rename as 新表名
为users重新命名为userss:
alter table uerss rename as userss;


当某个数据表不再需要时,可以使用drop table语句删除,语法如下:
drop table [if exists]表名
[if exists]当不能确定数据表是否存在,如果存在就删除它,不存在则在删除时也不希望出现错误,添加[if exists]语句后如果表不存在,脚本也会向下继续执行而不会抛出错误

创建一个新表的时候,可以通过engine或type选项决定数据表类型

主键索引(primary key)是关系数据库中最常见的额索引类型,主要作用是确定数据表里一条特定的数据记录的位置.数据表会根据主键的唯一性来唯一标识每条记录,任意两条记录里的主键字段不允许是同样的内容.一个表只能指定一个主键,且主键的值不能为空
分别创建两个数据表,并为每个表的id指定主键:
CREATE TABLE cats(
    ->    cid int not NULL auto_increment primary key,
    ->    catname varchar(15)not NULL
    ->    );



CREATE TABLE books(
    ->    bid int(10) unsigned not null auto_increment,
    ->    cid mediumint(8) not null,
    ->    bookname varchar(50) not null,
    ->    price double not null,
    ->    detail text not null,
    ->    primary key(bid)
    ->    );




唯一索引(unique)与主键索引一样,都可以防止创建重复的值.不同之处在于,每个数据表只能有一个主键索引,但可以有多个唯一索引,如果能确定某个数据列将只包含彼此不相同的值,在位这个数据创建索引时就应该使用关键字unique把它定义为一个唯一索引.这样在有新记录插入时,就会自动检查新记录的这个字段的值,是否已经存在某个现有记录的这个字段里出现过,如果是,MySQL将拒绝插入这条新记录,唯一索引的目的往往只是为了避免数据出现重复

常规索引(index)是关系数据查询中最重要的技术,如果要提升数据库的性能,索引优化是首先应该考虑的,因为它能使我们的数据库得到最大性能方面的提升.如果没有索引的数据表,就没有排序的数据集合,要查询数据,就需要全表扫描.有索引的表是一个在索引列上排序了的数据表,可以通过索引快速定位记录.在myisam数据表中数据行保存在数据文件中,索引保存在索引文件中
创建表carts时,随表一同为uid和bid创建一个名为ind的索引,如下:
CREATE TABLE carts(
   cid int(10) not null auto_increment,
   uid int(10) not null,
   bid int(10) not null,
   num int(10) not null,
   primary key(cid),
   key ind(uid,bid)           //创建一个名为ind的常规索引,key通常是index的同义词
   );


如果未给出索引名ind,系统会根据第一个索引列的名称自动选一个(一般使用"表名_列表"为索引命名).如果在创建表时没有创建索引,就需要使用create index命令来创建同样的常规索引,如下所示:
create index ind on carts(uid,bid);                     //创建名称为in对的索引为carts表的两个列
创建索引后,可以通过show index from carts命令为表carst生成一份索引的清单,

show index from carts;                                   //索引生成命令也能查看索引情况

还可以使用drop index ind on carts命令删除索引



全文索引(fulltext)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

135

帖子

3270

积分

超级月卡

Rank: 7Rank: 7Rank: 7

积分
3270
 楼主| 发表于 2020-9-21 12:36:17 | 显示全部楼层
本帖最后由 why 于 2020-9-21 19:07 编辑

第14章 sql语句设计
sql的数据操纵语言(dml)提供了增(insert),删(delete),改(update)语句.这三个命令如果执行成功,都会对数据表中的内容产生影响
插入数据是向已经存在的数据表中添加一条新的记录,应使用insert into语句,语法格式如下:
  insert into 表名[(字段名1,字段名2...字段名n)]values('值1','值2'...'值n');
为cats表(编号id,父类编号pid,类别名称catname,类别描述catdesn)插入一条新记录,给出4个全部字段
cats表如下:
  1. mysql> desc cats;
  2. +---------+-------------+------+-----+---------+----------------+
  3. | Field   | Type        | Null | Key | Default | Extra          |
  4. +---------+-------------+------+-----+---------+----------------+
  5. | cid     | int(11)     | NO   | PRI | NULL    | auto_increment |
  6. | catname | varchar(15) | NO   |     | NULL    |                |
  7. +---------+-------------+------+-----+---------+----------------+
  8. 2 rows in set (0.00 sec)
复制代码

先给cats表新增pid,修改cid为id,添加类别描述catdesn字段
alter table cats add  pid varchar(30) not null first;              //新增pid在最前边
alter table cats change cid id varchar(20);                         //修改cid为id
alter table cats add catdesn varchar(80) not null;               //新增catdesn字段
  1. mysql> desc cats;
  2. +---------+-------------+------+-----+---------+-------+
  3. | Field   | Type        | Null | Key | Default | Extra |
  4. +---------+-------------+------+-----+---------+-------+
  5. | pid     | varchar(30) | NO   |     | NULL    |       |
  6. | id      | varchar(20) | NO   | PRI | NULL    |       |
  7. | catname | varchar(15) | NO   |     | NULL    |       |
  8. | catdesn | varchar(80) | NO   |     | NULL    |       |
  9. +---------+-------------+------+-----+---------+-------+
  10. 4 rows in set (0.00 sec)
复制代码


insert into cats values('1','0','计算机','存放和计算机相关的 图书');   //添加数据
  1. mysql> select * from cats;
  2. +-----+----+-----------+-----------------------------------+
  3. | pid | id | catname   | catdesn                           |
  4. +-----+----+-----------+-----------------------------------+
  5. | 1   | 0  | 计算机    | 存放和计算机相关的图书            |
  6. +-----+----+-----------+-----------------------------------+
  7. 1 row in set (0.00 sec)
复制代码



alter table cats modify id varchar(20) first;            //修改字段排序
alter table cats modify id int auto_increment;        //修改字段自动增长
  1. mysql> desc cats;
  2. +---------+-------------+------+-----+---------+----------------+
  3. | Field   | Type        | Null | Key | Default | Extra          |
  4. +---------+-------------+------+-----+---------+----------------+
  5. | id      | int(11)     | NO   | PRI | NULL    | auto_increment |
  6. | pid     | varchar(30) | NO   |     | NULL    |                |
  7. | catname | varchar(15) | NO   |     | NULL    |                |
  8. | catdesn | varchar(80) | NO   |     | NULL    |                |
  9. +---------+-------------+------+-----+---------+----------------+
  10. 4 rows in set (0.00 sec)
复制代码



向cats表中插入一条新记录,给出3个字段
insert into cats(pid,catname,catdesn) values('0','英语类','存放和英语相关的图书');
  1. mysql> select * from cats;
  2. +----+-----+-----------+-----------------------------------+
  3. | id | pid | catname   | catdesn                           |
  4. +----+-----+-----------+-----------------------------------+
  5. |  2 | 1   | 计算机    | 存放和计算机相关的图书            |
  6. |  3 | 0   | 英语类    | 存放和英语相关的图书              |
  7. +----+-----+-----------+-----------------------------------+
  8. 2 rows in set (0.00 sec)
复制代码

这条语句没有给出id的值,因为上边把id设置为自动增长了


sql语句可以使用update语句对表中的一列或多列数据进行修改,必须指定需要修改的字段,并且需要赋予的新值.还要给出必要的where子句指定要更新的数据行.语法格式如下:
update 表名                                 //需要给出被修改的表名
set 字段名=表达式[, ......]             //可以对表中的一列或多列数据进行修改
[where条件]                                //给出必要的where子名指定要更新的数据行
[order by 字段]                           //按照被指定的顺序对行进行更新
[limit 行数]                                 //限制可以被更新的行的数目
其中的where子句是必须的,如果不使用where检索条件,则update语句会将数据表中的全部数据行都修改.如果指定了ordey by子句,则按照被指定的顺序对行进行更新.limit子句用于给定一个限值,限制可以被更新的行的数目
新建图书信息表:
CREATE TABLE books(
   bookid int(10) not null auto_increment,
   catid int(10) not null,
   bookname varchar(10) not null,
   publisher varchar(10) not null,
   author varchar(10) not null,
   price int(10) not null,
   detail varchar(20) not null,
   primary key(bookid),                                                                                #主键索引
   key ind(catid,bookid)                                                                                #唯一索引         
   )engine=myisam default charset=utf8 collate utf8_general_ci;                     #指定数据可以类型myisam,字符集utf8,校对规则utf8_general_ci
  1. mysql> desc books;
  2. +-----------+-------------+------+-----+---------+----------------+
  3. | Field     | Type        | Null | Key | Default | Extra          |
  4. +-----------+-------------+------+-----+---------+----------------+
  5. | bookid    | int(10)     | NO   | PRI | NULL    | auto_increment |
  6. | catid     | int(10)     | NO   | MUL | NULL    |                |
  7. | bookname  | varchar(10) | NO   |     | NULL    |                |
  8. | publisher | varchar(10) | NO   |     | NULL    |                |
  9. | author    | varchar(10) | NO   |     | NULL    |                |
  10. | price     | double      | NO   |     | NULL    |                |
  11. | detail    | varchar(20) | NO   |     | NULL    |                |
  12. +-----------+-------------+------+-----+---------+----------------+
  13. 7 rows in set (0.00 sec)
复制代码


新增3条数据:
insert into books(catid,bookname,publisher,author,price,detail) values('1','php','电子工业出版社','高某某','80.00','与PHP相关的书');
insert into books(catid,bookname,publisher,author,price,detail) values('1','mysql','邮电出版社','洛某某','30.00','与MySQL相关的书');
insert into books(catid,bookname,publisher,author,price,detail) values('1','Linux','电子工业出版社','峰某某','60.00','与Linux相关的书');

  1. mysql> select * from books;
  2. +--------+-------+----------+-----------------------+-----------+-------+----------------------+
  3. | bookid | catid | bookname | publisher             | author    | price | detail               |
  4. +--------+-------+----------+-----------------------+-----------+-------+----------------------+
  5. |      1 |     1 | php      | 电子工业出版社        | 高某某    |    80 | 与PHP相关的书        |
  6. |      2 |     1 | mysql    | 邮电出版社            | 洛某某    |    30 | 与MySQL相关的书      |
  7. |      3 |     1 | Linux    | 电子工业出版社        | 峰某某    |    60 | 与Linux相关的书      |
  8. +--------+-------+----------+-----------------------+-----------+-------+----------------------+
  9. 3 rows in set (0.00 sec)
复制代码


将表books中图书id为2的记录价格price字段的值由原来的30修改为24.55元
update books set price='24.55' where bookid='2';
  1. mysql> select * from books;
  2. +--------+-------+----------+-----------------------+-----------+-------+----------------------+
  3. | bookid | catid | bookname | publisher             | author    | price | detail               |
  4. +--------+-------+----------+-----------------------+-----------+-------+----------------------+
  5. |      1 |     1 | php      | 电子工业出版社        | 高某某    |    80 | 与PHP相关的书        |
  6. |      2 |     1 | mysql    | 邮电出版社            | 洛某某    | 24.55 | 与MySQL相关的书      |
  7. |      3 |     1 | Linux    | 电子工业出版社        | 峰某某    |    60 | 与Linux相关的书      |
  8. +--------+-------+----------+-----------------------+-----------+-------+----------------------+
  9. 3 rows in set (0.00 sec)
复制代码



修改表books中图书id为3的多个字段
update books set catid=1, bookname='redhat linux', author='高某某', price='50.25' where bookid='3';
  1. mysql> select * from books;
  2. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  3. | bookid | catid | bookname     | publisher             | author    | price | detail               |
  4. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  5. |      1 |     1 | php          | 电子工业出版社        | 高某某    |    80 | 与PHP相关的书        |
  6. |      2 |     1 | mysql        | 邮电出版社            | 洛某某    | 24.55 | 与MySQL相关的书      |
  7. |      3 |     1 | redhat linux | 电子工业出版社        | 高某某    | 50.25 | 与Linux相关的书      |
  8. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  9. 3 rows in set (0.00 sec)
复制代码


update也可以同时修改一整列内容,比如对catid为1的所有图书打八折处理:
update books set price=price*0.8 where catid='1';
  1. mysql> select * from books;
  2. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  3. | bookid | catid | bookname     | publisher             | author    | price | detail               |
  4. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  5. |      1 |     1 | php          | 电子工业出版社        | 高某某    |    64 | 与PHP相关的书        |
  6. |      2 |     1 | mysql        | 邮电出版社            | 洛某某    | 19.64 | 与MySQL相关的书      |
  7. |      3 |     1 | redhat linux | 电子工业出版社        | 高某某    |  40.2 | 与Linux相关的书      |
  8. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  9. 3 rows in set (0.00 sec)
复制代码


将最小录入的5本图书放到其他类别中去,可以使用order by和limit两个子句完成配合,使用order by子句将所有图书按bookid编号倒序排列,将最新插入的记录放在最前面,再使用limit子句限制5条记录修改:
update books set catid='3' order by bookid desc limit 5;

delete语句用来删除数据表中的一条或多条数据记录,语法如下:
delete from 表名                     //删除表中记录行的delete语法格式
[where 条件]                          //给出必要的where子名指定要删除的数据行
[order by 字段]                       //按照被指定的顺序对行进行删除
[limit 行数]                             //限制可以被删除的行的数目

删除表books中id为2的记录:
delete from books where bookid='2';
  1. mysql> select * from books;
  2. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  3. | bookid | catid | bookname     | publisher             | author    | price | detail               |
  4. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  5. |      1 |     3 | php          | 电子工业出版社        | 高某某    |    64 | 与PHP相关的书        |
  6. |      3 |     3 | redhat linux | 电子工业出版社        | 高某某    |  40.2 | 与Linux相关的书      |
  7. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  8. 2 rows in set (0.00 sec)
复制代码


使用as为字段取别名
select bookname as '图书名称',author as '图书作者',price as '图书价格' from books;
  1. select bookname as '图书名称',author as '图书作者',price as '图书价格' from books;
  2. +--------------+--------------+--------------+
  3. | 图书名称     | 图书作者     | 图书价格     |
  4. +--------------+--------------+--------------+
  5. | php          | 高某某       |           64 |
  6. | redhat linux | 高某某       |         40.2 |
  7. +--------------+--------------+--------------+
  8. 2 rows in set (0.00 sec)
复制代码

在有多个表关联查询的情况下,如果表中有同名的字段,则必须使用别名加以区分

distinct取消重复的数据:
select distinct catid from books;
  1. mysql> select * from books;
  2. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  3. | bookid | catid | bookname     | publisher             | author    | price | detail               |
  4. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  5. |      1 |     3 | php          | 电子工业出版社        | 高某某    |    64 | 与PHP相关的书        |
  6. |      3 |     3 | redhat linux | 电子工业出版社        | 高某某    |  40.2 | 与Linux相关的书      |
  7. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  8. 2 rows in set (0.00 sec)

  9. mysql> select distinct catid from books;
  10. +-------+
  11. | catid |
  12. +-------+
  13. |     3 |
  14. +-------+
  15. 1 row in set (0.00 sec)
复制代码

两条结果只显示一条记录

在select语句中使用sql函数和表达式的计算 select version(),1.23*10;执行后将返回两列结果:version()返回MySQL版本信息,1.23*10返回计算得到的结果
  1. mysql> select version(),1.23*10;
  2. +-----------+---------+
  3. | version() | 1.23*10 |
  4. +-----------+---------+
  5. | 5.7.26    |   12.30 |
  6. +-----------+---------+
  7. 1 row in set (0.32 sec)
复制代码


为防止PHP和sql语言在使用中混淆,可以使用附加字段名来解决这个问题
select version() as mysql_version,1.23*10 as expression;
  1. mysql> select version() as mysql_version,1.23*10 as expression;
  2. +---------------+------------+
  3. | mysql_version | expression |
  4. +---------------+------------+
  5. | 5.7.26        |      12.30 |
  6. +---------------+------------+
  7. 1 row in set (0.00 sec)
复制代码


查询每本图书的价格,和打8折后的价格进行对比
select bookname '图书名',price '原价',price*0.8 '打折价' from books;
  1. mysql> select bookname '图书名',price '原价',price*0.8 '打折价' from books;
  2. +--------------+--------+--------------------+
  3. | 图书名       | 原价   | 打折价             |
  4. +--------------+--------+--------------------+
  5. | php          |     64 |               51.2 |
  6. | redhat linux |   40.2 | 32.160000000000004 |
  7. +--------------+--------+--------------------+
  8. 2 rows in set (0.00 sec)
复制代码


在图书信息表books中,检索出计算机类别(类别id为3),并且价格在50元以下的图书
select bookname,price from books where catid='3'and price <='50';             //当catid等于3,且price<=50条件成立执行输出结果
  1. mysql> select bookname,price from books where catid='3'and price <='50';
  2. +--------------+-------+
  3. | bookname     | price |
  4. +--------------+-------+
  5. | redhat linux |  40.2 |
  6. +--------------+-------+
  7. 1 row in set (0.21 sec)
复制代码


如果要检索NULL值,必须使用is null和is not null关键字,如在表books中,查找所有图书介绍不为空的图书信息
select * from books where detail is not null;
  1. mysql> select * from books where detail is not null;
  2. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  3. | bookid | catid | bookname     | publisher             | author    | price | detail               |
  4. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  5. |      1 |     3 | php          | 电子工业出版社        | 高某某    |    64 | 与PHP相关的书        |
  6. |      3 |     3 | redhat linux | 电子工业出版社        | 高某某    |  40.2 | 与Linux相关的书      |
  7. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  8. 2 rows in set (0.21 sec)
复制代码


查询图书价格在30元到80元之间的所有图书信息:
select bookname, price from books where price between '30.00' and '80.00';          //between表示在30和80之间,包括30和80
  1. mysql> select bookname, price from books where price between '30.00' and '80.00';
  2. +--------------+-------+
  3. | bookname     | price |
  4. +--------------+-------+
  5. | php          |    64 |
  6. | Linux        |    60 |
  7. | redhat linux |  40.2 |
  8. | mysql        |  57.5 |
  9. +--------------+-------+
  10. 4 rows in set (0.03 sec)
复制代码

上边的语句也等于如下写法:
select bookname, price from books where price>='30.00' and price<='80.00';      //30<=price<=80
  1. mysql> select bookname, price from books where price>='30.00' and price<='80.00';
  2. +--------------+-------+
  3. | bookname     | price |
  4. +--------------+-------+
  5. | php          |    64 |
  6. | Linux        |    60 |
  7. | redhat linux |  40.2 |
  8. | mysql        |  57.5 |
  9. +--------------+-------+
  10. 4 rows in set (0.00 sec)
复制代码


查询图书类别id为1,5,8的图书:
select bookname,price from books where catid='1' or catid='5' or catid='8';          //用or连接条件,任意一条成立都输出结果
  1. mysql> select bookname,price from books where catid='1' or catid='5' or catid='8';
  2. +----------+-------+
  3. | bookname | price |
  4. +----------+-------+
  5. | Linux    |    60 |
  6. | mysql    |  57.5 |
  7. +----------+-------+
  8. 2 rows in set (0.00 sec)
复制代码

上边的语句也等于如下的写法:
mysql> select bookname, price from books where catid in('1','5','8');               //catid等于括号内任意一个值都输出结果
  1. mysql> select bookname, price from books where catid in('1','5','8');
  2. +----------+-------+
  3. | bookname | price |
  4. +----------+-------+
  5. | Linux    |    60 |
  6. | mysql    |  57.5 |
  7. +----------+-------+
  8. 2 rows in set (0.21 sec)
复制代码


使用not in查询不包括列表中任何值的结果
select bookname, price from books where catid not in('1','5','8');  
mysql>  select bookname, price from books where catid not in('1','5','8');
+--------------+-------+
| bookname     | price |
+--------------+-------+
| php          |    64 |
| redhat linux |  40.2 |
+--------------+-------+
2 rows in set (0.00 sec)

使用like关键字对数据表中的记录进行模糊查询,将查询结果锁定在一个范围内
查询表books中图书名称包含Linux字符串的所有图书记录:
select bookname,author,price from books where bookname like '%linux%';                 //%通配符:表示0个或任意多个字符,字符串Linux的两边都可以匹配或者不匹配任意多个字符
  1. mysql> select bookname,author,price from books where bookname like '%linux%';
  2. +--------------+-----------+-------+
  3. | bookname     | author    | price |
  4. +--------------+-----------+-------+
  5. | Linux        | 峰某某    |    60 |
  6. | redhat linux | 高某某    |  40.2 |
  7. +--------------+-----------+-------+
  8. 2 rows in set (0.00 sec)
复制代码


查询不包含Linux的所有图书记录:
select bookname,author,price from books where bookname not like '%linux%';
  1. mysql> select bookname,author,price from books where bookname not like '%linux%';
  2. +----------+-----------+-------+
  3. | bookname | author    | price |
  4. +----------+-----------+-------+
  5. | php      | 高某某    |    64 |
  6. | mysql    | 洛某某    |  57.5 |
  7. +----------+-----------+-------+
  8. 2 rows in set (0.00 sec)
复制代码


如果不记得作者的名字,可以使用一个下划线作为通配符进行模糊查询:
select bookname,author,price from books where author like '_某某';           //使用下划线模糊匹配任意一个单一字符
  1. mysql> select bookname,author,price from books where author like '_某某';
  2. +--------------+-----------+-------+
  3. | bookname     | author    | price |
  4. +--------------+-----------+-------+
  5. | php          | 高某某    |    64 |
  6. | Linux        | 峰某某    |    60 |
  7. | redhat linux | 高某某    |  40.2 |
  8. | mysql        | 洛某某    |  57.5 |
  9. +--------------+-----------+-------+
  10. 4 rows in set (0.00 sec)
复制代码


如果使用精确查找,尽量不要使用like进行模糊查询,应该直接使用"="的功能:
select bookname,author,price from books where author='高某某';              //使用"="进行精确查询
  1. mysql> select bookname,author,price from books where author='高某某';
  2. +--------------+-----------+-------+
  3. | bookname     | author    | price |
  4. +--------------+-----------+-------+
  5. | php          | 高某某    |    64 |
  6. | redhat linux | 高某某    |  40.2 |
  7. +--------------+-----------+-------+
  8. 2 rows in set (0.00 sec)
复制代码



同时查询以下两张表的数据:
  1. mysql> select * from books;
  2. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  3. | bookid | catid | bookname     | publisher             | author    | price | detail               |
  4. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  5. |      1 |     3 | php          | 电子工业出版社        | 高某某    |    64 | 与PHP相关的书        |
  6. |      4 |     1 | Linux        | 电子工业出版社        | 峰某某    |    60 | 与Linux相关的书      |
  7. |      3 |     3 | redhat linux | 电子工业出版社        | 高某某    |  40.2 | 与Linux相关的书      |
  8. |      5 |     1 | mysql        | 邮电出版社            | 洛某某    |  57.5 | 与MySQL相关的书      |
  9. +--------+-------+--------------+-----------------------+-----------+-------+----------------------+
  10. 4 rows in set (0.00 sec)

  11. mysql> select * from cats;
  12. +----+-----+-----------+-----------------------------------+
  13. | id | pid | catname   | catdesn                           |
  14. +----+-----+-----------+-----------------------------------+
  15. |  2 | 1   | 计算机    | 存放和计算机相关的图书            |
  16. |  3 | 0   | 英语类    | 存放和英语相关的图书              |
  17. +----+-----+-----------+-----------------------------------+
  18. 2 rows in set (0.00 sec)
复制代码


select
    c.catname '图书类别',b.bookname '书名',b.price '价格'              //使用表名.列名实现多表同时查询
    from
    cats c,books b;                                                                     //cats表设置别名为c,books表设置别名为b
  1. mysql> select
  2.     -> c.catname '图书类别',b.bookname '书名',b.price '价格'
  3.     -> from
  4.     -> cats c,books b;
  5. +--------------+--------------+--------+
  6. | 图书类别     | 书名         | 价格   |
  7. +--------------+--------------+--------+
  8. | 计算机       | php          |     64 |
  9. | 英语类       | php          |     64 |
  10. | 计算机       | Linux        |     60 |
  11. | 英语类       | Linux        |     60 |
  12. | 计算机       | redhat linux |   40.2 |
  13. | 英语类       | redhat linux |   40.2 |
  14. | 计算机       | mysql        |   57.5 |
  15. | 英语类       | mysql        |   57.5 |
  16. +--------------+--------------+--------+
  17. 8 rows in set (0.26 sec)
复制代码


使用where子句给出查询的连接条件:
select
    c.catname '图书类别',b.bookname '书名',b.price '价格'            
    from
    cats c,books b                                                                     
    where c.id=b.catid;                                                          //当cats.id=books.catid时输出结果
  1. mysql> select
  2.     ->     c.catname '图书类别',b.bookname '书名',b.price '价格'
  3.     ->     from
  4.     ->     cats c,books b
  5.     ->     where c.id=b.catid;
  6. +--------------+--------------+--------+
  7. | 图书类别     | 书名         | 价格   |
  8. +--------------+--------------+--------+
  9. | 英语类       | php          |     64 |
  10. | 英语类       | redhat linux |   40.2 |
  11. +--------------+--------------+--------+
  12. 2 rows in set (0.00 sec)
复制代码

     

使用order by对查询结果进行排序
对bookid进行降序排列:
select bookid,bookname,price from books order by bookid desc;
  1. mysql> select bookid,bookname,price from books order by bookid desc;
  2. +--------+--------------+-------+
  3. | bookid | bookname     | price |
  4. +--------+--------------+-------+
  5. |      5 | mysql        |  57.5 |
  6. |      4 | Linux        |    60 |
  7. |      3 | redhat linux |  40.2 |
  8. |      1 | php          |    64 |
  9. +--------+--------------+-------+
  10. 4 rows in set (0.21 sec)
复制代码


对bookid进行升序排列:
select bookid,bookname,price from books order by bookid asc;
  1. mysql> select bookid,bookname,price from books order by bookid asc;
  2. +--------+--------------+-------+
  3. | bookid | bookname     | price |
  4. +--------+--------------+-------+
  5. |      1 | php          |    64 |
  6. |      3 | redhat linux |  40.2 |
  7. |      4 | Linux        |    60 |
  8. |      5 | mysql        |  57.5 |
  9. +--------+--------------+-------+
  10. 4 rows in set (0.00 sec)
复制代码


使用limit限定结果行数
select bookid,bookname,price from books order by bookid desc limit 0,3;             //对bookid使用倒序从记录的偏移量0处开始返回3行数据
  1. mysql> select bookid,bookname,price from books order by bookid desc limit 0,3;
  2. +--------+--------------+-------+
  3. | bookid | bookname     | price |
  4. +--------+--------------+-------+
  5. |      5 | mysql        |  57.5 |
  6. |      4 | Linux        |    60 |
  7. |      3 | redhat linux |  40.2 |
  8. +--------+--------------+-------+
  9. 3 rows in set (0.00 sec)
复制代码


统计函数使用语法:
select 函数名(列名1 或*),  ......函数名(列名n) from 表名                     

返回在图书表books中找到的全部记录行数:
select count(*) '记录行数' from books;
  1. mysql> select count(*) '记录行数' from books;
  2. +--------------+
  3. | 记录行数     |
  4. +--------------+
  5. |            4 |
  6. +--------------+
  7. 1 row in set (0.00 sec)
复制代码


返回图书信息表books中最高价格,最低价格,平均价格及总价格:
select
    max(price) '最高图书价格',min(price)'最低图书价格',
    avg(price) '平均图书价格',sum(price)'总价格'
    from books;
  1. mysql> select
  2.     ->     max(price) '最高图书价格',min(price)'最低图书价格',
  3.     ->     avg(price) '平均图书价格',sum(price)'总价格'
  4.     ->     from books;
  5. +--------------------+--------------------+--------------------+-----------+
  6. | 最高图书价格       | 最低图书价格       | 平均图书价格       | 总价格    |
  7. +--------------------+--------------------+--------------------+-----------+
  8. |                 64 |               40.2 |             55.425 |     221.7 |
  9. +--------------------+--------------------+--------------------+-----------+
  10. 1 row in set (0.21 sec)
复制代码


查询图书类别为1的所有图书的最高价格,最低价格,平均价格及总价格:
select
    max(price) '最高图书价格',min(price)'最低图书价格',
    avg(price) '平均图书价格',sum(price)'总价格'
    from books
    where catid=1;
  1. mysql> select
  2.     ->     max(price) '最高图书价格',min(price)'最低图书价格',
  3.     ->     avg(price) '平均图书价格',sum(price)'总价格'
  4.     ->     from books
  5.     ->     where catid=1;
  6. +--------------------+--------------------+--------------------+-----------+
  7. | 最高图书价格       | 最低图书价格       | 平均图书价格       | 总价格    |
  8. +--------------------+--------------------+--------------------+-----------+
  9. |                 60 |               57.5 |              58.75 |     117.5 |
  10. +--------------------+--------------------+--------------------+-----------+
  11. 1 row in set (0.00 sec)
复制代码


使用group by对查询结果分组
select avg(price) '平均图书价格',sum(price) '总价格' from books group by catid;     //以catid相同的进行分组
  1. mysql> select avg(price) '平均图书价格',sum(price) '总价格' from books group by catid;
  2. +--------------------+-----------+
  3. | 平均图书价格       | 总价格    |
  4. +--------------------+-----------+
  5. |              58.75 |     117.5 |
  6. |               52.1 |     104.2 |
  7. +--------------------+-----------+
  8. 2 rows in set (0.00 sec)
复制代码


筛选出图书平均价格大于55的图书:
select avg(price) '平均图书价格',sum(price) '总价格' from books group by catid having avg(price)>55.00;
  1. mysql> select avg(price) '平均图书价格',sum(price) '总价格' from books group by catid having avg(price)>55.00;
  2. +--------------------+-----------+
  3. | 平均图书价格       | 总价格    |
  4. +--------------------+-----------+
  5. |              58.75 |     117.5 |
  6. +--------------------+-----------+
  7. 1 row in set (0.00 sec)
复制代码
回复

使用道具 举报

8

主题

135

帖子

3270

积分

超级月卡

Rank: 7Rank: 7Rank: 7

积分
3270
 楼主| 发表于 2020-9-21 22:39:15 | 显示全部楼层
本帖最后由 why 于 2020-9-22 11:54 编辑

第15章 PHP访问MySQL的扩展函数
在PHP中可以将sql语句划分为两种情况去操作:
一种是由返回结果集的dql语句
另一种则是在执行后没有结果集的
这一章主要讲的PHP老版本所以我们切换到PHP5来研究
测试数据库是否可以连接
  1. <?PHP
  2. $link=MySQL_connect('localhost','root','root');
  3. if(!$link){
  4.         die('连接失败:'.MySQL_error());
  5. }
  6.         echo  "连接成功!";
  7. ?>
复制代码


查看当前连接的相关信息:
  1. <?PHP
  2. $link=MySQL_connect('localhost','root','root');
  3. if(!$link){
  4.         die('连接失败:'.MySQL_error());
  5. }
  6.         echo  "连接成功!";
  7.         
  8.         echo MySQL_get_client_info();       //客户端api函数库的版本信息
  9.         echo MySQL_get_host_info();         //与MySQL服务器的连接类型
  10.     echo MySQL_get_proto_info();        //通信协议版本信息
  11.     echo MySQL_get_server_info();       //MySQL服务器的版本信息
  12.     //echo MySQL_get_client_encoding();   //客户端使用的默认字符集,这个函数不能用
  13.     echo MySQL_stat();                  //MySQL服务器的当前工作状态

  14.     MySQL_close($link);                 //关闭与MySQL服务器建立的连接        
  15. ?>
复制代码

输出结果:
连接成功!5.0.51alocalhost via TCP/IP105.7.26Uptime: 2100 Threads: 1 Questions: 22 Slow queries: 0 Opens: 110 Flush tables: 1 Open tables: 16 Queries per second avg: 0.010

设置默认数据库
  1. <?PHP
  2. $link=MySQL_connect('localhost','root','root');
  3. if(!$link){
  4.         die('连接失败:'.MySQL_error());
  5. }
  6.         echo  "连接成功!";
  7. //为后续的MySQL扩展函数的操作选定一个默认的数据库,它相当于sql命令的use bookstore
  8. MySQL_select_db('bookstore',$link)or die('不能选定数据库 bookstore:'.MySQL_error());
  9. ?>
复制代码


创建books数据表:
  1. create table books (
  2. id int not null auto_increment,
  3. bookname varchar(80) not null default '',
  4. publisher varchar(60) not null default '',
  5. author varchar(60) not null default '',
  6. price double(5,2) not null default 0.00,
  7. ptime int not null default 0,
  8. pic char(24) not null default '',
  9. detail text,
  10. primary key(id),
  11. index book_bookname(bookname),
  12. index book_publisher(publisher),
  13. index book_price(price)
  14. )ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
复制代码
  1. mysql> desc books;
  2. +-----------+-------------+------+-----+---------+----------------+
  3. | Field     | Type        | Null | Key | Default | Extra          |
  4. +-----------+-------------+------+-----+---------+----------------+
  5. | id        | int(11)     | NO   | PRI | NULL    | auto_increment |
  6. | bookname  | varchar(80) | NO   | MUL |         |                |
  7. | publisher | varchar(60) | NO   | MUL |         |                |
  8. | author    | varchar(60) | NO   |     |         |                |
  9. | price     | double(5,2) | NO   | MUL | 0.00    |                |
  10. | ptime     | int(11)     | NO   |     | 0       |                |
  11. | pic       | char(24)    | NO   |     |         |                |
  12. | detail    | text        | YES  |     | NULL    |                |
  13. +-----------+-------------+------+-----+---------+----------------+
  14. 8 rows in set (0.01 sec)
复制代码


用PHP向数据库写入数据:
  1. <?PHP
  2. $link=MySQL_connect('localhost','root','root');
  3. if(!$link){
  4.         die('连接失败:'.MySQL_error());
  5. }
  6.         echo  "连接成功!";

  7. //不加以下两行数据库会出现乱码        
  8. mysql_query("set character set 'utf8'");//读库
  9. mysql_query("set names 'utf8'");//写库

  10. //为后续的MySQL扩展函数的操作选定一个默认的数据库,它相当于sql命令的use bookstore
  11. MySQL_select_db('bookstore',$link)or die('不能选定数据库 bookstore:'.MySQL_error());

  12. //将插入的3条insert语句声明为一个字符串
  13. $insert="insert into books(bookname,publisher,author,price,detail)values
  14.         ('PHP','电子工业','高某某','80.00','与PHP相关的图书'),
  15.                 ('jsp','人们邮电','洛某某','50.00','与jsp相关的图书'),
  16.                 ('asp','电子工业','峰某某','30.00','与asp相关的图书')";

  17. //使用MySQL_query()函数发送insert语句,如果成功返回true,失败则返回false
  18. $result=MySQL_query($insert);
  19. if($result&&MySQL_affected_rows()>0){
  20.         echo "数据记录插入成功,最后一条插入的数据记录ID为:".MySQL_insert_id()."<br>";
  21. }else{
  22.         echo "插入记录失败,错误号:".MySQL_errno().",错误原因:".MySQL_error()."<br>";
  23. }

  24. //执行update命令修改books中的一条记录,将图书名为PHP的记录价格修改为79.99元
  25. $result1=MySQL_query("update books set price='79.99' where bookname='PHP'");
  26. if($result1&&MySQL_affected_rows()>0){
  27.         echo "数据记录修改成功<br>";
  28. }else{
  29.         echo "修改数据失败,错误号:".MySQL_errno().",错误原因:".MySQL_error()."<br>";
  30. }

  31. //执行delete命令上传表books中图书名为jsp的记录
  32. $result2=MySQL_query("delete from books where bookname='jsp'");
  33. if($result2&&MySQL_affected_rows()>0){
  34.         echo "数据记录删除成功<br>";
  35. }else{
  36.         echo "删除数据失败,错误号:".MySQL_errno().",错误原因:".MySQL_error()."<br>";
  37. }

  38. MySQL_close($link);                 //关闭与MySQL服务器建立的连接
  39. ?>
复制代码

执行结果:
连接成功!数据记录插入成功,最后一条插入的数据记录ID为:1
数据记录修改成功
数据记录删除成功
数据库显示情况:
  1. mysql> select * from books;
  2. +----+----------+--------------+-----------+-------+-------+-----+-----------------------+
  3. | id | bookname | publisher    | author    | price | ptime | pic | detail                |
  4. +----+----------+--------------+-----------+-------+-------+-----+-----------------------+
  5. |  1 | PHP      | 电子工业     | 高某某    | 79.99 |     0 |     | 与PHP相关的图书       |
  6. |  3 | asp      | 电子工业     | 峰某某    | 30.00 |     0 |     | 与asp相关的图书       |
  7. +----+----------+--------------+-----------+-------+-------+-----+-----------------------+
  8. 2 rows in set (0.00 sec)
复制代码



在PHP中执行select查询命令,也是调用MySQL_query()函数,但和执行dml不同的是,执行select命令之后,MySQL_query()函数的返回值是一个PHP资源的引用指针(结果集).这个返回值可以用在各种结果集处理函数中,对结果数据表的各个字段进行处理.如可以用下面两个函数获得结果数据表的数据行个数和数据列个数:
$result=MySQL_query("select * from books");                    //执行select语句返回结果集资源$result
$rows=MySQL_rows($result);                                           //从结果集中获得数据记录行的个数
$cols=MySQL_fields($result);                                           //从结果集中获得数据记录列的个数
如果需要访问结果数据表中的数据,可以选用以下四个函数中的一个,以一个数据行接着一个数据行的方式检索结果.这4个函数必须传递MySQL_query()函数返回的正确结果资源最为参数,而且每次调用将自动返回下一条结果记录,如果已经达到结果数据表的末尾,则返回false
MySQL_fetch_row():该函数将一条结果记录返回并以一个普通索引数组的形式保存
MySQL_fetch_assoc():该函数将一条结果记录返回并以一个普通关联数组的形式保存
MySQL_fetch_array():该函数可以将结果数据表中的每一行获取为一个关联数组或索引数组,或者同时获取为关联和索引数组,可以通过为该函数传递mysql_assoc,MySQL_num,或MySQL_both中的一个常量返回不同的数组形态,默认使用MySQL_both常量将两种数组一起返回
MySQL_fetch_object():该函数将以一个对象的形式返回一条结果记录,它的各个字段需要以对象的方式进行访问
如果没有特殊要求,尽量不要使用MySQL_fetch_array()方法
如果必须提前释放某次查询的结果数据表,就可以使用MySQL_free_result()函数提前释放它
  1. <?PHP
  2. $link=MySQL_connect('localhost','root','root');
  3. if(!$link){
  4.         die('连接失败:'.MySQL_error());
  5. }

  6. //不加以下两行数据库会出现乱码        
  7. mysql_query("set character set 'utf8'");//读库
  8. mysql_query("set names 'utf8'");//写库

  9. //为后续的MySQL扩展函数的操作选定一个默认的数据库,它相当于sql命令的use bookstore
  10. MySQL_select_db('bookstore',$link)or die('不能选定数据库 bookstore:'.MySQL_error());

  11. //执行dql命令返回结果集$result
  12. $result=MySQL_query("select id,bookname,author,publisher,price,detail from books");

  13. echo '<table align="center" width="80%" border="1">';        //以HTML表格输出结果
  14. echo '<caption><h1>图书信息表</h1></caption>';               //输出表格表头
  15. echo '<th>编号</th><th>图书名</th><th>作者</th><th>出版社</th><th>价格</th><th>介绍</th>';
  16. while($row=MySQL_fetch_row($result)){                        //循环从结果集变量每条记录到数组中
  17.         echo '<tr>';                                             //每遍历一条记录输出一个行标记
  18.         foreach($row as $data){                                  //循环遍历一条数据记录中的每个字段
  19.                 echo '<td>'.$data.'</td>';                           //以表格形式输出每个字段
  20.         }
  21.         echo '</tr>';                                            //输出每行的结束标记
  22. }
  23. echo '</table>';

  24. MySQL_free_result($result);                                   //释放查询结果集资源
  25. MySQL_close($link);                 //关闭与MySQL服务器建立的连接
  26. ?>
复制代码

输出结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

135

帖子

3270

积分

超级月卡

Rank: 7Rank: 7Rank: 7

积分
3270
 楼主| 发表于 2020-9-22 21:46:09 | 显示全部楼层
本帖最后由 why 于 2020-10-8 20:49 编辑

第16章 数据库抽象曾pdo
先说一下pdo连接数据库报错的问题:
数据库连接失败:could not find driver
首先php.ini开启以下几项
extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_mysql.dll
其次是代码不能出错,再一个主要代码的大小写问题,因为我把代码里边的mysql大写了,导致始终报这个错,搞了几个小时
  1. <?PHP
  2. $dsn='mysql:host=localhost;dbname=bookstore';          //连接mysql数据库dsn
  3. $user='root';                                          //数据库用户名
  4. $password='root';                                      //数据库密码
  5. try{
  6.         $dbh=new PDO($dsn,$user,$password);
  7.     echo '连接成功';                                  //连接成功输出
  8. }catch(pdoexception $e){
  9.         echo '数据库连接失败:'.$e->getmessage();          //失败返回错误
  10. }
  11. ?>
复制代码

输出结果:
连接成功

在创建pdo对象时,把dsn字符串放在另一个本地文件中
新建一个mysql.txt放在PHP脚本同一个目录下,mysql.txt内容如下:
mysql:host=localhost;dbname=bookstore                                    //注意这段内容不能有空白字符尤其注意结尾不能有空格或换行符
  1. <?PHP                                    
  2. try{
  3. //file:///这是读取本地文件的格式,但只能读取绝对地址,这里我们获取到PHP脚本的当前目录组合成一个绝对地址供file:///使用
  4.         $dbh=new PDO('uri:file:///'.dirname(__FILE__).'\mysql.txt','root','root');
  5.     echo '连接成功';                                  //连接成功输出
  6. }catch(pdoexception $e){
  7.         echo '数据库连接失败:'.$e->getmessage();          //失败返回错误
  8. }
  9. ?>
复制代码


从php.ini文件加载dsn信息,php.ini添加如下信息:
[PDO]
pdo.dsn.mysqlpdo="mysql:host=localhost;dbname=bookstore";
  1. <?PHP                                    
  2. try{
  3.         $dbh=new PDO('mysqlpdo','root','root');              
  4.     echo '连接成功';                                                    //连接成功输出
  5. }catch(pdoexception $e){
  6.         echo '数据库连接失败:'.$e->getmessage();          //失败返回错误
  7. }
  8. ?>
复制代码


设置pdo连接的属性:
  1. <?PHP
  2. //设置持久连接的选项作为最后一个参数,可以一起设置多个元素
  3. $opt=array(PDO::ATTR_PERSISTENT=>true);              //把true赋值给数组元素PDO::ATTR_PERSISTENT,PDO::ATTR_PERSISTENT默认为false,表示不持久连接                                    
  4. try{
  5.         $dbh=new PDO('mysqlpdo','root','root',$opt);
  6.     echo '连接成功';                                  //连接成功输出
  7. }catch(pdoexception $e){
  8.         echo '数据库连接失败:'.$e->getmessage();          //失败返回错误
  9. }
  10. ?>
复制代码



getattribute()函数,获取数据库连接对象的一个属性
  1. <?PHP
  2. //设置持久连接的选项作为最后一个参数,可以一起设置多个元素
  3. $opt=array(PDO::ATTR_PERSISTENT=>true);              //把true赋值给数组元素PDO::ATTR_PERSISTENT,PDO::ATTR_PERSISTENT默认为false,表示不持久连接                                    
  4. try{
  5.         $dbh=new PDO('mysqlpdo','root','root',$opt);
  6.     echo '连接成功<br>';                                  //连接成功输出
  7. }catch(pdoexception $e){
  8.         echo '数据库连接失败:'.$e->getmessage();          //失败返回错误
  9.         exit;
  10. }

  11. echo "POD是否关闭自动提交功能:".$dbh->getattribute(PDO::ATTR_AUTOCOMMIT).'<br>';   //$dbh引用PDO::ATTR_AUTOCOMMIT成员,成员中值为false时关闭
  12. echo "\n当前PDO的错误处理的模式:".$dbh->getattribute(PDO::ATTR_ERRMODE).'<br>';      //$dbh引用PDO::ATTR_ERRMODE成员,成员PDO::ATTR_ERRMODE为设置错误处理模式
  13. echo "\n表示段字符的大小写转换:".$dbh->getattribute(PDO::ATTR_CASE).'<br>';      //$dbh引用PDO::ATTR_ERRMODE成员,成员PDO::ATTR_ERRMODE为设置错误处理模式
  14. echo "\n与连接状态相关特有信息:".$dbh->getattribute(PDO::ATTR_CONNECTION_STATUS).'<br>';      //$dbh引用PDO::ATTR_ERRMODE成员,成员PDO::ATTR_CONNECTION_STATUS包含数据库特有的与连接状态有关的信息
  15. echo "\n空字符串转换为SQL的null:".$dbh->getattribute(PDO::ATTR_ORACLE_NULLS).'<br>';      //$dbh引用PDO::ATTR_ORACLE_NULLS成员,成员PDO::ATTR_ORACLE_NULLS将返回的空字符串转换为SQL的null
  16. //echo "\n应用程序提前获取数据大小:".$dbh->getattribute(PDO::ATTR_PERSISTENT).'<br>';      //$dbh引用PDO::ATTR_PREFETCH成员,成员PDO::ATTR_PREFETCH设置应用程序提前获取的数据大小,以k字节位单位,这个参数显示驱动不支持,具体为啥不支持不清楚
  17. echo "\n与数据库特有的服务器信息:".$dbh->getattribute(PDO::ATTR_SERVER_INFO).'<br>';   //$dbh引用PDO::ATTR_AUTOCOMMIT成员,成员PDO::ATTR_AUTOCOMMIT包含与数据库特有的服务器信息
  18. echo "\n数据库服务器版本号信息:".$dbh->getattribute(PDO::ATTR_SERVER_VERSION).'<br>';  //$dbh引用PDO::ATTR_SERVER_VERSION成员,成员PDO::ATTR_SERVER_VERSION包含与数据库服务器版本号有关的信息
  19. echo "\n数据库客户端版本号信息:".$dbh->getattribute(PDO::ATTR_CLIENT_VERSION).'<br>';  //$dbh引用PDO::ATTR_CLIENT_VERSION成员,成员PDO::ATTR_CLIENT_VERSION包含与数据库客户端版本号有关的信息
  20. ?>
复制代码

输出结果:
  1. 连接成功
  2. POD是否关闭自动提交功能:1
  3. 当前PDO的错误处理的模式:0
  4. 表示段字符的大小写转换:0
  5. 与连接状态相关特有信息:localhost via TCP/IP
  6. 空字符串转换为SQL的null:0
  7. 与数据库特有的服务器信息:Uptime: 2070 Threads: 1 Questions: 29 Slow queries: 0 Opens: 110 Flush tables: 1 Open tables: 16 Queries per second avg: 0.014
  8. 数据库服务器版本号信息:5.7.26
  9. 数据库客户端版本号信息:5.0.51a
复制代码


setattribute()函数需要两个参数,第一个参数提供pdo对象特定的属性名,第二个参数则是为这个指定的属性赋一个值,如:
$dbh->getattribute(PDO::ATTR_ERRMODE,PDO::ATTR_ERRMODE_EXCEPTION);       //设置抛出异常处理错误

pdo在某种程度上是对类型不可知的,因此它喜欢将任何数据都表示为字符串,而不是将其转换为整数或双精度类型

pdo一共提供了三种不同的错误处理模式,不仅可以满足不同风格的编程,也可以调整扩展处理错误的方式
PDO::ERRMODE_SILENT:这是默认模式,在错误发生时不进行任何操作,PDO将只设置错误代码,可以通过PDO对象中的errorcode()和errorinfo()方法对语句和数据库对象进行检查
PDO::ERRMODE_WARNING:除了设置错误代码以外,PDO还将发出一条PHP传统的E_WARNING消息,可以使用常规PHP错误处理程序捕获该警告,该模式的设置如下:
$dbh->setattribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);              //设置警告模式处理错误报告
PDO::ERRMODE_EXCEPTION:除了设置错误代码以外,PDO还将抛出一个PDOException,并设置其属性,以反映错误代码和错误信息.这种设置在调用中也很有用,因为它会放大脚本中产生错误的地方,从而可以非常快速地指出代码中有问题的潜在区域.该模式的设置方法如下:
$dbh->setattribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);           //设置抛出异常模式处理错误



使用PDO执行sql语句
先用PHP创建contactinfo表,并写入数据:
  1. <?PHP
  2. $link=mysql_connect('localhost','root','root');
  3. if(!$link){
  4.         die('连接失败:'.mysql_error());
  5. }else{
  6.         if(mysql_select_db('testdb',$link)===false){              //为后续的MySQL扩展函数的操作选定一个默认的数据库,它相当于sql命令的use testdb,如果失败创建数据库     
  7.                         if(mysql_query("CREATE DATABASE testdb",$link)){
  8.                 mysql_select_db('testdb',$link);
  9.                         }
  10.         }
  11. }

  12. //不加以下两行数据库会出现乱码        
  13. mysql_query("set character set 'utf8'");//读库
  14. mysql_query("set names 'utf8'");//写库

  15. // 使用 sql 创建数据表,把部门id设为唯一索引,防止数据重复插入
  16. $result=mysql_fetch_row(mysql_query("show tables like 'contactinfo'"));    //查询contactinfo表是否存在
  17. if(empty($result)!==false){                                                //如果表contactinfo不存在,则创建表
  18.         mysql_query("CREATE TABLE contactinfo (                            #创建表contact
  19.         uid mediumint(8) unsigned not null auto_increment,        #联系人ID
  20.         name varchar(50) not null,                                #姓名
  21.         departmentid char(3) not null unique,                     #部门编号
  22.         address varchar(80)  not null,                            #联系地址
  23.         phone varchar (20),                                       #联系电话
  24.         email varchar (100),                                      #联系人电子邮件
  25.         PRIMARY KEY(uid)                                          #设置用户id为主键
  26.         )ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE utf8_general_ci");
  27.   }
  28.                                                            

  29.         
  30.   
  31. //插入的5条insert语句声明为一个字符串
  32.                 $insert="insert into contactinfo(name,departmentid,address,phone,email)values
  33.                  ('高某某','D01','海淀区','15801688338','gmm@51kakawo.com'),
  34.                  ('洛某某','D02','朝阳区','15801681234','lmm@51kakawo.com'),
  35.                          ('峰某某','D03','东城区','15801689876','fmm@51kakawo.com'),
  36.                  ('王某某','D04','西城区','15801681357','wmm@51kakawo.com'),
  37.                          ('陈某某','D05','昌平区','15801682468','cmm@51kakawo.com')";
  38.                          //使用MySQL_query()函数发送insert语句,如果成功返回true,失败则返回false
  39.                  $result=MySQL_query($insert);
  40.                  if($result&&MySQL_affected_rows()>0){
  41.                  echo "数据记录插入成功,最后一条插入的数据记录ID为:".MySQL_insert_id()."<br>";
  42.                  }else{
  43.                  echo "插入记录失败,错误号:".MySQL_errno().",错误原因:".MySQL_error()."<br>";
  44.                  }  
  45.   
  46. MySQL_close($link);                 //关闭与MySQL服务器建立的连接
  47. ?>
复制代码

浏览器输出结果:
数据记录插入成功,最后一条插入的数据记录ID为:1
MySQL输出结果:
mysql> select * from contactinfo;
+-----+-----------+--------------+-----------+-------------+------------------+
| uid | name      | departmentid | address   | phone       | email            |
+-----+-----------+--------------+-----------+-------------+------------------+
|   1 | 高某某    | D01          | 海淀区    | 15801688338 | gmm@51kakawo.com |
|   2 | 洛某某    | D02          | 朝阳区    | 15801681234 | lmm@51kakawo.com |
|   3 | 峰某某    | D03          | 东城区    | 15801689876 | fmm@51kakawo.com |
|   4 | 王某某    | D04          | 西城区    | 15801681357 | wmm@51kakawo.com |
|   5 | 陈某某    | D05          | 昌平区    | 15801682468 | cmm@51kakawo.com |
+-----+-----------+--------------+-----------+-------------+------------------+
5 rows in set (0.00 sec)
如果刷新页面就会出错,因为departmentid被设为了唯一索引,不允许重复出现

使用pdo::exec()方法
当执行insert,update和delete等没有结果集的查询时,使用pdo对象中的exec()方法去执行.该方法成功执行后,将返回受影响的行数.注意该方法不能用于select查询:
<?PHP
try{
        $dbh=new pdo('mysql:dbname=testdb;host=localhost','root','root');
}catch(pdoexception $e){
        echo '数据库连接失败:'.$e->getmessage();
        exit;
}
$query="UPDATE contactinfo SET phone='15801680168' where name='高某某'";
//使用exec()方法可以执行insert,update,delete等
$affected=$dbh->exec($query);

if($affected){
        echo '数据表contactinfoinfo中受影响的行数为:'.$affected;
}else{
        print_r ($dbh->errorinfo());
}
?>
浏览器返回结果:
Array ( [0] => 00000 )
返回了个错误,MySQL也没有更改成功,但为什么没有更改成功不清楚
在下边的案例中query()方法乱码,我给链接数据库的时候增加了第4个参数,然后这个exec()方法同样也增加了第4个参数,指定以utf8操作数据库,然后这段代码正常了,想了一下应该是update提供的命令在送入数据库后编码格式不一样导致查找不到表里的数据,现在浏览器输出结果如下:
数据表contactinfoinfo中受影响的行数为:1
MySQL输出结果如下:
mysql> select * from contactinfo;
+-----+-----------+--------------+-----------+-------------+------------------+
| uid | name      | departmentid | address   | phone       | email            |
+-----+-----------+--------------+-----------+-------------+------------------+
|   1 | 高某某    | D01          | 海淀区    | 15801680168 | gmm@51kakawo.com |
|   2 | 洛某某    | D02          | 朝阳区    | 15801681234 | lmm@51kakawo.com |
|   3 | 峰某某    | D03          | 东城区    | 15801689876 | fmm@51kakawo.com |
|   4 | 王某某    | D04          | 西城区    | 15801681357 | wmm@51kakawo.com |
|   5 | 陈某某    | D05          | 昌平区    | 15801682468 | cmm@51kakawo.com |
+-----+-----------+--------------+-----------+-------------+------------------+
5 rows in set (0.00 sec)
数据库也操作成功

2.使用pdo::query()方法
当执行返回结果集的select查询时,或者所影响的行数无关紧要时,应当使用pdo对象中的query()方法,如果该方法执行指定的查询,则返回一个pdostatement对象.如果使用了query()方法,并想了解获取的数据总素,可使用pdostatement对象中的rowcount()方法获取:
  1. <?PHP

  2. header('Content-type:text/html; charset=utf-8');
  3.         $dbh=new pdo('mysql:dbname=testdb;host=localhost','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));    //第4个参数指定以uft8格式连接数据库,要不然浏览器返回的数据会乱码
  4.         $dbh->setattribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);   
  5.         $query="select name,phone,email from contactinfo where departmentid='D01'";
  6.         
  7. try{

  8.         //执行select查询,并返回pdostatement对象
  9.         $pdostatement=$dbh->query($query);
  10.         echo "一共从表中获取到".$pdostatement->rowcount()."条记录:\n";
  11.         foreach($pdostatement as $row){
  12.                 echo $row['name']."\t";
  13.                 echo $row['phone']."\t";
  14.                 echo $row['email']."\t";
  15.         }
  16. }catch(pdoexception $e){
  17.         echo $e->getmessage();
  18. }
  19. ?>
复制代码

浏览器返回结果:
一共从表中获取到1条记录: 高某某 15801680168 gmm@51kakawo.com

pdo::prepare()和pdostatement()两个方法,当同一个查询需要多次执行时(有时需要迭代传入不同的值),使用预处理语句的方式来实现效率会更高.使用pdo对象中的prepare()方法去准备一个将要执行的查询,再使用pdostatement对象中的execute()方法来执行
在生成网页时,需要PHP脚本通常都会执行参数以外,其他部分完全相同的查询语句,针对这种重复执行一个查询,每次迭代使用不同的参数情况,pdo提供了一种名为预处理语句(prepare statement)的机制.

重复执行一个sql查询,通过每次迭代使用不同的参数,这种情况使用预处理语句运行效率最高.使用预处理语句,首先需要在数据库服务器中先准备好"一个sql语句",但并不需要马上执行.pdo支持使用"占位符"语法,将变量绑定到这个预处理sql语句中.另外.pdo几乎为所支持的所有数据库提供了命令占位符模拟,甚至可以为生来就不支持该概念的数据库模拟预处理语句和绑定参数

对于一个准备好的sql语句,如果在每次执行时都要改变一些列值,这种情况必须使用"占位符号"而不是具体的列值.或者只要有需要使用变量作为值的地方,就先使用占位符号代替,准备好一个没有传入的sql语句,在数据库服务器的缓存区等待处理,然后再去单独给占位符号具体的值,再通知这个准备好的预处理语句执行.在pdo中有两种使用占位符的语法:"命名参数"和"问号参数",使用那一种语法看个人爱好
使用命名参数最为占位符的insert查询如下所示:
$dbh->prepare("insert into contactinfo(name,address,phone)values(:name,:address,:phone)");
需要自定义一个字符串最为"命名参数",每个命名参数需要冒号(开始,参数的命名一定要有意义,最好和对应的字段名称相同
使用(?)参数作为占位符的insert查询如下所示:
$dbh->prepare("insert into contactinfo(name,address,phone)values(?,?,?)");
问号参数一定要和字段的位置顺序对应.不管使用哪一种参数作为占位符构成的查询,或是语句汇总没有用到的占位符,都需要使用pdo对象中的prepare()方法,去准备这个将要用于迭代执行的查询,并返回pdostatement类对象

当sql语句通过pdo对象总的prepare()方法,在数据库服务器端准备好之后,如果使用了占位符,就需要在每次执行时替换输入的参数.可以通过pdostatement对象中的bindparam()方法,把参数变量绑定到准备好的占位符上(位置或名字要对应),方法bindparam()的原型如下:
bindparam(参数1,参数2,参数3,参数4,参数5)
参数1是必填的,指定占位符语法中使用的名字参数,或者(?)参数的顺序值
参数2也是必填的,提供赋值给第一个参数的指定占位符值
参数3是可选填的,显示地为当前绑定的参数设置数据类型
参数4是可选填的,用于指定数据类型的长度
参数5是可选题的,通过该参数提供任何数据库驱动程序特定的选项
如上例中命名参数的写法如下:
bindparam(':name',$name);           //将变量$name的引用绑定到准备好的查询名字参数":name"中
问号参数的写法如下:
bindparam(1,$name,PDO:: PARAM_STR);        //将变量$name绑定到查询中的第1个问号参数中,并设置当前绑定数据类型为char,varchar和其他类型字符串


将上一节中使用的两种占位符语法准备的sql查询,用bindparam()方法分别绑定上对应的参数,查询中使用名字参数绑定示例如下所示:
  1. <?PHP
  2. try{
  3.         $dbh=new pdo('mysql:dbname=testdb;host=localhost','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
  4. }catch(pdoexception $e){
  5.         echo '数据库连接失败:'.$e->getmessage();
  6.         exit;
  7. }
  8. $query="INSERT INTO contactinfo(name,address,phone)VALUES(:name,:address,:phone)";
  9. $stmt=$dbh->prepare($query);                 //调用pdo对象中的prepare()方法


  10. //第一个参数需要对应占位符号?的顺序
  11. $stmt->bindParam(':name',$name);              //将变量$name的引用绑定到准备好的查询名字参数':name'中
  12. $stmt->bindParam(':address',$address);        //将变量$address的引用绑定到准备好的查询名字参数':address'中
  13. $stmt->bindParam(':phone',$phone);            //将变量$phone的引用绑定到准备好的查询名字参数':phone'中

  14. $name="张某某";                             //声明第一个参数变量mame的值
  15. $address="北京海淀区中关村";                //声明第一个参数变量mame的值
  16. $phone="15801688988";                       //声明第一个参数变量mame的值
  17. ?>
复制代码



查询中使用?参数的绑定示例如下所示:
  1. <?PHP
  2. try{
  3.         $dbh=new pdo('mysql:dbname=testdb;host=localhost','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
  4. }catch(pdoexception $e){
  5.         echo '数据库连接失败:'.$e->getmessage();
  6.         exit;
  7. }
  8. $query="INSERT INTO contactinfo(name,address,phone)VALUES(?,?,?)";
  9. $stmt=$dbh->prepare($query);                 //调用pdo对象中的prepare()方法


  10. //第二个参数需要按引用传递,索引需要变量作为参数
  11. $stmt->bindParam(1,$name,pdo::param_str);              //将变量$name的引用绑定到准备好的查询名字参数':name'中
  12. $stmt->bindParam(2,$address,pdo::param_str);        //将变量$address的引用绑定到准备好的查询名字参数':address'中
  13. $stmt->bindParam(3,$phone,pdo::param_str,20);            //将变量$phone的引用绑定到准备好的查询名字参数':phone'中

  14. $name="张某某";                             //声明第一个参数变量mame的值
  15. $address="北京海淀区中关村";                //声明第一个参数变量mame的值
  16. $phone="15801688988";                       //声明第一个参数变量mame的值
  17. ?>
复制代码


执行准备好的查询
当准备好查询并绑定了相应的参数后,就可以通过调用pdostatement类对象中的execute()方法,反复执行在数据库缓存区准备好的语句了,在下面的示例中,向前面提供的contactinfo表中,使用预处理方式连续执行同一个insert语句,通过改变不同的参数添加两条记录.如下所示
  1. <?PHP
  2. try{
  3.         $dbh=new pdo('mysql:dbname=testdb;host=localhost','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
  4. }catch(pdoexception $e){
  5.         echo '数据库连接失败:'.$e->getmessage();
  6.         exit;
  7. }
  8. $query="INSERT INTO contactinfo(name,address,phone)VALUES(?,?,?)";
  9. $stmt=$dbh->prepare($query);                 //调用pdo对象中的prepare()方法


  10. //第二个参数需要按引用传递,索引需要变量作为参数
  11. $stmt->bindParam(1,$name);              //将变量$name的引用绑定到准备好的查询名字参数':name'中
  12. $stmt->bindParam(2,$address);        //将变量$address的引用绑定到准备好的查询名字参数':address'中
  13. $stmt->bindParam(3,$phone);            //将变量$phone的引用绑定到准备好的查询名字参数':phone'中

  14. $name="赵某某";                             //声明第一个参数变量mame的值
  15. $address="北京海淀区中关村";                //声明第一个参数变量mame的值
  16. $phone="15801688348";                       //声明第一个参数变量mame的值

  17. $stmt->execute();                           //执行参数被绑定值后的准备语句

  18. $name="孙某某";                             //声明第一个参数变量mame的值
  19. $address="宣武区";                          //声明第一个参数变量mame的值
  20. $phone="15801688698";                       //声明第一个参数变量mame的值

  21. $stmt->execute();                           //再次执行参数被绑定值后的准备语句,插入第二天语句
  22. ?>
复制代码

以上代码可以正常执行,但是数据库并没有被插入数据
如果只是要传递输入参数,并且有许多这样的参数要传递,那么你会觉得下面所示的快捷方式语法非常有帮助.是通过在execute()方法中提供一个可选参数,该参数是由准备查询中的命名参数占位符组成的数组,这是第二种为预处理查询在执行中替换输入参数的方式.此语法使你能够省去对$stmt->bindparam()的调用,将上面的示例做如下修改:
  1. <?PHP
  2. try{
  3.         $dbh=new pdo('mysql:dbname=testdb;host=localhost','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
  4. }catch(pdoexception $e){
  5.         echo '数据库连接失败:'.$e->getmessage();
  6.         exit;
  7. }
  8. $query="INSERT INTO contactinfo(name,address,phone)VALUES(:name,:address,:phone)";
  9. $stmt=$dbh->prepare($query);                 //调用pdo对象中的prepare()方法


  10. //传递一个数组为预处理查询中的命名参数绑定值,并执行一次
  11. $stmt->execute(array(":name"=>"赵某某",":address"=>"海淀区",":phone"=>"15801688348"));

  12. //再次传递一个数组为预处理查询中的命名参数绑定值,并执行第二处插入数据
  13. $stmt->execute(array(":name"=>"孙某某",":address"=>"宣武区",":phone"=>"15801688698"));
  14. ?>
复制代码

上例是使用名字参数去准备好一个sql语句,则调用execute()方法时就必须传递一个关联数组,并且这个管关联数组的每个下标名称都要和命名参数名称一一对应(可以不使用名称前缀":"),数组中的值才能对应的替换sql语句中的命名参数.如果使用的是?参数,则需要传递一个索引数组,数组中每个值的位置都要对应每个问号参数.将上面的示例片段做如下修改:
  1. <?PHP
  2. try{
  3.         $dbh=new pdo('mysql:dbname=testdb;host=localhost','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
  4. }catch(pdoexception $e){
  5.         echo '数据库连接失败:'.$e->getmessage();
  6.         exit;
  7. }
  8. $query="INSERT INTO contactinfo(name,address,phone)VALUES(?,?,?)";
  9. $stmt=$dbh->prepare($query);                 //调用pdo对象中的prepare()方法


  10. //传递一个数组为预处理查询中的问号参数绑定值,并执行一次
  11. $stmt->execute(array("赵某某","海淀区","15801688348"));

  12. //再次传递一个数组为预处理查询中的问号参数绑定值,并执行第二处插入数据
  13. $stmt->execute(array("孙某某","宣武区","15801688698"));
  14. ?>
复制代码

另外如果指向的是insert语句,并且数据表有自动增长的id字段,可以使用pdo对象汇总的lastinsertid()方法获取最后插入数据表中的记录id.如果需要查看其他dml语句是否执行成功,可以通过pdostatement类对象中的rowcount()方法获取影响记录的行数

获取数据
pdo的数据获取方法与其他数据库扩展都非常类似,只要成功执行select查询,都会有结果集对象生成,不管是使用pdo对象中的query()方法,还是使用prepare()和execute()等方法结合的预处理语句,执行select查询都会得到相同的结果集对象pdostatement.都需要通过pdostatement类对象中的方法将数据遍历出来,下面介绍pdostatement类中常见的几个获取结果集数据的方法
1.fetch()方法
pdostatement类中的fetch()方法可以将结果集中当前行的记录以某种方式返回,并将结果集指针移至下一行,当到达结果集末尾时返回false.该方法的原型如下:
   fetch([int fetch_style[,int cursor_orientation[,int cursor_offset]]])                 //返回结果集的下一行
第一个参数fetch_style是可选项,获取的一行数据记录中,各列的引用方式取决于这个参数如何设置.可以使用的设置有以下6种.
   pdo::fetch_assoc:从结果集中获取以列名为索引的关联数组
   pdo::fetch_num:从结果集中获取一个以列在杭后中的数值偏移为所以的值数组
   pdo::fetch_both:这是默认值,包含上面两种数组
   pdo::fetch_obj:从结果集当前行的记录中获取其属性对应各个列名的一个对象
   pdo::fetch_bound:使用fetch()返回true,并将获取的列值赋值给在bindparam()方法中指定的相应变量
   pdo::fetch_lazy:创建关联数组和索引数组,以及包含列属性的一个对象,从而可以在这三种接口中任选一种.
第二个参数cursor_orientation是可选项,用来确定当对象时一个可滚动的游标时应当获取那一行
第三个参数cursor_offset也是可选项,需要提供一个整数值,表示要获取的行相对于当前游标位置的偏移
在下面的示例中,使用pdo对象query()方法执行select查询,获取联系人信息表contactinfo中的信息,并返回pdostatement类对象作为结果集.然后就通过fetch()方法结合while循环遍历数据,并以HTML表格的形式输出.代码如下所示:
  1. <?PHP
  2. try{
  3.         $dbh=new pdo('mysql:dbname=testdb;host=localhost','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
  4. }catch(pdoexception $e){
  5.         echo '数据库连接失败:'.$e->getmessage();
  6.         exit;
  7. }
  8. echo '<table border="1" align="center" width=90%>';
  9. echo '<caption><h1>联系人信息表</h1></caption>';
  10. echo '<tr bgcolor="#cccccc">';
  11. echo '<th>UID</th><th>姓名</th><th>联系地址</th><th>联系电话</th><th>电子邮件</th>';

  12. //使用query方式执行select语句,建议使用prepare()和execute()形式执行语句
  13. $stmt=$dbh->query("select uid,name,address,phone,email from contactinfo");                 //调用pdo对象中的prepare()方法

  14. //以pdo::fetch_num式获取索引并遍历
  15. while(list($uid,$name,$address,$phone,$email)=$stmt->fetch(PDO::FETCH_NUM)){               //fetch()参数必须是大写
  16.         echo '<tr>';                     //输出每行的开始标记
  17.         echo '<td>'.$uid.'</td>';        //从结果数组中获取uid
  18.         echo '<td>'.$name.'</td>';       //从结果数组中获取name
  19.         echo '<td>'.$address.'</td>';    //从结果数组中获取address
  20.         echo '<td>'.$phone.'</td>';      //从结果数组中获取phone
  21.         echo '<td>'.$email.'</td>';      //从结果数组中获取email
  22.         echo '</tr>';
  23. }
  24. echo '</table>';                     //输出表格结束标记
  25. ?>
复制代码

HTML输出结果如下:


fetchall()方法
fetchall()方法与上一个方法fetch()类似,但是该方法只需要调用一次就可以获取结果集中的所有行,并赋值给返回的数组(二维).该方法的原型如下:
fetchall([int fetch_style[,int column_index]])          //一次调用返回结果集中所有行
第一个参数fetch_style是可选项,以何种方式引用所获取的列取决于该参数.默认值为PDO::FETCH_BOTH,所有可用的值可以残酷在fetch()方法中介绍的第一个参数的列表,还可以指定PDO::FETCH_COLUMN值,从结果集汇中返回一个包含单列的所有值
第二个参数column_index是可选项,需要提供一个整数索引,当在fetchall()方法的第一个参数中指定PDO::FETCH_COLUMN值时,从结果集中返回通过该参数提供的索引所指定的所有值.fetchall()方法的应用示例如下所示:
  1. <?PHP
  2. try{
  3.         $dbh=new pdo('mysql:dbname=testdb;host=localhost','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
  4. }catch(pdoexception $e){
  5.         echo '数据库连接失败:'.$e->getmessage();
  6.         exit;
  7. }


  8. echo '<table border="1" align="center" width=90%>';
  9. echo '<caption><h1>联系人信息表</h1></caption>';
  10. echo '<tr bgcolor="#cccccc">';
  11. echo '<th>UID</th><th>姓名</th><th>联系地址</th><th>联系电话</th><th>电子邮件</th>';


  12. $stmt=$dbh->prepare("select uid,name,address,phone,email from contactinfo");                 //调用pdo对象中的prepare()方法
  13. $stmt->execute();
  14. $allrows=$stmt->fetchall(PDO::FETCH_ASSOC);


  15. foreach($allrows as $row){                  //遍历获取到的所有行数组$allrows
  16.         echo '<tr>';                            //输出每行的开始标记
  17.         echo '<td>'.$row['uid'].'</td>';        //从结果数组中获取uid
  18.         echo '<td>'.$row['name'].'</td>';       //从结果数组中获取name
  19.         echo '<td>'.$row['address'].'</td>';    //从结果数组中获取address
  20.         echo '<td>'.$row['phone'].'</td>';      //从结果数组中获取phone
  21.         echo '<td>'.$row['email'].'</td>';      //从结果数组中获取email
  22.         echo '</tr>';
  23. }
  24. echo '</table>';                     //输出表格结束标记
  25. //以下是在fetchall()方法中使用两个特别参数的演示示例
  26. $stmt->execute();
  27. $row=$stmt->fetchall(PDO::FETCH_COLUMN,1);
  28. echo '所有联系人的姓名:';
  29. print_r($row);
  30. ?>
复制代码

HTML输出结果如下:

该程序的输出结果和前一个示例相似,只是多输出一个包含所有联系人姓名的数组.在很大程度上是出于方便考虑,选择使用fetchall()方法代替fetch()方法,但使用fetchall()处理特别大的结果时,会给数据库服务器资源和网络带宽带来很大的负担

setfetchmode()方法
pdostatement对象中的fetch()和fetchall()两个方法,获取结果数据的引用方式默认都是一样的,即按列名索引又按列在杭后总的数值偏移(从0开始)索引的数值组,因为它们的默认模式都被设置为PDO::FETCH_BOTH值,如果计划使用其他模式来改变这个默认设置,可以在fetch()或fetchall()方法中提供需要的模式参数.但如果多次使用这两个方法,在每次调用时都需要设置新的模式来改变默认的模式,这时就可以使用pdostatement类对象中的setfetchmode()方法,在脚本页面的顶部设置一次模式,以后所有fetch()和fetchall()方法的调用都将生成相应引用的结果集,减少了多次在调用fetch()方法时的参数录入

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

快速回复 返回顶部 返回列表