### PHP數據庫編程
PHP有三種方式來操作我們的數據庫:
1、mysql擴展庫
2、mysqli擴展庫
3、pdo
### mysql擴展庫和mysql數據庫的區別
下面就來mysql擴展庫來介紹 :
1、mysql數據庫是用來存放數據的
2、mysql數據庫的三層結構示意圖:
所有數據庫基本上都遵循這三種結構 ,

3、mysql擴展庫是一堆函數,是PHP設計者提供給程序員完成對mysql數據庫的各種操作(CRUD)
### 使用PHP的mysql擴展庫完成對數據庫的操作:
1、環境搭建
1.1 啟用mysql擴展庫
在PHP.ini文件中去配置mysql擴展庫
extension=php_mysql.dll? ? ? ? ? ? ? extension=php_mysqli.dll
我們可以通過<?php phpinfo();?> 來查看目前支持哪些庫功能
1.2 創建一張用戶表,供我們使用
~~~
create table user1(
id int primary key auto_increment,
name varchar(32) not null,
password varchar(64) not null,
email varchar(128) not null,
age tinyint unsigned not null
)
~~~
### 插入數據
?
~~~
insert into user1(name,password,email,age) value('jsh',md5('123456'),'1234567@qq.com',20)
~~~
這里我們對密碼進行了加密
當我們將用戶名是漢字時,回報錯誤,需要進行設置


### 下面是具體的例子:
~~~
<?php
//mysql 擴展庫曹總mysql數據庫步驟
//1 獲得鏈接,疑問?密碼在哪設置的???
$conn=mysql_connect("192.168.1.110:3306","root","");
if (!$conn){
die("連接失敗".mysql_error());
}else{
echo "連接成功<br/>";
}
//2 選擇數據庫
mysql_select_db('test', $conn) or die ('Can\'t use test: ' . mysql_error());
//3 設置操作編碼(可選)
//mysql_query("set names utf8");
//4 發送指令
$sql="select *from user1";
$result = mysql_query($sql,$conn) or die("Invalid query: " . mysql_error());
//5 接受返回結果,并處理
while($row= mysql_fetch_row($result)){
//第一種遍歷方法
//echo "--$row[0]--$row[1]--$row[2]--$row[3]--$row[4]<br/>";
//第二種遍歷方法
foreach($row as $key=>$val){
echo "--$val";
}
echo "<br/>下一行:<br/>";
}
//6 釋放資源,關閉連接
//釋放內存,這個必須要,釋放的內存資源
mysql_free_result ($result);
//這個可有可無,但是建議有,沒有的話,運行完畢也會關閉!
mysql_close($conn);
?>
~~~
打印內容:
~~~
連接成功
--1--jsh--e10adc3949ba59abbe56e057f20f883e--1234567@qq.com--20
下一行:
--2--??--e10adc3949ba59abbe56e057f20f883e--1234567@qq.com--20
下一行:
~~~

### 細節:
1、$reslust 使用完畢,一定要進行釋放
2、 mysql_close()如果沒有的話,系統也會自動關閉
3、 從$reslust 獲取行數據的時候,處理函數mysql_fetch_row($reslust)返回索引數組,還有三個方法
(1)?mysql_fetch_assoc() 返回一個關聯數組:
是按照表單元素名排序??
~~~
while($row= mysql_fetch_assoc($result)){
echo $row["id"]." ".$row["name"]." ".$row["password"]." ".$row["email"]." ".$row["age"];
echo "<br/>下一行:<br/>";
}
~~~
結果如下:
1 jsh e10adc3949ba59abbe56e057f20f883e 1234567@qq.com 20
下一行:
2 ?? e10adc3949ba59abbe56e057f20f883e 1234567@qq.com 20
下一行:
(2)mysql_fetch_array($result) 返回關聯數組或者索引數組。這個要比上面2個都慢,一般不建議使用
~~~
while($row= mysql_fetch_array($result)){
var_dump($row);
echo "<br/>下一行:<br/>";
}
~~~
結果如下:
~~~
array(10) { [0]=> string(1) "1" ["id"]=> string(1) "1" [1]=> string(3) "jsh" ["name"]=> string(3) "jsh" [2]=> string(32) "e10adc3949ba59abbe56e057f20f883e" ["password"]=> string(32) "e10adc3949ba59abbe56e057f20f883e" [3]=> string(14) "1234567@qq.com" ["email"]=> string(14) "1234567@qq.com" [4]=> string(2) "20" ["age"]=> string(2) "20" }
下一行:
array(10) { [0]=> string(1) "2" ["id"]=> string(1) "2" [1]=> string(2) "??" ["name"]=> string(2) "??" [2]=> string(32) "e10adc3949ba59abbe56e057f20f883e" ["password"]=> string(32) "e10adc3949ba59abbe56e057f20f883e" [3]=> string(14) "1234567@qq.com" ["email"]=> string(14) "1234567@qq.com" [4]=> string(2) "20" ["age"]=> string(2) "20" }
~~~
(3)mysql_fetch_object($result) 把一行數據,當作一個對象返回。
~~~
while($row= mysql_fetch_object($result)){
echo $row->id." ".$row->name;
echo "<br/>下一行:<br/>";
}
~~~
返回結果和第一種一樣,只是取值方法不同。
總結:4種方法,應根據具體情況進行選擇,各有利弊吧!?
### 對數據庫操作 增刪改查 :
~~~
<?php
//1 獲得鏈接鏈接
$conn=mysql_connect("192.168.1.110:3306","root","");
if (!$conn){
die("連接失敗".mysql_error());
}else{
echo "連接成功<br/>";
}
//2 選擇數據庫
mysql_select_db('test', $conn) or die ('Can\'t use test: ' . mysql_error());
//3 增加記錄
// $sql="insert into user1 (name,password,email,age) values ('peipei',md5('woaini'),'peipei@163.com',29)";
//4刪除操作
//$sql="delete from user1 where id=3";
// 5 更新
$sql="update user1 set age=50 where id=2";
//如果是 dml操作,則返回bool
$res=mysql_query($sql,$conn);
if(!$res){
die( "操作失敗<br/>".mysql_error());
}
//看看有幾條數據記錄
if(mysql_affected_rows($conn)>0){
echo "操作成功!<br/>";
}else{
echo "操作失敗!<br/>";
}
mysql_close($conn);
?>
~~~

