沉淀再出发:PHP的中级内容
一、前言
前面我们介绍了PHP的简单的语法知识以及相关的用法,接下来我们将PHP和mysql结合起来进行研究。
二、PHP+mysql
首先我们看一段代码:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 <?php 9 $con=mysqli_connect("127.0.0.1","root",""); 10 // Check connection 11 if (mysqli_connect_errno()) 12 { 13 echo "Failed to connect to MySQL: " . mysqli_connect_error(); 14 } 15 16 // Create database 17 $sql="CREATE DATABASE zyr_db"; 18 if (mysqli_query($con,$sql)) 19 { 20 echo "Database zyr_db created successfully"; 21 echo '<br>'; 22 mysqli_close($con); 23 } 24 else 25 { 26 echo "Error creating database: " . mysqli_error($con); 27 echo '<br>'; 28 } 29 30 $con=mysqli_connect("127.0.0.1","root","","zyr_db"); 31 // Check connection 32 if (mysqli_connect_errno()) 33 { 34 echo "Failed to connect to MySQL: " . mysqli_connect_error(); 35 echo '<br>'; 36 } 37 38 // Create table 39 $sql="CREATE TABLE Persons(FirstName CHAR(30),LastName CHAR(30),Age INT)"; 40 41 // Execute query 42 if (mysqli_query($con,$sql)) 43 { 44 echo "Table persons created successfully"; 45 echo '<br>'; 46 } 47 else 48 { 49 echo "Error creating table: " . mysqli_error($con); 50 echo '<br>'; 51 } 52 53 mysqli_query($con,"INSERT INTO Persons (FirstName, LastName, Age) VALUES ('zyr', 'lsx',24)"); 54 mysqli_query($con,"INSERT INTO Persons (FirstName, LastName, Age) VALUES ('xiaohong', 'xiaoming',30)"); 55 echo "after INSERT..."; 56 echo "<br>"; 57 findAllPeoples($con); 58 59 echo "find by firstname ..."; 60 echo "<br>"; 61 findPeopleById("zyr",$con); 62 63 mysqli_query($con,"UPDATE Persons SET Age=25 WHERE FirstName='zyr' AND LastName='lsx'"); 64 echo "after UPDATE..."; 65 echo "<br>"; 66 findAllPeoples($con); 67 68 mysqli_query($con,"DELETE FROM Persons"); 69 echo "after delete..."; 70 echo "<br>"; 71 findAllPeoples($con); 72 mysqli_close($con); 73 74 function findPeopleById($name,$con){ 75 $result = mysqli_query($con,"SELECT * FROM Persons WHERE FirstName = ". "'" .$name."'"); 76 77 while($row = mysqli_fetch_array($result)) 78 { 79 echo $row['FirstName'] . " " . $row['LastName'] ." ".$row['Age']; 80 echo "<br>"; 81 } 82 } 83 function findAllPeoples($con){ 84 $result = mysqli_query($con,"SELECT * FROM Persons"); 85 86 while($row = mysqli_fetch_array($result)) 87 { 88 echo $row['FirstName'] . " " . $row['LastName'] ." ".$row['Age']; 89 echo "<br>"; 90 } 91 } 92 ?> 93 94 </body> 95 </html>
在我们安装的wamp中,mysql数据库默认的用户名为root,密码为空,因此我们可以连接数据库了,除此之外和其它数据库一样,mysql的数据库操作方法,想必大家都是了如指掌的,并且在PHP之中对于所有的sql操作都做了封装,我们只需要修改或者组合简单的sql语句就能够进行创建、删除数据库、表,以及增删改查表中的内容了,到了这一步,我们可以进行简单的封装使得我们的sql语言更加的精致。
2.1、创建数据库
1 $con=mysqli_connect("127.0.0.1","root",""); 2 // Check connection 3 if (mysqli_connect_errno()) 4 { 5 echo "Failed to connect to MySQL: " . mysqli_connect_error(); 6 } 7 8 // Create database 9 $sql="CREATE DATABASE zyr_db"; 10 if (mysqli_query($con,$sql)) 11 { 12 echo "Database zyr_db created successfully"; 13 echo '<br>'; 14 mysqli_close($con); 15 } 16 else 17 { 18 echo "Error creating database: " . mysqli_error($con); 19 echo '<br>'; 20 }
2.2、创建表
1 $con=mysqli_connect("127.0.0.1","root","","zyr_db"); 2 // Check connection 3 if (mysqli_connect_errno()) 4 { 5 echo "Failed to connect to MySQL: " . mysqli_connect_error(); 6 echo '<br>'; 7 } 8 9 // Create table 10 $sql="CREATE TABLE Persons(FirstName CHAR(30),LastName CHAR(30),Age INT)"; 11 12 // Execute query 13 if (mysqli_query($con,$sql)) 14 { 15 echo "Table persons created successfully"; 16 echo '<br>'; 17 } 18 else 19 { 20 echo "Error creating table: " . mysqli_error($con); 21 echo '<br>'; 22 }
2.3、插入数据
1 mysqli_query($con,"INSERT INTO Persons (FirstName, LastName, Age) VALUES ('zyr', 'lsx',24)"); 2 mysqli_query($con,"INSERT INTO Persons (FirstName, LastName, Age) VALUES ('xiaohong', 'xiaoming',30)"); 3 echo "after INSERT..."; 4 echo "<br>"; 5 findAllPeoples($con);
2.4、查找所有数据
1 function findAllPeoples($con){ 2 $result = mysqli_query($con,"SELECT * FROM Persons"); 3 4 while($row = mysqli_fetch_array($result)) 5 { 6 echo $row['FirstName'] . " " . $row['LastName'] ." ".$row['Age']; 7 echo "<br>"; 8 } 9 }
2.5、按条件查找数据
1 echo "find by firstname ..."; 2 echo "<br>"; 3 findPeopleById("zyr",$con);
其中findPeopleById("zyr",$con);为:
1 function findPeopleById($name,$con){ 2 $result = mysqli_query($con,"SELECT * FROM Persons WHERE FirstName = ". "'" .$name."'"); 3 4 while($row = mysqli_fetch_array($result)) 5 { 6 echo $row['FirstName'] . " " . $row['LastName'] ." ".$row['Age']; 7 echo "<br>"; 8 } 9 }
2.6、更新数据
1 mysqli_query($con,"UPDATE Persons SET Age=25 WHERE FirstName='zyr' AND LastName='lsx'"); 2 echo "after UPDATE..."; 3 echo "<br>"; 4 findAllPeoples($con);
2.7、删除数据并且关闭数据库
1 mysqli_query($con,"DELETE FROM Persons"); 2 echo "after delete..."; 3 echo "<br>"; 4 findAllPeoples($con); 5 mysqli_close($con);
2.8、删除数据库
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 <?php 9 $con=mysqli_connect("127.0.0.1","root",""); 10 // Check connection 11 if (mysqli_connect_errno()) 12 { 13 echo "Failed to connect to MySQL: " . mysqli_connect_error(); 14 } 15 16 // Create database 17 $sql="drop DATABASE my_db"; 18 if (mysqli_query($con,$sql)) 19 { 20 echo "Database zyr_db dropped successfully"; 21 mysqli_close($con); 22 } 23 else 24 { 25 echo "Error creating database: " . mysqli_error($con); 26 } 27 ?> 28 </body> 29 </html>
以上就是数据库相关的操作,使用函数进行相应的封装即可。
2.9、php和mysql的对应api
当考虑连接到MySQL数据库服务器的时候,有三种主要的API可供选择: PHP的MySQL扩展 PHP的mysqli扩展 PHP数据对象(PDO) PHP的MySQL扩展: 这是设计开发允许PHP应用与MySQL数据库交互的早期扩展。mysql扩展提供了一个面向过程的接口,并且是针对MySQL4.1.3或更早版本设计的。
因此,这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端进行交互,但并不支持后期MySQL服务端提供的一些特性。 PHP的mysqli扩展: mysqli扩展,称之为MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性。mysqli扩展在PHP 5及以后版本中包含。
mysqli扩展有一系列的优势,相对于mysql扩展的提升主要有: 面向对象接口 prepared语句支持 多语句执行支持 事务支持 增强的调试能力 嵌入式服务支持 在提供了面向对象接口的同时也提供了一个面向过程的接口。 PDO: PHP数据对象,是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得你的PHP应用不去关心具体要连接的数据库服务器系统类型。
也就是说,如果使用PDO的API,可以在任何需要的时候无缝切换数据库服务器,比如从Firebird 到MySQL,仅仅需要修改很少的PHP代码。
其他数据库抽象层的例子包括Java应用中的JDBC以及Perl中的DBI。当然,PDO也有它自己的先进性,比如一个干净的,简单的,可移植的API,
它最主要的缺点是会限制让你不能使用后期MySQL服务端提供所有的数据库高级特性。比如,PDO不允许使用MySQL支持的多语句执行。
更多的关于PHP的mysql接口可以从PHP的官方文档:http://php.net/manual/zh/set.mysqlinfo.php上面获取。
三、PHP和ajax
在PHP中使用ajax,我们可以非常方便的进行相应的查询和相应,速度非常的快,这对于我们的动态网页来说是非常方便的。
首先让我们看一下客户端代码:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <script> 7 function showHint(str) 8 { 9 if (str.length==0) 10 { 11 document.getElementById("txtHint").innerHTML=""; 12 return; 13 } 14 if (window.XMLHttpRequest) 15 {// code for IE7+, Firefox, Chrome, Opera, Safari 16 xmlhttp=new XMLHttpRequest(); 17 } 18 else 19 {// code for IE6, IE5 20 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 21 } 22 xmlhttp.onreadystatechange=function(){ 23 if (xmlhttp.readyState==4 && xmlhttp.status==200) 24 { 25 document.getElementById("txtHint").innerHTML=xmlhttp.responseText; 26 } 27 } 28 xmlhttp.open("GET","gethint.php?q="+str,true); 29 xmlhttp.send(); 30 } 31 </script> 32 </head> 33 34 <body> 35 36 <p><b>在输入框中输入一个姓名:</b></p> 37 <form> 38 姓名: <input type="text" onkeyup="showHint(this.value)"> 39 </form> 40 <p>返回值: <span id="txtHint"></span></p> 41 42 </body> 43 44 </html>
然后是PHP服务器的代码:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 <?php 9 // 将姓名填充到数组中 10 $a[]="Anna"; 11 $a[]="Brittany"; 12 $a[]="Cinderella"; 13 $a[]="Diana"; 14 $a[]="Eva"; 15 $a[]="Fiona"; 16 $a[]="Gunda"; 17 $a[]="Hege"; 18 $a[]="Inga"; 19 $a[]="Johanna"; 20 $a[]="Kitty"; 21 $a[]="Linda"; 22 $a[]="Nina"; 23 $a[]="Ophelia"; 24 $a[]="Petunia"; 25 $a[]="Amanda"; 26 $a[]="Raquel"; 27 $a[]="Cindy"; 28 $a[]="Doris"; 29 $a[]="Eve"; 30 $a[]="Evita"; 31 $a[]="Sunniva"; 32 $a[]="Tove"; 33 $a[]="Unni"; 34 $a[]="Violet"; 35 $a[]="Liza"; 36 $a[]="Elizabeth"; 37 $a[]="Ellen"; 38 $a[]="Wenche"; 39 $a[]="Vicky"; 40 41 //从请求URL地址中获取 q 参数 42 $q=$_GET["q"]; 43 44 //查找是否由匹配值, 如果 q>0 45 if (strlen($q) > 0) 46 { 47 $hint=""; 48 for($i=0; $i<count($a); $i++) 49 { 50 if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q)))) 51 { 52 if ($hint=="") 53 { 54 $hint=$a[$i]; 55 } 56 else 57 { 58 $hint=$hint." , ".$a[$i]; 59 } 60 } 61 } 62 } 63 64 // 如果没有匹配值设置输出为 "no suggestion" 65 // or to the correct values 66 if ($hint == "") 67 { 68 $response="no suggestion"; 69 } 70 else 71 { 72 $response=$hint; 73 } 74 75 //输出返回值 76 echo $response; 77 ?> 78 </body> 79 </html>