php操作mysql數(shù)據(jù)庫基本函數(shù)
$link = mysql_connect(“數(shù)據(jù)庫服務器地址”,”用戶名”,”密碼”); //連接數(shù)據(jù)庫系統(tǒng)
mysql_query(“set names 網(wǎng)頁文件編碼名”); //設定“連接編碼”;
//也可以這樣做:mysql_set_charset(“網(wǎng)頁文件編碼名”);
mysql_query(“use 數(shù)據(jù)庫名”); //選定要使用的數(shù)據(jù)庫
//也可以這樣做:mysql_select_db(“數(shù)據(jù)庫名”);
然后,才開始正式執(zhí)行要完成的數(shù)據(jù)庫操作任務(語句):
$result = mysql_query(“select / delete /update / insert / desc / show tables /drop .......”);
其他個別補充:
mysql_error():獲取mysql執(zhí)行失敗時的錯誤信息。它通常應用與如下場合:
$result = mysql_query(“select / delete / update / insert / create / dropt ....所有sql語句”);
if( $result === false){
echo “語句執(zhí)行失敗,請參考提示信息:” . mysql_error();
}
else{
//這里是成功的情況,那就后續(xù)處理。。。
}
對于mysql_query()這個函數(shù),可以執(zhí)行“幾乎任何sql語句”,在應用中,通常需要區(qū)分為2情況:
情況1:執(zhí)行沒有數(shù)據(jù)返回的語句,比如:insert, update, delete, create table, create database ,drop ...
這種語句,使用mysql_query()函數(shù),執(zhí)行的結果只有true和false返回:
返回true:表示執(zhí)行成功;
返回false:表示執(zhí)行失??;
情況2:執(zhí)行有數(shù)據(jù)返回的語句:select, show tables, show databases, desc 表名(顯示表結構);
此時,使用mysql_query()函數(shù),返回的結果分為:
如果失?。悍祷氐氖莊alse;
如果成功:返回的是“結果集”——“數(shù)據(jù)集”——就是一行一行數(shù)據(jù),就是有字段的一個“表結構”。它需要我們進一步去“取出”數(shù)據(jù),才能使用其中的數(shù)據(jù),其基本模式為:
$result = mysql_query(“select ... “); //執(zhí)行有返回數(shù)據(jù)的語句
while ( $rec = mysql_fetch_array( $result ) ){
//mysql_fetch_array()會取出該結果集中的“一行數(shù)據(jù)”,并取得該行數(shù)據(jù)后賦值給$rec;
//此$rec就是一個數(shù)組,其下標就是字段名;
//在此while循環(huán)中,mysql_fetch_array()會一次次(一行行)取出結果集中的所有數(shù)據(jù);
然后,在這里就可以處理該數(shù)組$rec了:
“fetch函數(shù)”的3種形式的辨析:
假設mysql_query(“select id, age, name ”)執(zhí)行的結果集為$result;
$result = mysql_query(“select id, age, name ”);
mysql_fetch_assoc($result):得到的數(shù)組類似這樣:
array(“id” => 1, “name” => “user1”, “age”=>18);
mysql_fetch_row($result):得到的數(shù)組類似這樣:
array(0=> 1, 1=> “user1”, 2=>18);
mysql_fetch_array($result):得到的數(shù)組類似這樣:
array(“id” => 1, “name” => “user1”, “age”=>18, 0=> 1, 1=> “user1”, 2=>18);
擴展php中操作mysql數(shù)據(jù)的幾個函數(shù):
$n1 = mysql_num_rows(結果集); //獲得該結果集的數(shù)據(jù)行數(shù);
$n2 = mysql_num_fields(結果集); //獲得該結果集的數(shù)據(jù)列數(shù);
$name = mysql_field_name(結果集, $i ); //獲得結果集的第i個字段的名字!i從0開始算起
數(shù)據(jù)控制語言,是用于對mysql的用戶及其權限進行管理的語句;
用戶管理
用戶數(shù)據(jù)所在位置:
mysql中的所有用戶,都存儲在系統(tǒng)數(shù)據(jù)庫(mysql)中的user 表中——不管哪個數(shù)據(jù)庫的用戶都保存在數(shù)據(jù)庫mysql的user表中
創(chuàng)建用戶:
形式:
create user ‘用戶名’@’允許登錄的地址/服務器’ identified by ‘密碼’;
說明:
1,允許登錄的地址/服務器就是,允許該設定的位置,來使用該設定的用戶名和密碼登錄,其他位置不行;
2,可見,mysql的安全身份驗證,需要3個信息。
刪除用戶:
drop user ‘用戶名’@’允許登錄的地址或服務器名’;
修改用戶密碼:
修改自己的密碼:
set password = password('密碼');
修改他人的密碼(前提是有權限):
set password for '用戶名'@'允許登錄的地址' = password('密碼');
權限管理
權限是什么?
mysql數(shù)據(jù)庫,將其中所能做的所有事情,都分門別類分配到大約30多個權限中去了,其中每個權限,都是一個“單詞”而已!,比如:
select:代表可以查詢數(shù)據(jù);
update:代表可以修改數(shù)據(jù);
delete:代表可以刪除數(shù)據(jù);
.......
其中,有一個權限名叫做“all”:表示所有權限;
授予權限:
形式:
grant 權限列表 on 某庫.某個對象 to ‘用戶名’@’允許登錄的位置’ 【identified by ‘密碼’】;
說明:
1,權限列表,就是,多個權限的名詞,相互之間用逗號分開,比如: select, insert, update
也可以寫:all
2,某庫.某個對象,表示,給指定的某個數(shù)據(jù)庫中的某個“下級單位”賦權;
下級單位有:表名,視圖名,存儲過程名; 存儲函數(shù)名;
其中,有2個特殊的語法:
*.*: 代表所有數(shù)據(jù)庫中的所有下級單位;
某庫.* :代表指定的該庫中的所有下級單位;
3,【identified by ‘密碼’】是可省略部分,如果不省略,就表示賦權的同時,也去修改它的密碼;
但:如果該用戶不存儲,此時其實就是創(chuàng)建一個新用戶;并此時就必須設置其密碼了
剝奪權限:
形式:
revoke 權限列表 on 某庫.某個對象 from ‘用戶名’@’允許登錄的位置’
其含義,跟grant中完全一樣;
事務控制語言
什么叫做“事務”:
想象一個場景:
小明給小花 匯款 5000元 買 IPHONE,操作界面不用管,不管什么操作界面,最終都要落實到這樣兩條語句的執(zhí)行:
update 存款表 set money = money - 5000 where 賬戶=’小明’;
update 存款表 set money = money + 5000 where 賬戶=’小花’;
當,第一條語句執(zhí)行成功,突然斷電了(或任何其他情況),就會造成數(shù)據(jù)的“不一致”。
要解決這個問題,就是“事務”的功能:
事務就是用來保證多條“增刪改”語句的執(zhí)行的“一致性”:要么都執(zhí)行完成,要么都沒有執(zhí)行;
事務的特點:
? 原子性:一個事務中的所有語句,應該做到:要么全做,要么一個都不做;
? 一致性:讓數(shù)據(jù)保持邏輯上的“合理性”,比如:一個商品出庫時,既要讓商品庫中的該商品數(shù)量減1,又要讓對應用戶的購物車中的該商品加1;
? 隔離性:如果多個事務同時并發(fā)執(zhí)行,但每個事務就像各自獨立執(zhí)行一樣。
? 持久性:一個事務執(zhí)行成功,則對數(shù)據(jù)來說應該是一個明確的硬盤數(shù)據(jù)更改(而不僅僅是內存中的變化)。
事務模式:
事務模式是指:
在我們的cmd命令行模式中,是否開啟了“一條語句就是一個事務”的這個開關:
默認情況下(安裝后),這個模式是開啟的,稱為“自動提交模式”;
set autocommit = 1;
這樣之后,每條增刪改語句,都會立即生效;
我們可以把它關閉,那就是“人為提交模式”——即需要人為提交;
set autocommit = 0;
這樣之后,所有增刪改語句,都必須使用commit之后,才能生效;
首先,我們以前的經(jīng)驗都是:一條增刪改語句,一旦回車,執(zhí)行就完成(前提是不出錯);
現(xiàn)在,我們關閉該模式:
然后,再去執(zhí)行一條簡單的insert語句:
對比:
執(zhí)行前:
然后,執(zhí)行insert:
但是,再查看結果,即insert執(zhí)行之后,數(shù)據(jù)并沒有出現(xiàn):
然后,再去“人為提交”:
然后,再核查數(shù)據(jù),就有了:
事務執(zhí)行的基本流程
1,開啟一個事務:
start transaction; //也可以寫成:begin;
2,執(zhí)行多條增刪改語句; //也就是相當于希望這多條語句要作為一個“不可分割”的整體去執(zhí)行的任務
3,判斷這些語句執(zhí)行的結果情況,并進行提交或回滾:
if( 沒有出錯 ){
commit; //提交事務;此時就是一次性完成;
}
else{
rollback; //回滾事務;此時就是全部撤銷;
}
具體分2種情況來做:
在cmd中,就是憑“肉眼”觀察是否有錯:
沒有錯誤的情況:
有錯誤的情況:
在php中:
$connect = mysql_connect("localhost","root","aaa");
mysql_query("set names utf8");
mysql_query("use phpdatabase");
$sql = "start transaction";
mysql_query($sql);
$sql2 = "insert into tab_int(f1,f2,f3) values (12,3,43);";
$result = mysql_query($sql2);
$sql3 = "insert into tab_int(f1,f2,f3) values (2,3,1);";
$result2 = mysql_query($sql3);
if($result && $result2){
mysql_query("commit;")
echo "事務執(zhí)行完成;所有任務都完成"
}else {
mysql_query("rollback;");
echo "事務執(zhí)行失敗,數(shù)據(jù)沒有被修改!"
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。