從上面的兩個文件看出,代碼的復用性和可以維護性不高,在PHP變成眾,通常是將對數據庫的操作,封裝成一個工具類,以及對數據庫常用函數使用!看下面的代碼?
~~~
<?php
class SqlTool{
private $conn;
//鏈接并選擇數據庫
function SqlTool($host,$user,$password,$db){
$this->conn=mysql_connect($host,$user,$password);
if(!$this->conn){
die("鏈接數據庫失敗".mysql_error());
}
mysql_select_db($db,$this->conn);
}
//查詢操作
function execute_dql($sql){
$res=mysql_query($sql,$this->conn) or die("查詢失敗".mysql_error());
return $res;
}
//更新,刪除,添加,
//rturn, 0:失敗,1,成功,2:對行數沒有影響
function execute_dml($sql){
$res=mysql_query($sql,$this->conn);
if(!$res){
echo "操作失敗".mysql_error();
return 0;
}else{
if(mysql_affected_rows($this->conn)>0){
return 1;//成功
}else{
return 2;//沒有任何記錄改變
}
}
}
//下面函數,接受一個查找后的對象,然后把表頭和表的內容打印出來
function show_tables_info($res){
if($res){
//獲得有多少行
// mysql_affected_rows($conn)也可以但是參數是連接的對象;
$rows=mysql_num_rows($res);
//獲得有多少列
$colums=mysql_num_fields($res);
//打印表頭及表內容
echo "<table border=1><tr>";
for($i=0;$i<$colums;$i++){
$field_name=mysql_field_name($res,$i);
echo "<th>$field_name</th>";
}
echo "</tr>";
while($row=mysql_fetch_row($res)){
echo "<tr>";
for($i=0;$i<$colums;$i++){
echo "<td>$row[$i]</td>";
}
echo "</tr>";
}
echo"</table>";
/*mysql_fetch_field 返回一個包含字段信息的對象,具體看手冊
while($field_info=mysql_fetch_field($res)){
echo $field_info->name."<br/>";
}*/
}
}
}
//創建對象
//這邊析構函數使用PHP4,這里可以看析構函數介紹
$sqltool=new SqlTool("192.168.1.110:3306","root","","test");
/*
//添加對象
$sql="insert into user1 (name,password,email,age) values ('peipei',md5('woaini'),'peipei@163.com',29)";
$res=$sqltool->execute_dml($sql);
echo $res."<br/>";
*/
//查找
$sql="select * from user1";
$res=$sqltool->execute_dql($sql);
/*
while($row=mysql_fetch_assoc($res)){
foreach($row as $key=>$val){
echo "[$key]=$val ";
}
echo "<br/>";
}
*/
$sqltool->show_tables_info($res);
//釋放
mysql_free_result($res);
?>
~~~
看效果

