php和MySQL的小知識

  • php和MySQL數(shù)據(jù)庫
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ù)庫控制語言
數(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ā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Composer Repositories Composer源 Firegento - Magento模塊Comp...
    零一間閱讀 4,021評論 1 66
  • ziadoz在 Github發(fā)起維護的一個PHP資源列表,內容包括:庫、框架、模板、安全、代碼分析、日志、第三方庫...
    Gundy_閱讀 6,543評論 4 192
  • 1.MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于 Oracle 旗下產品。My...
    黃花菜已涼閱讀 4,663評論 3 60
  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨的應用程序。每個數(shù)據(jù)庫具有一個或多個不同的API,用于創(chuàng)建,訪問,管理...
    chen_000閱讀 4,141評論 0 19
  • 長這么大突然會覺得不開心,不知道是為什么,一個人的時候,偶爾會聽到理想國的夢被敲碎的聲音。周圍人的行為藝術我真的看...
    張簡亦閱讀 250評論 0 0

友情鏈接更多精彩內容