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++有关的书 ) ) 

 

posted @ 2013-08-21 10:58  Burn_E  阅读(606)  评论(0编辑  收藏  举报