補充:
習mysql數據庫,常用[mysql](http://database.51cto.com/art/201009/225564.htm)命令是首先需要掌握的,下面就為您介紹了九種常用mysql命令,希望對您學習常用mysql命令方面能有所幫助。
1 .啟動MYSQL服務?? net start mysql
停止MYSQL服務?? net stop mysql
2 . netstat –na | findstr 3306 查看被監聽的端口 , findstr用于查找后面的在端口是否存在
3 . 在命令行中登陸MYSQL控制臺 , 即使用 MYSQL COMMEND LINE TOOL
語法格式 mysql –user=root –password=123456 db_name
或 mysql –uroot –p123456 db_name
4 . 進入MYSQL命令行工具后 , 使用status; 或\s 查看運行環境信息
5 . 切換連接數據庫的語法 : use new_dbname;
6 . 顯示所有數據庫 : show databases;
7 . 顯示數據庫中的所有表 : show tables;
8 . 顯示某個表創建時的全部信息 : show create table table_name;
9 . 查看表的具體屬性信息及表中各字段的描述
Describe table_name; 縮寫形式 : desc table_name;
1、顯示數據庫
~~~
show databases;
~~~
2、選擇數據庫
~~~
use 數據庫名;
~~~
3、顯示數據庫中的表
~~~
show tables;
~~~
4、顯示數據表的結構?
~~~
describe 表名;
~~~
5、顯示表中記錄?
~~~
SELECT * FROM 表名
~~~
6、建庫
~~~
create databse 庫名;
~~~
7、建表
[]( "復制代碼")
~~~
create table 表名 (字段設定列表);
mysql> create table name(
-> id int auto_increment not null primary key ,
-> uname char(8),
-> gender char(2),
-> birthday date );
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+------------------+
| Tables_in_userdb |
+------------------+
| name |
+------------------+
1 row in set (0.00 sec)
mysql> describe name;
+----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| uname | char(8) | YES | | NULL | |
| gender | char(2) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+---------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
注: auto_increment 自增
primary key 主鍵
~~~
[]( "復制代碼")
8、增加記錄
~~~
insert into name(uname,gender,birthday) values('張三','男','1971-10-01');
~~~
9、修改記錄
~~~
update name set birthday='1971-01-10' where uname='張三';
~~~
10、刪除記錄
~~~
delete from name where uname='張三';
~~~
11、刪除表
~~~
drop table 表名
~~~
12、刪除庫
~~~
drop database 庫名;
~~~
13、備份數據庫?
~~~
mysqldump -u root -p --opt 數據庫名>備份名; //進入到庫目錄
~~~
14、恢復
~~~
mysql -u root -p 數據庫名<備份名; //恢復時數據庫必須存在,可以為空數據庫
~~~
15、數據庫授權
格式:grant select on 數據庫.* to 用戶名@登錄主機 identified by "密碼"
例1、增加一個用戶user001密碼為123456,讓他可以在任何主機上登錄,并對所有數據庫有查詢、插入、修改、刪除的權限。首先用以root用戶連入MySQL,然后鍵入以下命令:
~~~
mysql> grant select,insert,update,delete on *.* to user001@"%" Identified by "123456";
~~~
例2、增加一個用戶user002密碼為123456,讓此用戶只可以在localhost上登錄,也可以設置指定IP,并可以對數據庫test進行查詢、插入、修改、刪除的操作 (localhost指本地主機,即MySQL數據庫所在的那臺主機)
?????? //這樣用戶即使用知道user_2的密碼,他也無法從網上直接訪問數據庫,只能通過MYSQL主機來操作test庫。
?????? //首先用以root用戶連入MySQL,然后鍵入以下命令:
~~~
mysql>grant select,insert,update,delete on test.* to user002@localhost identified by "123456";
~~~
- 前言
- HTML(第一天)
- HTML(第二天)
- DIV+CSS(第一天)
- DIV+CSS(第二天)
- DIV+CSS(第三天)
- DIV+CSS(第四天)
- PHP開發環境配置說明
- PHP基礎數據類型及運算符介紹
- 走進PHP函數
- 走進位運算
- 走進數組及相關數組函數
- 面向對象的編程(類與對象)
- 面向對象的編程(類成員方法用法)
- 構造方法,析構方法
- static,global用法
- 靜態方法
- 面向對象的編程方法
- 接口方法
- 接口VS繼承、final、const
- 錯誤及異常處理機制、錯誤日志
- HTTP協議深度剖析
- 文件下載
- PHP數據庫編程
- 數據庫編程(2)
- 超全局變量
- Zend studio 開發環境入門
- 雇員管理系統(1)
- 雇員管理系統(2)
- 會話技術(cookie session)
- 會話技術 session場景使用介紹!
- PHP.in中session和cookie的配置說明
- PHP文件編程
- 報表及繪圖技術
- 報表及繪圖技術(jpgraph庫使用,Linux安裝及配置說明)
- XML基本語法及DTD介紹
- XML編程(Dom技術)
- XML編程(Xpath技術,simpleXml技術)基礎入門
- 網上支付平臺PHP版本
- javascript基礎入門