PHP中MySQL数据库连接,数据读写,修改方法
MySQL连接大的来说有两种方法,一种是mysqli,另一种是mysql。php为连接MySQL提供了函数库,有mysql和mysqli,mysqli是mysql函数库的扩展,是php5才支持的。当你使用mysqli函数库连接MySQL的时候要确保php的配置文件php.ini中的extension=php_mysqli.dll是打开的(该语句前面没有分号(;)。有分号表示改行是注释掉的)。
下面来介绍这两种连接方法:
一、mysqli连接,可使用面向过程的方法也可以使用面向对象的方法。
1. 面向对象的连接方法。
下面先以一个例子来说明,前提是一个搜索的表单,包含以个可选的搜索的类型searchtype和搜索内容searchterm。
1 <?php 2 $searchtype = trim($_POST['searchtype']); 3 $searchterm = trim($_POST['searchterm']); 4 if(!$searchtype || !$searchterm){ 5 echo 'You have not entered search details. Please go back and try again.'; 6 exit; 7 } 8 if(!get_magic_quotes_gpc()){ 9 $searchtype = addslashes($searchtype); 10 $searchterm = addslashes($searchterm); 11 } 12 @ $db = new mysqli('localhost', 'root', '','books'); 13 if(mysqli_connect_errno()){ 14 echo 'Error:mysql connect false.'; 15 exit; 16 } 17 $query = "SELECT * from book where ".$searchtype." like '%" .$searchterm."%'"; 18 $result = $db->query($query); 19 $num_results = $result->num_rows; 20 echo 'Number of books found:'.$num_results; 21 for($i = 0; $i < $num_results; $i++){ 22 $row = $result->fetch_assoc(); 23 var_dump($row); 24 echo '<p><strong>'.($i+1).'.Title: '; 25 echo htmlspecialchars(stripslashes($row['title'])); 26 echo '</strong></br>Author: '; 27 echo htmlspecialchars(stripslashes($row['author'])); 28 echo '<br />ISBN: '; 29 echo htmlspecialchars(stripslashes($row['isbn'])); 30 echo '<br />Price:'; 31 echo htmlspecialchars(stripslashes($row['price'])); 32 echo '</p>'; 33 } 34 $result->free(); 35 $db->close(); 36 ?>
输出结果:
Number of books found:2
1.Title: Java 2 for Professionan Develops
Author: Michael Morgan
ISBN: 0-672-31697-8
Price:34.99
2.Title: PHP and MySQL Web Development
Author: Luke Welling Laura T
ISBN: 978-7-111-26281-7
Price:95
连接数据库的过程:
- @ $db = new mysqli('localhost', 'root', '','books');连接数据库;@为错误抑制操作符,通常连接数据库时都会使用;myslqi后面有四个参数,以此为,连接的主机,连接数据库的账户,密码和数据库。过程方法为@ $db = mysqli_connect('localhost', 'root', '','books');
- 上句第四个参数也可以不要,如果不要第四个参数,在查询数据库前需要先选择数据库,面向对象方法,$db->select_db('books');,过程的方法mysqli_select_db(db_resourse, db_name);.
- mysqli_connect_errno()数据库连接结果检查,如果连接成功返回0,否则返回错误号。面向对象和面向过程的方法都是这个判断方法,代码相同。
- $query = "SELECT * from book where ".$searchtype." like '%" .$searchterm."%'";建立查询条件,该句中的book为要查询的表。
- $result = $db->query($query);执行查询条件,面向过程的函数是mysqli_query($db,$query); $db为连接数据库返回的资源。查询后,面向对象的将返回一个结果对象,过程版本返回一个结果资源。函数执行失败返回false.
- $num_results = $result->num_rows;当查询条件使用SELECT时,使用面向对象方法时,查询影响的行数保存在返回结果的num_rows的成员变量中。使用面向过程的方法时是使用函数mysqli_num_rows($result);。当查询条件是INSERT,UPDATE等非SELECT时要使用$result->affected_rows或mysqli_affected_rows($result).
- $row = $result->fetch_assoc(); 该函数从和resultde 结果集中取得一行数据并作为数组返回,每个结果的列存储在一个数组的单元中,偏移量从0开始。依次调用将返回结果集中的下一行,如果没有更多行则返回FLASE.关联数组的每个关键词为一个属性名(数组的字段名,例如例子中$row['title']等),每一个值为数组中相应的值。每调用一次,返回结果集的一行,直到结束。过程的方法mysqli_fetch_assoc($result).还有另外3个函数也可以实现该功能,$row=$result->fetch_row(),$row=mysqli_fetch_row($result);该函数与上面函数的区别就是使用数字索引$row[0],$row[1]等。$row=$result->fetch_array(),$row=mysqli_fetch_array($result);该函数与上面函数的区别就是可以使用数字索引也可以使用关联索引。$row=$result->fetch_object(),$row=mysqli_fetch_object($result)是将一行取到一个对象中,而不是一个数组中,然后通过$row->title,$row->author等访问每个属性。
- $result->free();mysqli_free_result($result);释放结果集,释放内存,如果结果集很大,建议使用;$db->close();mysqli_close($db);关闭非持久的数据库连接,不会关闭mysqli_pconnect()建立的持久连接。严格说,这个并不是必须的,因为脚本执行完毕的时候他们会自动关闭。
另外需要注意的一些函数:
- trim()去除字符串两端的空格。在输入文本框中常用
- get_magic_quotes_gpc()、addslashes()、stripslashes()。对于字符串来说,当存入到数据库时,有些字符会被解析成控制符,有单双引号,反斜杠(\),NULL字符。因此需要将这些字符转义处理(在这些字符前添加反斜杠),使用addslashes()来转义。通过浏览器显示到页面的时候要要通过stripslashes()来去掉添加的反斜杠。但是PHP配置中magic_quotes_gpc(gpc get post cookie)配置指令可以自动添加反斜杠(不能去除),如果配置指令magic_quotes_gpc打开自动添加转义字符,而又通过addslashes()人工添加转义字符将重复。因此需要在添加转义字符前使用get_magic_quotes_gpc()函数来判断该配置指令是否开启,如果没有开启在人工添加转义字符。如果开启get_magic_quotes_gpc()将返回true.添加魔术引号移植性更好。
- htmlspecialchars()对html中的特殊字符进行编码,例如&<>"等,使用该函数,可以清除可能发生的错误。
2.面向过程的连接方法
@ $db=mysqli_connect('localhost', 'root', '', 'books') or die('Unable to connect'); //如果前面没写第四个参数,后面那要选择数据库。mysqli_select_db($db, 'books'); //判断语句也可以使用if(mysqli_connect_errno()){echo 'Unable to connect'; exit;} $query = SELECT * from book; $result = mysqli_query($db, $query); $result_num =mysqli_num_rows($result); while($row=mysqli_fecth_assoc($result)){ echo $row['title']; }
- 在面向过程的方法中,判断语句可以使用die()函数和mysqli_connect_errno(),但是在面向对象的方法中,只能使用mysqli_connect_errno()。
- mysqli的大多函数都有面向对象和面向过程的接口。通常二者的差异在于过程版本函数名以mysqli_开始的,通常传入mysqli_connect()获得的资源句柄。
- mysqli_fectch_assoc()以关联数组返回结果集,没有更多行,则返回FLASE.
二、mysql连接
mysql连接只有面向过程的连接。
1 //生成一个连接 2 @ $db_connect=mysql_connect($dbhost,$username,$userpass) or die("Unable to connect to the MySQL!"); 3 4 //选择一个需要操作的数据库 5 mysql_select_db($dbdatabase,$db_connect); 6 7 //执行MySQL语句 8 $result=mysql_query("SELECT id,name FROM user"); 9 10 //提取数据 11 $row=mysql_fetch_row($result);
- mysql_connect()只有三个参数,主机名,数据库用户名,密码,不能包括数据库名。mysqli连接时可以直接包含数据库。因此下面要用mysql_connect_db()来选择数据库。
- 提取数据后,除了mysql_fetch_row()还有mysql_fetch_array()和mysql_fetch_assoc()没有面向对象的方式。