• 1. PHP连接MySQL姓 名: 电 话:60889797 Q Q: MAIL :姓 名:马明 电 话:60889797 Q Q:44562586 MAIL :alex0018@126.com
  • 2. PHP与MySQL数据库web数据库架构 建立一个连接 选择数据库 发送 SQL 语句 检索查询结果 关闭数据库连接 错误处理函数 MySQLi扩展库
  • 3. web数据库架构在我们前面使用PHP的过程中,使用了普通文件来存储与检索数据,现在,在已经使用了 MySQL数据库后,我们可以通过基于web的前台来连接该数据库。为了更好地了解PHP与数据库的连接,先简单地介绍数据库架构的工作原理。 如图所示: (步骤说明见下页)浏览器服务器PHP引擎MySQL 数据库123456Web数据库的基本结构
  • 4. 步骤说明: 1. 用户的Web浏览器发出HTTP请求,请求特定Web页面。例如,用户通过HTML表单的形式要求搜索一种商品。 2. Web服务器收到搜索请求,获取该脚本文件,并将它传到PHP引擎,要求它处理。 3. PHP引擎开始解析脚本。脚本中有一条连接数据库的命令,还有执行一个查询(搜索商品)的命令。PHP打开通向MySQL数据库的连接,发送适当的查询。 4. MySQL服务器接受数据库查询并处理。将结果(搜索到的商品)返回到PHP引擎。 5. PHP引擎完成脚本运行,通常这包括将查询结果格式化成HTML格式,然后将输出的HTML返回到web服务器。 6. Web服务器将HTML发送到浏览器。这样用户就能看到搜索的商品数据。
  • 5. 从web查询数据的基本步骤: 在任何用于从Web访问数据库的脚本中,都应该遵循以下这些步骤。 1. 检查并过滤来自用户的数据。 2. 建立一个适当的数据库连接。 3. 查询数据库 4. 获取查询结构 5. 将结果显示给用户。
  • 6. 建立一个连接mysql_connect -- 打开一个到 MySQL 服务器的连接 语法格式: resource mysql_connect ( 主机 , 用户名 , 密码 ) 返回类型: 如果成功则返回一个 MySQL 连接标识,失败则返回 FALSE。 参数说明: MySQL的主机名可同时加端口,如:‘localhost:3306’。还有数据库的用户名与密码。 一旦脚本结束,到服务器的连接就会被关闭。除非之前已经调用了 mysql_close()来关闭它。
  • 7. 实例: ; } else { echo “与本地端Mysql服务器连接失败”; } ?>
  • 8. 选择数据库mysql_select_db -- 选择 MySQL 数据库 语法格式: bool mysql_select_db ( 数据库名[,连接标识符] ) 返回类型: 如果成功则返回 TRUE,失败则返回 FALSE。 说明: 数据库名为用户要操作的数据库,类似于我们通过命令行界面中使用的“SQL>use 数据库名; ”。如果没有指定连接标识符,则使用上一个打开的连接。如果没有打开的连接,本函数将无参数调用 mysql_connect()来尝试打开一个并使用之。
  • 9. 发送 SQL 语句 mysql_query -- 发送一条 MySQL 查询 语法格式: resource mysql_query ( SQL语句[,连接标识符] ) 返回类型: 如果成功则返回执行结果,失败则返回 FALSE。 说明: 此函数只是扮演一种传递的角色,必须使有sql指令才能达到存取的应用。 mysql_query函数可以传递各种sql语法,包含DDL、DML、QUERY。对于SELECT语句执行成功返回一个资源失败返回FALSE,对于INSERT、DELETE、UPDATE语句返回TRUE或FALSE表示是否执行成功。
  • 10. mysql_db_query -- 发送一条 MySQL 查询 语法格式: resource mysql_db_query (数据库名, SQL语句 [,连接标识符] ) 返回类型: 如果成功则返回执行结果,失败则返回 FALSE。 说明: 此函数选择一个数据库并在其上执行SQL语句。与mysql_query函数不同的是有了选择数据库的功能。注意mysql_db_query函数不会切换回先前连接到的数据库。换句话说,不能用此函数临时在另一个数据库上执行 sql 查询,只能手工切换回来。建议用户可在 sql 查询中使用 database.table 语法来替代此函数。
  • 11. 实例:
  • 12. 检索查询结果mysql_fetch_row -- 从结果集中取得一行作为索引数组 语法格式: array mysql_fetch_row ( resource result ) 返回类型: 返回根据结果集提取记录保存在数组中,如果没有获取记录则返回 FALSE。 说明: mysql_fetch_row() 从和指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。 依次调用 mysql_fetch_row() 将返回结果集中的下一行,如果没有更多行则返回 FALSE。
  • 13. 实例: ”; } ?>
  • 14. mysql_fetch_array -- 从结果集中取得一行作为关联数组,或索引数组,或二者兼有 语法格式: array mysql_fetch_array (查询结果指针[,数组储存型态常数]) 返回类型: 返回根据从结果集取得的行生成的数组,如果没有更多行则返回 FALSE。 说明:mysql_fetch_array() 是 mysql_fetch_row()的扩展版本。除了将数据以数字索引方式储存在数组中之外,还可以将数据作为关联索引储存,用字段名作为键名。 数组储存型态常数共有三种: MYSQL_ASSOC: 关联数组 MYSQL_NUM: 索引数组 MYSQL_BOTH: 两者共用 (默认值 )
  • 15. 实例: $value) echo "$name : $value
    "; ?>
  • 16. 取得栏位数与记录数 mysql_num_fields( )与mysql_num_rows( ) 函数可通过资料表传递回来的查询结果指针,来取得其中所有的栏位数与记录数。用法: mysql_num_fields(查询结果指针) 取得结果集中字段的数目。 mysql_num_rows(查询结果指针) 取得结果集中行的数目。
  • 17. mysql_fetch_field --  从结果集中取得列信息并作为对象返回 语法格式: object mysql_fetch_field (查询结果指针,列位置) 返回类型:返回一个包含字段信息的对象。 对象的属性为: name - 列名 table - 该列所在的表名 max_length - 该列最大长度 type - 该列的类型 unsigned - 1,如果该列是无符号数,返回1 等等…… 注: 本函数返回的字段名是区分大小写的。
  • 18. name."
    "; echo "所属表名称: ".$Field_Data->table."
    "; echo “列字段类型: ".$Field_Data->type."
    "; echo “列最大长度: ".$Field_Data->max_length."
    "; ?>
  • 19. mysql_result -- 取得结果集指定记录和字段数据 语法格式: mysql_result(结果集资源,记录行号,[字段名称字符串]) 返回类型: 返回 MySQL 结果集中一行记录的指定字段内容 . mysql_data_seek -- 移动结果集内部指针 语法格式: bool mysql_data_seek (结果集资源, 移动行号) 返回类型: 如果成功则返回 TRUE,失败则返回 FALSE。此函数将指定的结果标识所关联的 MySQL 结果集内部的行指针移动到指定的行号。 行号从 0 开始。行号的取值范围应该从 0 到(mysql_num_rows() – 1)。
  • 20. 关闭数据库连接通过调用如下语句,可以释放结果集 mysql_free_result -- 释放结果内存 格式:bool mysql_free_result ( resource result ) mysql_free_result() 仅需要在考虑到返回很大的结果集时会占用多少内存时调用。在脚本结束后所有关联的内存都会被自动释放。 关闭数据库连接 mysql_close -- 关闭 MySQL 连接 格式:bool mysql_close ( [resource link_identifier] ) mysql_close() 关闭指定的连接标识所关联的到 MySQL 服务器的连接。如果没有指定 link_identifier,则关闭上一个打开的连接。 通常不需要使用 mysql_close(),因为已打开的非持久连接会在脚本执行完毕后自动关闭。
  • 21.
  • 22. 错误处理函数 当mysql操作发生错误时,PHP可以调用内建的错误处理函数,来传回进一步的错误资讯,错误处理函数有: mysql_errno --  返回上一个 MySQL 操作中的错误信息的数字编码 int mysql_errno ( [resource link_identifier] ) mysql_error --  返回上一个 MySQL 操作产生的文本错误信息 string mysql_error ( [resource link_identifier] )
  • 23. 错误处理函数使用范例 ”; //传回错误讯息 ?>
  • 24. 其他数据库处理函数mysql_pconnect --  打开一个到 MySQL 服务器的持久连接 mysql_create_db -- 新建一个 MySQL 数据库 mysql_drop_db -- 删除一个 MySQL 数据库 mysql_fetch_object -- 从结果集中取得一行作为对象 mysql_affected_rows -- 取得前一次 MySQL 操作所影响的记录行数 … …
  • 25. PHP5与MySQLi在PHP5中对于数据库的扩展,重新编写了MySQLi扩展库(i代表改进),与之前的MySQL扩展库在以下方面有了增强: 本地绑定/准备执行的语法支持 游标的支持 SQL语句执行的错误代码 可同时执行多个SQL语句 索引分析 同时提供过程与面向对象的调用接口
  • 26. 面向过程的MySQLimysqli_connect() mysqli_query() mysqli_num_rows() mysqli_fetch_row() mysqli_free_result() mysqli_close() mysqli_error()
  • 27. 改进后面向过程的数据库连接: 0){ while($row=mysqli_fetch_array($result)) //对数据进行逐条输出 { echo $row['sno'].“ "; echo $row['sname'].“ "; echo $row['php'].“ "; echo "
    "; } } mysqli_free_result($result); //释放内存 mysqli_close($mylink); //关闭与数据库的连接 ?>
  • 28. 面向对象的MySQLiclass mysqli 属性: affected_rows insert_id error 方法: query() close() class mysqli_result 属性: num_rows 方法: fetch_array() close() 详细内容请见php参考手册 函数参考 MySQL Improved Extension
  • 29. 改进后面向对象的数据库连接: query($sql)or die($mydbi->error); if($result->num_rows>0){ while($row=$result->fetch_array()) //对数据进行逐条输出 { echo $row['sno'].“ "; echo $row['sname'].“ "; echo $row['php'].“ "; echo "
    "; } } $result->close(); //释放内存 $mydbi->close(); //关闭与数据库的连接 ?>
  • 30. 一次执行多条SQL命令例: $sql="select * from books;select name from books"; $ok=$con->multi_query($sql); if($ok){ do{ $result=$con->store_result(); if($result){ echo $result; $result->close(); } }while($con->next_result()); }
  • 31. 使用prepare接口通常操作一些表,每次只是参数不同,如果访问量很多时,会增加额外的系统开销。因此从MySQL4.1以后,提供了prepare的支持,实现较低的开销及较少的代码来实现任务。 有两种prepare准备语句,分别为绑定参数和绑定结果
  • 32. class mysqli_stmt属性 num_rows affected_rows errno 方法 bind_param() bind_result() execute() store_result() fetch() close()
  • 33. 绑定参数绑定参数的准备语句允许创建一个SQL模版并保存在MySQL服务器上,当我们需要使用时,传入对应的参数即可。 $sql=“insert student values(?,?)” $stmt=$mydbi->prepare($sql); $sno=9; $sname=“alex”; $stmt->bind_param(“is”,$sno,$sname);//绑定参数 //“is”代表对应两个?问号参数的数据类型 $stmt->execute();//执行SQL操作 $stmt->close();
  • 34. bind_param()参数参数i:符合可变的int整型 参数d:符合可变的double双精度 参数s:符合可变的字符串 参数b:符合可变的blob的组合类型
  • 35. 绑定结果绑定结果的准备语句允许将PHP脚本中的变量绑定到所获取的响应字段商,从而可以在结果集中提取数据。 可设置的操作绑定如下: 建立一个查询 准备一个SQL查询 在准备查询中将PHP变量绑定到一个字段 执行一个查询 要求一个新记录,用来在调入数据时进行变量绑定
  • 36. $sql=“select sno,sname from student” $stmt=$mydbi->prepare($sql); $stmt->excute(); $stmt->bind_result($sno,$sname);//绑定结果 while($stmt->fetch()){//从结果集中取值 echo “学号:”.$sno.“ 姓名:”.$sname.“
    ”; } $stmt->close();
  • 37. 完整的例子prepare($sql)or die($mydbi->error); $sname=“alex”; $stmt->bind_param(“s”,$sname); $stmt->excute(); $stmt->bind_result($id); $stmt->fetch(); echo “$sname 的学号是 :”.$id; $stmt->close(); $mydbi->close(); ?>
  • 38. 字符串和BLOB把字符串存入数据库 插入的字符串包含’”或 \ 等其他SQL特殊字符时,会导致语法错误,如下: $data="O'Reilly"; $sql="insert tmp values('$data')"; 解决:$con->escape_string($data); 取出字符串输出到HTML 使用htmlspecialchars()或htmlentities()函数把特殊字符< > “ &替换为HTML编码 PHP把BLOB当作字符串来处理
  • 39. 文件存入提取MySQL把整个文件读入一个变量,然后保存 $f=fopen($filename,"rb"); $imgdata=fread($f,filesize($f)); fclose($f); $con->query( "INSERT images(image) ". "VALUES(' ".$con->escape_string($imgdata)." ')"); 从MySQL读取并显示图片 $rs=$con->query("SELECT image FROM images"); $row=$rs->fetch_object(); header("GIF image"); echo $row->image;
  • 40. 日期和时间把日期/时间数据存入数据库 让日期/时间格式符合MySQL语法规则,可以使用date()和strftime()等函数 存储时间戳,如下 $data=time(); $sql="insert tmp values(FROM_UNIXTIME($data)); 读取日期/时间数据 读取DATETIME数据列,如下 "select UNIX_TIMESTAMP(col) from tmp"; "select DATE_FORMAT(col , '%M %d %Y') from tmp"
  • 41. 处理来自表单的输入数据创建HTML表单
    书名: 作者: 价钱:
  • 42. 字符集处理'set names utf8' htmlspecialchars($txt,ENT_COMPAT,"UTF-8"); htmlentities($txt,ENT_COMPAT,"UTF-8"); header("Content-Type:text/html;charset=utf-8"); Alter table tablename convert to character set utf8
  • 43. 这一节 Over 了