PHP学习笔记13——SQL支持(mysql库与PDO)
1 <?php 2 //1. 使用mysql函数连接mysql数据库 3 /* mysql_connect(server,username,password) 返回资源标识符,如果只有一个将作为默认,多个则要用标识符区分 4 * mysql_close() 关闭连接 5 * mysql_error() 打印错误信息 6 * mysql_select_db(name,resource) 为后续操作指定数据库,相当于use xxx 7 * mysql_query() 执行语句,返回结果资源,错误返回0 8 * mysql_affected_rows() 上一条sql语句影响的行数 9 * 当mysql_query函数执行的是select语句时,返回的是PHP引用资源指针 10 * mysql_num_rows(resource) 返回记录行个数 11 * mysql_num_fields(resource) 返回记录列个数 12 * 以下函数用于读取一行记录直到末尾(NULL),每次读取将指针移到下一行,使用mysql_data_seek()来实现移动指针 13 * mysql_fetch_row(resource) 返回一个普通索引数组保存一行数据,并将资源指针跳到下一行 14 * mysql_fetch_assoc(resource) 返回一个关联索引数组保存一行数据,并将资源指针跳到下一行 15 * mysql_fetch_array(resource) 返回一个普通索引数组/关联索引数组/两者(默认) 保存一行数据,并将资源指针跳到下一行 16 * mysql_fetch_object(resource) 返回一个对象保存一行数据,并将资源指针跳到下一行 17 * mysql_free_result(resource) 释放结果资源 18 */ 19 //连接数据库 20 $link = mysql_connect('localhost','root','root'); 21 if (!$link) { 22 die('连接失败'.mysql_error()); 23 } else { 24 //显示一些与mysql数据库有关的信息 25 echo '连接成功<br/>'; 26 echo mysql_get_client_info()."<br/>"; 27 echo mysql_get_host_info()."<br/>"; 28 echo mysql_get_proto_info()."<br/>"; 29 echo mysql_get_server_info()."<br/>"; 30 echo mysql_client_encoding()."<br/>"; 31 echo mysql_stat()."<br/>"; 32 } 33 mysql_query('set names utf-8'); 34 35 //建立并使用数据库bookstore 36 mysql_query("create database bookstore"); 37 mysql_select_db("bookstore", $link); 38 //增删改 39 $create_str = " 40 create table if not exists books ( 41 id int not null auto_increment, 42 bookname varchar(80) not null default '', 43 publisher varchar(60) not null default '', 44 author varchar(20) not null default '', 45 price double(5,2) not null default 0.00, 46 ptime int not null default 0, 47 detail TEXT, 48 primary key(id), 49 index books_bookname(bookname), 50 index books_publisher(publisher), 51 index books_price(price) 52 );"; 53 $insert_str = " 54 insert into books(bookname,publisher,author,price,detail) values 55 ('PHP', '电子工业', '高某某', '80.00', '与PHP相关的书'), 56 ('JSP', '人民邮电', '洛某某', '60.00', '与JSP相关的书'), 57 ('ASP', '电子工业', '峰某某', '40.00', '与ASP相关的书');"; 58 $update_str = "update books set price = '79.90' where bookname = 'PHP';"; 59 $delete_str = "delete from books where bookname = 'JSP';"; 60 $res = mysql_query($create_str); 61 $res = mysql_query($insert_str); 62 $res = mysql_query($update_str); 63 $res = mysql_query($delete_str); 64 65 //查 66 $res = mysql_query("select * from books;"); 67 while(@$row = mysql_fetch_assoc($res)) { 68 print_r($row); 69 echo "<br/>"; 70 } 71 //关闭资源 72 mysql_free_result($res); 73 mysql_close($link); 74 75 //2. 使用PDO连接数据库 76 /* 一种通用的连接数据库的方式,为不同的数据库提供统一接口 77 * 构造方法 PDO(DSN,username,password,opts) DSN是数据源名,定义数据库和用到的驱动程序,opts关联数组可选,为一些选项,后面会列举 78 * PDO对象中的方法 79 * getAttribute,setAttribute 得倒以及设置属性 80 * errorCode,errorInfo 错误码和错误信息 81 * exec 处理一条语句,返回影响行数 82 * query 处理一条语句,返回PDOStatement 83 * quote 为某个SQL字符串添加引号 84 * lastInsertId 获取插入到表中的最后一条数据的主键值 85 * prepare 准备要执行的SQL语句 86 * getAvailableDrivers 获取有效的PDO驱动器名称 87 * beginTransaction 开始一个事务,标明回归起点 88 * commit 提交一个事务 89 * rollback 回滚一个事务 90 * 91 * query和prepare方法都会返回一个PDOStatement类的实例,该类可以用来设置query参数以及获得query结果 92 * 预处理sql语句可以提高执行效率,尤其在一个查询执行多次是常用(和java中得preparestatement一样),PDOStatemet的成员方法如下 93 * bindColumn 匹配列名和一个指定的变量名,获取每行记录时会将相应列值赋给该变量 94 * bindParam 将参数绑定到相应的查询占位符上 95 * bindValue 将一值绑定到对应的一个参数中 96 * closeCursor 关闭游标 97 * columnCount,rowCount 结果集中列的数目,行的数目 98 * errorCode,errorInfo 错误码,错误信息 99 * execute 执行一个准备好的预查询 100 * setFetchMode 设置获取结果集合的类型 101 * fetch 返回结果下一行 102 * fetchAll 获得所有行 103 * fetchColumn 返回下一行某列的值 104 * fetchObject 将下一行作为对象返回 105 * getColumMeta 返回某一列的属性信息 106 * nextRowset 检索下一行集(结果集) 107 * getAttribute,setAttrbute 设置和得到属性 108 */ 109 try{ 110 $dbh = new PDO("mysql:host=localhost;dbname=bookstore", "root", "root"); 111 } catch(PDOException $e){ 112 echo $e->getMessage(); 113 } 114 //显示一些常用选项 115 echo "<br>自动提交功能:".$dbh->getAttribute(PDO::ATTR_AUTOCOMMIT); 116 echo "<br>强制大小写转换:".$dbh->getAttribute(PDO::ATTR_CASE); 117 echo "<br>错误处理模式:".$dbh->getAttribute(PDO::ATTR_ERRMODE); 118 echo "<br>是否持久连接:";var_dump($dbh->getAttribute(PDO::ATTR_PERSISTENT)); 119 echo "<br>空字符串转换为NULL:".$dbh->getAttribute(PDO::ATTR_ORACLE_NULLS); 120 //echo "<br>提前获取字符串大小:".$dbh->getAttribute(PDO::ATTR_PREFETCH); 这两个属性当前驱动不支持 121 //echo "<br>超时等待时间:".$dbh->getAttribute(PDO::ATTR_TIMEOUT); 122 echo "<br>数据库服务器信息:".$dbh->getAttribute(PDO::ATTR_SERVER_INFO); 123 echo "<br>数据库服务器版本:".$dbh->getAttribute(PDO::ATTR_SERVER_VERSION); 124 echo "<br>数据库客户端版本:".$dbh->getAttribute(PDO::ATTR_CLIENT_VERSION); 125 echo "<br>连接状态信息:".$dbh->getAttribute(PDO::ATTR_CONNECTION_STATUS); 126 127 //使用exec执行非select操作 128 $res = $dbh->exec("update books set price = '78.80' where bookname = 'PHP';"); 129 echo "<br>exec操作影响的行数:".$res; 130 131 //使用query执行select操作 132 $res = $dbh->query("select * from books;"); 133 echo "<br>query操作影响的行数:".$res->rowCount(); 134 foreach ($res as $st) { 135 echo "<br>"; 136 print_r($st); 137 } 138 echo "<br><br>"; 139 140 //使用prepare和execute函数来执行语句 141 /* prepare可以用两种方式来使用占位符 142 * 1)insert .. values (:name, :address, :phone); 143 * 2)insert .. values (?, ?); 144 * 相应的Bind方法也分为两种 145 * 1)bindParam(':name', "ss"); 146 * 2)bindParam(1, "ss"); 147 * 也可以在execute中指定参数,分别为关联数组和索引数组 148 * 1)execute(array(":name"->ss .. )); 149 * 2)execute(array("ss", ..)) 150 * 151 */ 152 $stmt = $dbh->prepare("insert into books(bookname,publisher,author,price,detail) values (?,?,?,?,?)"); 153 $book_info = array("bookname"=>"JAVA", "publisher"=>"中国人民", 154 "author"=>"张某某","price"=>37.80, "detail"=>"与JAVA有关的书"); 155 $stmt->bindParam(1, $book_info['bookname']); //可以显式指定类型,BOOL,NULL,INT,STR,LOB(大数据) 156 $stmt->bindParam(2, $book_info['publisher']); 157 $stmt->bindParam(3, $book_info['author']); 158 $stmt->bindParam(4, $book_info['price']); 159 $stmt->bindParam(5, $book_info['detail']); 160 $stmt->execute(); 161 162 $stmt->execute(array("C++","工业机械","李某",45.30,"与C++有关的书")); 163 164 //使用prepare和execute来查询 165 /* fetch([fetch_style,cursor_orientation,cursor_offset]) 返回一行数据,三个参数都是可选 166 * fetch_style PDO::FETCH_ASSOC(关联),NUM(索引),OBJ(对象),BOTH(前两者,默认),LAZY(前三者),BOUND(赋值给bindParam中得变量) 167 * cursor_orientation 可滚动游标时应该获取哪一行 168 * cursor_offset 获取的行相对于当前游标位置的偏移 169 * 170 * fetchall([fetch_style,column_index]) 返回所有数据 171 * column_index返回指定列所有值 172 * 173 * setfetchmode 设定以上两个函数的默认参数 174 * bindColumn 绑定列对应变量,每次fetch的数据会自动赋值到对应变量上 175 */ 176 177 $stmt = $dbh->prepare("select * from books"); 178 $stmt->execute(); 179 while (@$arr = $stmt->fetch()) { 180 print_r($arr); 181 echo "<br>"; 182 } 183 echo "<br>"; 184 $stmt->execute(); 185 print_r($stmt->fetchAll()); 186 187 //PDO事务处理 188 /* 在autocommit为1时是不需要事务的,需要commit才能提交操作,为0时需要事务来进行提交和回滚操作 189 * 如果驱动底层不支持事务,会抛出PDOException异常 190 */ 191 try{ 192 $dbh->beginTransaction(); 193 $dbh->exec("delete from books where bookname = 'JAVA';"); //这里并没有在数据库中有所改动 194 $dbh->commit(); //这里才被提交执行 195 } catch(PDOException $e){ 196 echo $e->getMessage(); 197 } 198 ?>
执行结果
连接成功 mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $ localhost via TCP/IP 10 5.5.32 utf8 Uptime: 4406 Threads: 1 Questions: 1676 Slow queries: 0 Opens: 63 Flush tables: 1 Open tables: 4 Queries per second avg: 0.380 Array ( [id] => 1 [bookname] => PHP [publisher] => 电子工业 [author] => 高某某 [price] => 79.90 [ptime] => 0 [detail] => 与PHP相关的书 ) Array ( [id] => 3 [bookname] => ASP [publisher] => 电子工业 [author] => 峰某某 [price] => 40.00 [ptime] => 0 [detail] => 与ASP相关的书 ) 自动提交功能:1 强制大小写转换:0 错误处理模式:0 是否持久连接:bool(false) 空字符串转换为NULL:0 数据库服务器信息:Uptime: 4407 Threads: 1 Questions: 1686 Slow queries: 0 Opens: 65 Flush tables: 1 Open tables: 5 Queries per second avg: 0.382 数据库服务器版本:5.5.32 数据库客户端版本:mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $ 连接状态信息:localhost via TCP/IP exec操作影响的行数:1 query操作影响的行数:2 Array ( [id] => 1 [0] => 1 [bookname] => PHP [1] => PHP [publisher] => 电子工业 [2] => 电子工业 [author] => 高某某 [3] => 高某某 [price] => 78.80 [4] => 78.80 [ptime] => 0 [5] => 0 [detail] => 与PHP相关的书 [6] => 与PHP相关的书 ) Array ( [id] => 3 [0] => 3 [bookname] => ASP [1] => ASP [publisher] => 电子工业 [2] => 电子工业 [author] => 峰某某 [3] => 峰某某 [price] => 40.00 [4] => 40.00 [ptime] => 0 [5] => 0 [detail] => 与ASP相关的书 [6] => 与ASP相关的书 ) Array ( [id] => 1 [0] => 1 [bookname] => PHP [1] => PHP [publisher] => 电子工业 [2] => 电子工业 [author] => 高某某 [3] => 高某某 [price] => 78.80 [4] => 78.80 [ptime] => 0 [5] => 0 [detail] => 与PHP相关的书 [6] => 与PHP相关的书 ) Array ( [id] => 3 [0] => 3 [bookname] => ASP [1] => ASP [publisher] => 电子工业 [2] => 电子工业 [author] => 峰某某 [3] => 峰某某 [price] => 40.00 [4] => 40.00 [ptime] => 0 [5] => 0 [detail] => 与ASP相关的书 [6] => 与ASP相关的书 ) Array ( [id] => 4 [0] => 4 [bookname] => JAVA [1] => JAVA [publisher] => 中国人民 [2] => 中国人民 [author] => 张某某 [3] => 张某某 [price] => 37.80 [4] => 37.80 [ptime] => 0 [5] => 0 [detail] => 与JAVA有关的书 [6] => 与JAVA有关的书 ) Array ( [id] => 5 [0] => 5 [bookname] => C++ [1] => C++ [publisher] => 工业机械 [2] => 工业机械 [author] => 李某 [3] => 李某 [price] => 45.30 [4] => 45.30 [ptime] => 0 [5] => 0 [detail] => 与C++有关的书 [6] => 与C++有关的书 ) Array ( [0] => Array ( [id] => 1 [0] => 1 [bookname] => PHP [1] => PHP [publisher] => 电子工业 [2] => 电子工业 [author] => 高某某 [3] => 高某某 [price] => 78.80 [4] => 78.80 [ptime] => 0 [5] => 0 [detail] => 与PHP相关的书 [6] => 与PHP相关的书 ) [1] => Array ( [id] => 3 [0] => 3 [bookname] => ASP [1] => ASP [publisher] => 电子工业 [2] => 电子工业 [author] => 峰某某 [3] => 峰某某 [price] => 40.00 [4] => 40.00 [ptime] => 0 [5] => 0 [detail] => 与ASP相关的书 [6] => 与ASP相关的书 ) [2] => Array ( [id] => 4 [0] => 4 [bookname] => JAVA [1] => JAVA [publisher] => 中国人民 [2] => 中国人民 [author] => 张某某 [3] => 张某某 [price] => 37.80 [4] => 37.80 [ptime] => 0 [5] => 0 [detail] => 与JAVA有关的书 [6] => 与JAVA有关的书 ) [3] => Array ( [id] => 5 [0] => 5 [bookname] => C++ [1] => C++ [publisher] => 工业机械 [2] => 工业机械 [author] => 李某 [3] => 李某 [price] => 45.30 [4] => 45.30 [ptime] => 0 [5] => 0 [detail] => 与C++有关的书 [6] => 与C++有关的书 ) )