主要有以下的内容:
1.怎么连接数据库
2.怎么操作数据库
(1)怎么执行sql语言
(2)怎么处理返回的结果集
方法一:面向过程(已经过时,只是了解)
假设:
1 $username=your_name;2 $userpass=your_pass;3 $dbhost=localhost;4 $dbdatabase=your_database;
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()、mysql_select_db()等函数之前使用@(错误控制运算符),可以忽略掉系统产生的错误信息,然后我们用die()来自定义错误信息;
②提取数据的时候,除了上面的mysql_fetch_row,常见的还有mysql_fetch_assoc和mysql_fetch_array,具体差别请查阅PHP Manual;
③对于mysql_query()函数的返回值,如果执行的语句有返回值(如SELECT、SHOW、DESCRIBE等),则返回相应数据(成功 时)或FALSE(失败时);如果执行的语句没有返回值(如DELETE、DROP、INSERT、UPDATE等),则返回TRUE(成功时)或 FALSE(失败时)。
方法二:面向对象(连接MySql数据库必选)
1 //创建数据库对象 2 $db=new MySQLi("localhost","root","123","exam"); 3 //判断是不是执行成功 4 !mysqli_connect_error() or die("连接失败!"); 5 //执行sql语句 6 $result=$db->query("SELECT * FROM student"); 7 //处理结果集 8 $arr=$result->fetch_row(); 9 //输出结果10 var_dump($arr);
经典例题:
这是例子都是嵌在html中的,当然不嵌在也是可以的
1.数据库中的数据以表格的形式输出
1 2 3 4 5以表格的形式显示数据库 6 7 8 9 query("SELECT * FROM info;");16 //处理结果集17 $arr=$result->fetch_all();//一个记录一个记录的取,以索引数组的形式显示18 //$arr=$result->fetch_all();//取出全部的记录,并以二维数组的形式显示19 //$arr=$result->fetch_assoc();//一个记录一个记录的取,以关联数组的形式显示20 //可以在这里边用echo写,但是感觉代码多,而且还很乱21 ?>22 23{ $arr[$i][$j]}"; 36 };37 echo "";38 /*如果行数不多:39 echo "
代号 | 26姓名 | 27性别 | 28民族 | 29生日 | 30
{$arr[$i][0]} | {$arr[$i][1]} | {$arr[$i][2]} | {$arr[$i][3]} | {$arr[$i][4]} |
结果预览:
2.数据库的数据以下拉列表的形式呈现
1 2 3 4 5以下拉列表的形式展现 6 7 8 9 query("SELECT * FROM nation;");14 $arr=$result->fetch_all();15 ?>16 28 29
结果:
这是页面效果
这是代码显示的形式
总结:
总结一下上边的这两个例子:
(1)首先这两个例子都是用PHP来控制输出的(仔细体会这句话),即把数据库中的内容呈现个用户,当然这里边是可以加一些样式的,给用户一个很好的用户体验.在设计的时候,要把数据和HTML分开来考虑,之后在找到他们之间的接口,将二者融合在一起. PHP从数据库中提取数据,借助HTML将数据更好的展现给用户.比如,提取出来的数据一般是数组,用户是看不懂数组的,要用HTML表格的形式展现给用户,这就是分开考虑和融合二者.
(2)注意细节,不管是用户体验的细节还是编程的细节.细节决定成败
3.利用php与数据库实现登录
实现登录就是多了一步填写的用户信息和数据库中的用户信息做比较.(这里边要是结合JS和CSS能实现很好的用户体验效果)
登录界面:
1 2 3 4 5登录 6 17 18 1920 21 34 3536 37
结果:
登录处理页面:
1 2 3 4 5登录验证 6 7 8 9 query("SELECT count(*) FROM login WHERE username='{ $name}' AND password='{ $password}';");17 $arr=$result->fetch_all();18 //验证19 if($arr[0][0]==1){20 echo "登录成功!
";21 }else{22 echo "登录失败!
";23 }24 25 ?>26 27
注意的地方:这个地方的验证是用匹配的数量来验证的,为1时唯一匹配,登录成功,当然这不是唯一的方法
4.在用户界面实现数据的增删改查(改和查难点)
总页面:
1 2 3 4 5增加 6 7 Query($sql,1,"testa");12 ?>13
代号 | 姓名 | 性别 | 民族 | 生日 | 操作 |
{ $arr[$i][0]} | { $arr[$i][1]} | { $arr[$i][2]} | { $arr[$i][3]} | { $arr[$i][4]} | 删除修改 |
效果:
增加:
1 2 3 4 531 32添加 6 7 8
1 2 3 4 5添加处理界面 6 7 8 Query($sql,0);18 if($result){19 header("location:table.php"); 20 }else{21 echo "";22 }23 ?>24 25
删除:
1 2 3 4 5删除 6 7 8 Query($sql,0);14 if($result){15 header("location:table.php");16 }17 ?>18 19
修改:
5.封装数据库的连接(主要是连接函数)
封装的链接数据库的类:
1 host,$this->uid,$this->pwd,$db);17 18 //判断连接是否成功19 !mysqli_connect_error() or die("连接失败!");20 21 //执行SQL语句22 $result = $conn->query($sql);23 24 //判断SQL语句类型25 if($type==1)26 {27 //如果是查询语句返回结果集的二维数组28 return $result->fetch_all();29 }30 else31 {32 //如果是其他语句,返回true或false33 return $result;34 }35 }36 37 }
分页类
1 "条记录", 15 'prev' => "上一页", 16 'next' => "下一页", 17 'first'=> "首页", 18 'last' => "末页" 19 ); 20 //在分页信息中显示内容,可以自己通过set()方法设置 21 private $listNum = 10; //默认分页列表显示的个数 22 23 /** 24 构造方法,可以设置分页类的属性 25 @param int $total 计算分页的总记录数 26 @param int $listRows 可选的,设置每页需要显示的记录数,默认为25条 27 @param mixed $query 可选的,为向目标页面传递参数,可以是数组,也可以是查询字符串格式 28 @param bool $ord 可选的,默认值为true, 页面从第一页开始显示,false则为最后一页 29 */ 30 public function __construct($total, $listRows=25, $query="", $ord=true){ 31 $this->total = $total; 32 $this->listRows = $listRows; 33 $this->uri = $this->getUri($query); 34 $this->pageNum = ceil($this->total / $this->listRows); 35 /*以下判断用来设置当前面*/ 36 if(!empty($_GET["page"])) { 37 $page = $_GET["page"]; 38 }else{ 39 if($ord) 40 $page = 1; 41 else 42 $page = $this->pageNum; 43 } 44 45 if($total > 0) { 46 if(preg_match('/\D/', $page) ){ 47 $this->page = 1; 48 }else{ 49 $this->page = $page; 50 } 51 }else{ 52 $this->page = 0; 53 } 54 55 $this->limit = "LIMIT ".$this->setLimit(); 56 } 57 58 /** 59 用于设置显示分页的信息,可以进行连贯操作 60 @param string $param 是成员属性数组config的下标 61 @param string $value 用于设置config下标对应的元素值 62 @return object 返回本对象自己$this, 用于连惯操作 63 */ 64 function set($param, $value){ 65 if(array_key_exists($param, $this->config)){ 66 $this->config[$param] = $value; 67 } 68 return $this; 69 } 70 71 /* 不是直接去调用,通过该方法,可以使用在对象外部直接获取私有成员属性limit和page的值 */ 72 function __get($args){ 73 if($args == "limit" || $args == "page") 74 return $this->$args; 75 else 76 return null; 77 } 78 79 /** 80 按指定的格式输出分页 81 @param int 0-7的数字分别作为参数,用于自定义输出分页结构和调整结构的顺序,默认输出全部结构 82 @return string 分页信息内容 83 */ 84 function fpage(){ 85 $arr = func_get_args(); 86 87 $html[0] = " 共 { $this->total} { $this->config["head"]} "; 88 $html[1] = " 本页 ".$this->disnum()." 条 "; 89 $html[2] = " 本页从 { $this->start()}-{ $this->end()} 条 "; 90 $html[3] = " { $this->page}/{ $this->pageNum}页 "; 91 $html[4] = $this->firstprev(); 92 $html[5] = $this->pageList(); 93 $html[6] = $this->nextlast(); 94 $html[7] = $this->goPage(); 95 96 $fpage = ''; 97 if(count($arr) < 1) 98 $arr = array(0,1,2,3,4,5,6,7); 99 100 for($i = 0; $i < count($arr); $i++)101 $fpage .= $html[$arr[$i]];102 103 $fpage .= '';104 return $fpage;105 }106 107 /* 在对象内部使用的私有方法,*/108 private function setLimit(){109 if($this->page > 0)110 return ($this->page-1)*$this->listRows.", { $this->listRows}";111 else112 return 0;113 }114 115 /* 在对象内部使用的私有方法,用于自动获取访问的当前URL */116 private function getUri($query){ 117 $request_uri = $_SERVER["REQUEST_URI"]; 118 $url = strstr($request_uri,'?') ? $request_uri : $request_uri.'?';119 120 if(is_array($query))121 $url .= http_build_query($query);122 else if($query != "")123 $url .= "&".trim($query, "?&");124 125 $arr = parse_url($url);126 127 if(isset($arr["query"])){128 parse_str($arr["query"], $arrs);129 unset($arrs["page"]);130 $url = $arr["path"].'?'.http_build_query($arrs);131 }132 133 if(strstr($url, '?')) {134 if(substr($url, -1)!='?')135 $url = $url.'&';136 }else{137 $url = $url.'?';138 }139 140 return $url;141 }142 143 /* 在对象内部使用的私有方法,用于获取当前页开始的记录数 */144 private function start(){145 if($this->total == 0)146 return 0;147 else148 return ($this->page-1) * $this->listRows+1;149 }150 151 /* 在对象内部使用的私有方法,用于获取当前页结束的记录数 */152 private function end(){153 return min($this->page * $this->listRows, $this->total);154 }155 156 /* 在对象内部使用的私有方法,用于获取上一页和首页的操作信息 */157 private function firstprev(){158 if($this->page > 1) {159 $str = " { $this->config["first"]} ";160 $str .= "{ $this->config["prev"]} "; 161 return $str;162 }163 164 }165 166 /* 在对象内部使用的私有方法,用于获取页数列表信息 */167 private function pageList(){168 $linkPage = " ";169 170 $inum = floor($this->listNum/2);171 /*当前页前面的列表 */172 for($i = $inum; $i >= 1; $i--){173 $page = $this->page-$i;174 175 if($page >= 1)176 $linkPage .= "{ $page} ";177 }178 /*当前页的信息 */179 if($this->pageNum > 1)180 $linkPage .= "{ $this->page} ";181 182 /*当前页后面的列表 */183 for($i=1; $i <= $inum; $i++){184 $page = $this->page+$i;185 if($page <= $this->pageNum)186 $linkPage .= "{ $page} ";187 else188 break;189 }190 $linkPage .= '';191 return $linkPage;192 }193 194 /* 在对象内部使用的私有方法,获取下一页和尾页的操作信息 */195 private function nextlast(){196 if($this->page != $this->pageNum) {197 $str = " { $this->config["next"]} ";198 $str .= " { $this->config["last"]} ";199 return $str;200 }201 }202 203 /* 在对象内部使用的私有方法,用于显示和处理表单跳转页面 */204 private function goPage(){205 if($this->pageNum > 1) {206 return ' '.$this->pageNum.')?'.$this->pageNum.':this.value;location=\''.$this->uri.'page=\'+page+\'\'}" 211 value="'.$this->page.'">212 '.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'page=\'+page+\'\'" 215> ';216 }217 }218 219 /* 在对象内部使用的私有方法,用于获取本页显示的记录条数 */220 private function disnum(){221 if($this->total > 0){222 return $this->end()-$this->start()+1;223 }else{224 return 0;225 }226 }227 }228 229 230 231
主要是如何使用:
该类中有比较重要的函数,也是主要使用的函数
该类的构造函数和fpage()函数