PHP&MySQL

PHP&MySQL基礎筆記
第一章 PHP環境搭建與變量使用
第二章 PHP變量轉換測試、常量與運算符
第三章 PHP流程控制與函數
第四章 PHP中的數組定義、遍歷與超全局數組
第五章 數組的相關處理函數
第六章 字符串相關處理函數
第七章 PHP數學對象、日期對象
第八章 錯誤處理
第九章 PHP動態圖相處理
第十章 PHP文件系統與文件上傳下載
第十一章 PHP面向對象編程
第十二章 Mysql數據庫設計
第十三章 Mysql數據庫操做
第十四章 PHP PDO數據庫對象
第十五章 Cookie與Session技術
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=javascript

Wamp環境搭建:
1、wamp集成包(windows下建議使用)
2、單獨安裝apache、mysql和php軟件包(linux下建議使用)
-----------------------------------------------------------------------------------
php版本切換
一、解壓php-5.6.6-Win64-VC11-x64,並更名爲php5.6.6
二、把php5.6.6拷貝到wamp/bin/php下便可
三、把php5.5.12中的"phpForApache.ini"和"wampserver.conf"拷貝到php5.6.6下
四、把phpForApache.ini中的extension_dir = "c:/wamp/bin/php/php5.5.12/ext/"改成extension_dir = "c:/wamp/bin/php/php5.6.6/ext/"便可
五、把wamp軟件重啓一下,便可切換php5.6.6版本
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
打開mysql控制檯    
enter 進入mysql數據庫
默認用戶名:root
----------------------------------
cmd命令符打開mysql時 輸入
mysql -u root -pysw    
回車進入
----------------------------------    
改密碼輸入代碼以下:
set password=passwod('ysw');
瀏覽器輸入localhost/phpmyadmin 回車打開php文件的mysql服務器控制檯
----------------------------------
訪問權限禁止時
在apps文件夾下的phpmyadmin軟件下找到config.inc.php文件
註釋代碼如下:
$cfg['Servers'][$i]['auth_type'] = 'config';
便可正常打開
-----------------------------------------
如何訪問phpmysql
http://localhost/phpmyadmin
-----------------------------------------
本地服務器域名爲localhost
訪問服務器必須用域名或ip地址

如何修改mysql服務器的登陸密碼:
1、打開mysql命令客戶端控制檯
二、set password=password('123');

默認首頁:
index.html
index.php
php頁面的任意地方可寫php
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
php
php變量定義:(變量前加$)
$name='user1';
echo "my name is $name .";

把提示錯誤屏蔽掉:
C:\wamp64\bin\php\php5.6.25/phpForApache.ini
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

養成習慣------>出現變量則用{ }括起來明確指定變量----->避免混亂
--------------------------------
單雙引號的區別:
" "雙引號中可解析變量
' ' 單引號中不能解析變量
---------------------------------
字符串鏈接符:
1、點

變量類型(8種):
1、標準類型
1、整型
2、浮點型
3、字符串
4、布爾型

2、複合類型
5、數組
6、對象

3、特殊類型
7、資源
八、NULL

整型:
$num=10;

浮點型:
$num=10.5;

3、字符串
$str='hallo world';

4、布爾型
$str=ture;

5、數組
索引數組
$arr=array(1,2,5);
$arr=array('jdd1','jdd2','jdd3');
php將json對象與數組合二爲一

關聯數組
$arr=array(
    'name'=>'jdd',
    'age'=>'20',
    'sex'=>'nv'
    );

混合數組
$arr=array('jdd1','jdd2','sex'=>'nv');

6、對象
$obj=new Object();
現有類後有對象
class Person{
    public $name='jdd';
    public $sex='nv';
    public $age='20';

    public function say{
    echo "my name is {$this->name}";
    }
}

$jdd=new Person();

js是基於對象語言(類不用本身寫)
php是面嚮對象語言
js中對象與屬性用.鏈接
php中對象與屬性用->鏈接

7、資源
$link=mysql_content('localhost','root','123');

八、NULL

php設置默認字符集爲utf-8
header('content-type:text/html;charset=utf-8');

變量輸出:
$str='user'
一、echo
echo $str;
二、var_dump();輸出變量的值並打印變量類型和變量長度
var_dump($str);
三、print;
print $str;
四、printf;格式化輸出
$a='123abc';
$b='345';
printf('-------%d--------%s-------',$a,$b);
五、sprintf;  只返回格式化字符串
$a='123abc';
$b='345';
$ss=sprintf('-------%d--------%s-------',$a,$b);
echo "$ss";
六、print_r();
echo '<pre>';
print_r($arr);
echo '</pre>';
專門用來打印數組
------------------------------------------------------------------------------------
測試變量是否存在
isset();
var_dump(isset());
返回值爲假的狀況有未定義和null兩種

測量變量是否爲空
empty();
返回值爲真的狀況有:
$asd=null;
$asd=' ';
$asd='0';
$asd=0;
$asd=0.0;
$asd=false;
$asd=array();

變量類型測試
1、獲取類型結果(返回值爲字符串)
gettype();
echo gettype($asd);

2、精確判斷類型(返回值爲布爾類型)
is_int($asd);
is_string($asd);
is_array($asd);
is_object($asd);
is_null($asd);
is_resource($asd);
is_scalar($asd);
is_callable($asd);

變量類型轉換
變量類型自動轉換:
1、整型轉字符串
$a=10;
echo $a.'abc';
2、字符型轉整型
$a='10abc';
echo $a+10;
3、全部類型轉布爾類型
爲假的狀況共7種:
$asd=null;
$asd=' ';
$asd='0';
$asd=0;
$asd=0.0;
$asd=false;
$asd=array();

變量強制轉換
(int)$str
(float)$str
(bool)$str
(string)$str
(array)$str
(object)$str
------------------------------------------------------------------------------------
常量的定義和使用
1、定義:
define('HOST','localhost');

2、輸出:
echo HOST;
echo 'my name is '.HOST.'!!!';
常量在鏈接時只能使用.鏈接!常量名需大寫!

3、判斷一個常量在不在
var_dump(define('HOST'));

預約義常量:
__LINE__當前輸出行數
__FILE__當前文件目錄
M_PI圓周率
__FUNCTION__當前函數名
------------------------------------------------------------------------------------
運算符
1、一元運算符++   --
$a++
==$a
2、二元運算符
    數學運算符
    +-*?%
    賦值運算符
    = += -= *= /= %= .=
    比較運算符
    ==
    !=
    >
    <
    >=
    <=
    ===
    !==
    邏輯運算符(開關)
    $$(與)
    ||(或)
    |(非)


3、三元運算符
    $a?$b:$c;

運算符優先級:
一、++,--
二、*   /  %
三、+  -  .
四、<  <= > >=
五、==  !=  ===  !==
六、&   |
七、&& ||
8、? :
九、=  +=  -=  *=  /= %=

@用於臨時屏蔽錯誤

->用於對象調用屬性和方法
$jdd=new Person();
echo "my age is {$jdd->age}</br>";
echo $jdd->say();

=>用於關聯數組
$arr2=array(
    'name'=>'jdd',
    'age'=>'20',
    'sex'=>'nv'
    );

new
instanceof
class Person1{}
$obj= new Person1();
var_dump($obj instanceof Person1);
------------------------------------------------------------------------------------
單分支結構
一、if...elseif...else

多分支結構:
一、while
二、for
特殊流程控制:
一、break
結束整個循環
二、continue
結束本次循環
三、exit(經常使用於分段代碼測試)
結束整個頁面腳本
四、die()
等同於exit

-------------------------------------------------------------------------
函數
1、語言結構
if()    for()    while()    switch()    
array()    echo()    print()    list()
isset()    unset()    foreach()
exit()    die()    include()
required()    empty()
2、系統函數
count();
array_merge();
3、自定義函數
function sum($i,$j){
    return $i+$j;
}
echo sum(2,5);
---------------
回調函數:
fuction show($i,$j,$s){
    return $s{$i,$j}
}
fuuction sum(){
    return $a+$b;
}
echo show(1,2,'sum');

變量的做用域:
局部變量
全局變量
超全局變量
    1、常量
    2、預約義常量
    3、超全局數組
$i=10;
function show(){
    global $i;    //全局變量
    $i++;        //局部變量
}
show();
函數裏面變量與函數外變量互不相關

function show(){
    static $i;    //靜態變量    變量與與外界不干擾
    $i++;        
}
show();
-----------------------------------------------------------------------
函數參數:
1.自定義參數
2.默認參數
3.回調參數
4.引用參數
-------------------
引用變量:
$a=10;
$b=&$a;
$b=122;
echo $a;
------------------
變量函數
function show(){
    echo "sadfasdfsdfd";
    echo "sadfasdfsdfd";
    }
$var='show';
$var();
------------------
判斷是不是內置函數
function_exists("tab");
------------------
獲取當前函數所傳進的全部變量,以數組形式返回
func_get_args();
獲取當前函數所傳進的變量個數
func_num_args();

function showw(){
    $arr=func_get_args();
    echo "<pre>";
    print_r($arr);
    echo "</pre>";
}
showw(2,3,5,8,5,8);
-----------------------------------------------
.遞歸函數:
思路:由外向內延伸,又由內向外展開
每一層都先執行外層中的內層函數上部分,執行到最底層時開始執行最底層的外層函數中內層函數的下部分!直到執行完第一層函數的內層函數的下部分!
$b=4;
function sum($i){
    $tot+=$i;
    echo "$i<br/>";
    if ($i>1) {
        $tot+=sum($i-1);
    }
    echo "$i<br/>";
    return $tot;
}
echo sum($b)
---------------
提升代碼重用性:
<?php
include "idf.php";
?>
<?php
requuire "idf.php";
?>
1.include包含腳本失敗時不會阻止腳本的執行
2.require包含腳本失敗時會阻止腳本的執行
-----------------------------------------------

數組元素(鍵值對)
1.下標|建|key
2.值|value

數組分類:
索引數組
$arr=array(1,3,5)
關聯數組
$arr=array('name'=>'shiyi','xex'=>'name','age'=>20);
混合數組
$arr=array('shiyi','xex'=>'name','age'=>20);
---------------------
$arr0=array(
    0=>'jdd',
    'age'=>'20',
    3=>'nv'
    );
$arr0[]=jjh;    //數組定義時無鍵值時在原數組兼職基礎上加
$arr0[8]=jjh;
$arr0[]=jjh;
$arr0[78]=jjh;
$arr0[]=jjh;
$arr0[2]=jjh;
$arr0[]=jjh;
echo "<pre>";
print_r($arr0);
echo "</pre>";
--------------------
多維數組
$arro=array('jdd1','jdd2','jdd3',3=>'jdd4','sex'=>'nv');
$arrp=array('jdd1','jdd2','jdd3',3=>'jdd4','sex'=>'nv');
$arrk=array('jdd1','jdd2','jdd3',3=>'jdd4','sex'=>'nv');
// 數組遍歷
$arr0=array(
    0=>'jdd',
    'age'=>'20',
    3=>'nv'
    );
$arr0[3]=$arro;
$arr0[3][3]=$arrp;
$arr0[3][3][3]=$arrp;
$arr0[3][3][3][3]=$arrp;
多維數組遍歷
foreach($arr0[3] as $key=>$value){
    echo $key."=>".$value.'<br>';
}
打印數組
一、print_r($arr);
二、var_dump($arr);
爲了打印更清晰在外面加pre標籤
echo '<pre>';
print_r($arr);
echo '</pre>';
-----------------------------------------------
.數組遍歷
for(){}
當數組遍歷時,字符串下標或者下表爲跨度大不適用

經常使用遍歷方法
foreach($arr as $key=>$value){
    echo $key."=>".$value;
}
list //看不到字符串下標的值
each
while

next()
prev()
end()
reset()

list必需要數組爲索引下標,list以數組下標順序賦值給變量
$arr3=array('jdd1','jdd2','jdd3',3=>'jdd4','sex'=>'nv');
list($z,$x,$v,$s)=$arr3;
echo $z;
echo "<br/>";
echo $x;
echo "<br/>";
echo $s;
echo "<br/>";
echo $v;
echo "<br/>";

$arr4=array('jdd1','jdd2','jdd3',3=>'j;;
echo "<pre>";
print_r($arr7);
echo "</pre>";
此代碼顯示效果爲:
Array
(
    [1] => jdd1
    [value] => jdd1
    [0] => 0
    [key] => 0
)
則:原始數組遍歷這樣玩:
$arr4=array('jdd1','jdd2','jdd3',3=>'jdd4','sex'=>'nv');
while (list($k,$v)=each($arr4)) {
    echo "{$k}-------{$v}<br>";
}
------------------------------------------------------
超全局數組

1.$GLOBALS
包含如下超全局數組的數據
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SERVER

2.$_SERVER數組:
Array
(
    [HTTP_HOST] => localhost
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_CONNECTION] => keep-alive
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_CACHE_CONTROL] => max-age=0
    [PATH] => C:\Program Files\Java\jre1.8.0_121\bin;
    [SystemRoot] => C:\windows
    [COMSPEC] => C:\windows\system32\cmd.exe
    [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    [WINDIR] => C:\windows
    [SERVER_SIGNATURE] => Apache/2.4.23 (Win64) PHP/5.6.25 Server at localhost Port 80

    [SERVER_SOFTWARE] => Apache/2.4.23 (Win64) PHP/5.6.25
    [SERVER_NAME] => localhost
    [SERVER_ADDR] => ::1
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => ::1
    [DOCUMENT_ROOT] => C:/wamp64/www
    [REQUEST_SCHEME] => http
    [CONTEXT_PREFIX] =>
    [CONTEXT_DOCUMENT_ROOT] => C:/wamp64/www
    [SERVER_ADMIN] => wampserver@wampserver.invalid
    [SCRIPT_FILENAME] => C:/wamp64/www/index.php
    [REMOTE_PORT] => 49177
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => y=2015&m=9
    [REQUEST_URI] => /index.php?y=2015&m=9
    [SCRIPT_NAME] => /index.php
    [PHP_SELF] => /index.php
    [REQUEST_TIME_FLOAT] => 1505139192.491
    [REQUEST_TIME] => 1505139192
)

['SERVER_NAME']服務器域名
['SERVER_ADDR']客戶端ip
['SERVER_ADDR']服務器ip
['SERVER_POST']服務器端口
['DOCUMENT_ROOT']網站根目錄
['SCTIPT_FILENAME']當前腳本的系統絕對路徑
['REQUEST_URL']當前腳本網站的絕對路徑
['PHP_SELF']當前腳本網站的絕對路徑

查看服務器信息
3.$_REQUEST
所有接收$_POST和$_GET所能傳的值
4.$_POST
http://localhost/index.php?y=2015&m=9
form接收地址欄中參數,表單中提交的值,傳參數不可見

5.$_GET
http://localhost/index.php?y=2015&m=9
a、form接收地址欄中參數,傳參數可見

6.$_ENV
PHP中的$_ENV存儲了一些系統的環境變量,由於牽扯到實際的操做系統,因此不可能給出$_ENV的完整列表。
$_ENV爲空的可能緣由:你的php.ini的variables_order值爲"GPCS",也就是說系統在定義PHP預約義變量時的順序是 GET,POST,COOKIES,SERVER,沒有定義Environment(E),你能夠修改php.ini文件的variables_order值爲你想要的順序,如:"EGPCS"。這時,$_ENV的值就能夠取得了。
EGPCS是Environment、Get、Post、Cookies、Server的縮寫,這是PHP中外部變量來源的所有範圍
7.$_FILES
8.$_COOKIE
9.$_SESSION

數組函數

1.數組中的鍵值操做函數:
array_value();
    獲取數組中的值
array_keys();
    獲取數組中的鍵+-
in_array();
    檢查一個值是否在數組中
array_key_exists();
    檢查一個鍵是否在數組中
array_filp();
    鍵和值對調;
array_reverse();
    數組中的值反轉;
------------------------------
2.統計數組的元素和惟一性
count();
    統計數組中元素的個數
array_count_values();
    統計數組中每一個值出現的次數
array_unique();        
    統計數組中不重複值
------------------------------
3.使用回調函數處理數組的函數
array_filter(數組,回調函數);
    數組值過濾(返回原數組中的經過篩選的數據)
array_map(回調函數,數組);
    將回調函數做用到給定數組的單元上(可返回元數據處理後的數據)
------------------------------
4.數組的排序函數(都會改變原數組)  
1.sort();
    按值把數組值進行排序,升序,不保留key
2.rsort();
    按值把數組值進行排序,降序,不保留key
3.asort();
    按值把數組值進行排序,升序,保留key
4.arsort();
    按值把數組值進行排序,降序,保留key
5.ksort();
    按鍵把數組值進行排序,升序,保留key
6.krsort();
    按鍵把數組值進行排序,降序,保留key
7.natsort()
    字符串排序
    按天然數升序排序
    
8.natcasesort()
    忽略大小寫的天然數排序
9.array_multisort();
    用一個數組對另外一個數組進行排序
    array_multisort($arr3,SORT_DESC,$arr2);    降序排序
    array_multisort($arr3,SORT_ASC,$arr2);    升序排序
---------------------
$arr2 = array(1=>1,5=>'G2',3=>'Hg3',4=>'g7',7,5,'sec'=>'bb63','age'=>8);
foreach ($arr2 as $value) {
    $arr3[]=strlen($value);
}
array_multisort($arr3,SORT_DESC,$arr2);
$arr2爲大數組
$arr3爲小數組,是大數組中的某種關係
---------------------
字符串長度測量函數:
string(字符串)
---------------------
5.數組中的截取函數
array_slice($arr,start,end);
在數組$arr從start開始截end個,不改變原數組
array_splice();
在數組$arr從start開始截end個,改變原數組
array_combine(keys, values);
array_combine($arr1,$arr2);
將$arr1的鍵和$arr2的值合併爲一個新數組
--------
$arr1 = array(1=>3,5=>'G2',3=>'Hg3',4=>'g7',0,7,'sec'=>'bb68','age'=>9);
$arr2 = array(1=>1,5=>'G2',3=>'Hg3',4=>'g7',7,5,'sec'=>'bb63','age'=>8);
$arr3 = array_combine($arr1,$arr2);
echo "<pre>";
print_r($arr3);
echo "</pre>";
結果:
Array
(
    [3] => 1
    [G2] => G2
    [Hg3] => Hg3
    [g7] => g7
    [0] => 7
    [7] => 5
    [bb68] => bb63
    [9] => 8
)
---------------------
array_merge($arr1,$arr2);
$arr1的鍵值與$arr2的鍵值合併爲一個新數組
---------------------
$arr1 = array(1=>3,5=>'G2',3=>'Hg3',4=>'g7',0,7,'sec'=>'bb68','age'=>9);
$arr2 = array(1=>1,5=>'G2',3=>'Hg3',4=>'g7',7,5,'sec'=>'bb63','age'=>8);
$arr3 = array_merge($arr1,$arr2);
echo "<pre>";
print_r($arr3);
echo "</pre>";
結果:
Array
(
    [0] => 3
    [1] => G2
    [2] => Hg3
    [3] => g7
    [4] => 0
    [5] => 7
    [sec] => bb63
    [age] => 8
    [6] => 1
    [7] => G2
    [8] => Hg3
    [9] => g7
    [10] => 7
    [11] => 5
)
當鍵名爲字符串,重複時發生覆蓋
-------------------
$str=implode($arr,'_');
implode()的別名join($arr,'_');
將數組中全部值用'_'鏈接,返回字符串;
$str=explode('_',$str);
將字符串用'_'拆分,返回一個數組;
----------------------------------------
6.數組與數據結構
array_pop();
從最後彈出一個彈出值
array_push();
從最後壓入一個值,返回數組中值的個數
array_shift();
從前面返回一個彈出值
array_unshift();
從前面插入一個值,返回數組中值的個數
----------------------------------------
7.其餘有用的數組處理函數
array_rand();
從數組中隨機取一個key;
shuffle();
打亂數組
array_sum();
數組中全部值的和;(值中有數字時可用)
array_product();
數組中全部值的乘積;(全部值均爲數字時可用)
range();
獲取一個範圍內數組
------------------
驗證碼:
$arr1 = range(0,9);
$arr2 = range(a,z);
$arr3 = range(A,Z);
$arr4 = array_merge($arr1,$arr2,$arr3);
shuffle($arr4);
$arr5 = array_slice($arr4,0,4);
$str= implode($arr5,'-');
echo "<pre>";
print_r($str);
echo "</pre>";
-------------------
8.刪除
unset()
變量刪除,數組,數組值刪除
unset($a);
unset($arr);
unset($arr[5]);
------------------------------------------------------------------------------------------------------------------
字符串處理函數
1.字符串定義
    $str='Hello word';
2.輸出字符串
    echo $str;
    print $str;
    printf('----%s-----',$str);
    sprintf('----%s-----',$str);
    die("輸出一條錯誤消息");
3.字符串鏈接
    echo '<h1>'.$arr.'</h1>';
    echo "<h1>{$arr}</h1>";
4.經常使用的一些字符串格式化函數
    1.取出空格和字符串填補函數
        ltrim()
        去除左側的空格
        rtrim()
        去除右側的空格
        trim()
        去除左側和右側空格
        str_pad($str,n,'-');
        將字符串右側少於n個字符的位置補成-;
        str_pad($str,n,'+',STR_PAD_LEFT);
        將字符串左側少於n個字符的位置補成+;
        str_pad($str,n,'+',STR_PAD_BOTH);
        將字符串左右少於n個字符的位置平均補成+;
        str_repeat('-',100);
        重複輸出100個'-',返回字符串;
    2.字符串大小寫轉換
        strtolower($str);
        字符串轉小寫;
        strtolower($str);
        字符串轉小寫;
        ucfirst();
        句子首字母大寫
        ucwords();
        單詞首字母大寫
    3.與html標籤相關聯的字符串函數
        nl2br()
        把\n換行符轉義爲br標籤
        htmlspecialchars();轉實體
        代碼轉html實體
        htmlspecialchars_decode();解實體
        實體轉html代碼
        htmlspecialchars($str);
        $str="<h1>aaaaaaa</h1>";轉爲:$str="&lt;h1&gt;aaaaaaa&lt;/h1&gt;";
        strip_tags();
        除去html代碼
        addslashes();
        將單引號前加\轉義避免語句混亂
        stripslashes();
        數據從數據庫出來的時候將\去除
    4.其餘字符串格式化函數
        strrev();
        將字符串反轉
        •strlen();
        獲取字符串長度
        number_format($str,0,'',',');
        數字貨幣格式化
        ---------
        $str="132435434352436.112";
        $str=strrev($str);
        $arr=str_split($str,3);
        $str2=join(',',$arr);
        echo strrev($str2);
        ----------
        $str='41465321541413213';
        function nf($str,$var){
            $str=strrev($str);
            $arr=str_split($str,3);
            $str2=join($var,$arr);
            return strrev($str2);
        }
        echo nf($str,',');
        ----------
        md5();
        將字符串加密爲32位字母數字組合
        str_shuffle($str);
        打亂字符串順序
        substr($str,m,n);
        截取字符串從m位開始截取n位
        str_split($str,3);
        將字符串每三個分割一下變爲數組的一個元素
        strpos('/');
        第一個/字符位置    
        strrpos('/');
        倒數第一個/字符位置    
        ---------
        $str='/www/wsyjlly/mess/index.php';
        $pos=strrpos($str,'/');
        echo substr($str,$pos+1);
        //截取目錄部分
        $str='/www/wsyjlly/mess/index.php';
        $pos=strrpos($str,'/');
        echo substr($str,0,$pos+1);
        ----------
        str_replace('wsyjlly','WSYJLLY',$str);
        字符串替換函數
        返回替換後字符串
        strstr($str,'mess');
        查找字符串的首次出現
    5.路徑處理函數
        basename();
        截取路徑中文件部分
        dirname();
        截取文件中的目錄部分
        ------
        pathinfo();
        目錄解析
        $str='/myshop/web/index.php';
        $arr=pathinfo($str);
        echo "<pre>";
        print_r($arr);
        echo "</pre>";
        ------
        處理結果爲:
        Array
        (
            [dirname] => /myshop/web
            [basename] => index.php
            [extension] => php
            [filename] => index
        )
        ------
        parse_url();
        解析網址
        $str='http://wwww.baidu.com/myshop/web/index.php?id=5&name=banee';
        $arr=parse_url($str);
        echo "<pre>";
        print_r($arr);
        echo "</pre>";
        ------
        Array
        (
            [scheme] => http
            [host] => wwww.baidu.com
            [path] => /myshop/web/index.php
            [query] => id=5&name=banee
        )
        parse_str();
        ----------------------------
        $_GET()方法實現
        function get(){
            $query=$_SERVER['QUERY_STRING'];
            $arr=explode('&',$query);
            foreach ($arr as $value) {
                $arr2=explode('=', $value);
                $arr3[$arr2[0]]=$arr2[1];
            }
            return $arr3;
        }
        echo "<pre>";
        print_r(get());
        echo "</pre>";
        -------------------------
    6.支持多字節文字
        mb_substr();
-----------------------------------------------------------------------------------------------------------

正則的使用場景:
1.檢查手機格式
/^\d{11}$/
2.檢查郵箱格式
/^\w+@\w+\.\w+$/
3.檢查手機是否以139開頭
/^139\d{8}$/
正則匹配的函數:
    preg_match('/^\d{11}$/',$str);
    preg_match('/^139\d{8}$/',$str);
    preg_replace($ptn,$str,$mt);
    preg_grep();正則數組搜索函數,在數組中搜索包含指定值的元素
    preg_split();正則分割函數
------------
$arr=array(
    'a'=>'Linux is very much!',
    'b'=>'php is very much!',
    'c'=>'java is very much!',
    'd'=>'jquery is very much!',
);
$arr=preg_grep('/linux|java|jquery|php/i',$arr);
echo "<pre>";
print_r($arr);
echo "</pre>";    
------------
$str='2014-10+5/55=66';
$mt=preg_split('/-|\+|\/|=/',$str);
echo "<pre>";
print_r($mt);
echo "</pre>";    
匹配結果:
Array
(
    [0] => 2014
    [1] => 10
    [2] => 5
    [3] => 55
    [4] => 66
)
------------



$str="php mysql is admin javascript css and jquery php Java PhP LInux lanp mysqL JavE sql";
$ptn='/php/i';
preg_match($ptn,$str,$mt);(單個匹配)     $ptn爲匹配的正則表達式 $str爲要匹配的字符串 $mt爲返回的匹配到的數組
preg_match_all($ptn,$str,$mt);(多個匹配)
echo "<pre>";
print_r($mt);
echo "</pre>";    



複雜的字符串替換環境:
向後引用
$str='2017-9-25';
echo preg_replace('/(\d+)\-(\d+)\-(\d+)/','$1.$2.$3',$str);

$str='2017-9-25';
$ptn='/(\d+)\-(\d+)\-(\d+)/';
$rep='$1.$2.$3';      //或$rep='\\1.\\2.\\3';
echo preg_replace('$ptn,$rep,$str);
-----------------
正則表達式
1.原子
2.元字符
3.模式修正符

原子
    1.任意一個字符除了換行符
    .
    /p.p/
    2.單個字母、數字
    a-z a~z其中任意一個字符
    /[a-z]/
    A-Z A~Z其中任意一個字符
    /[A-Z]/
    0-9    0~9其中任意一個字符
    /[0-9]/
    /^[0-9]/    除了0~9的其餘任意一個字符 ^表明取反
    3.模式單元
    (abc) 匹配abc而且組成一個單元
    4.原子表
    [abc] 它中的任意一個字符a或b或c
    5.從新使用的模式單元
    \\1,$1

    普通轉義字符
    6.\d--------匹配任意一個數字
    /\d/
    7.\D     匹配任意一個非數字
    /\D/
    8.\w     匹配任意字母、數字、下劃線
    /\w/
    9.\W     匹配非字母數字
    /\W/
    10.\s     匹配空白字符
    /\s/
    11.\S     匹配除了空白字符的其餘字符
    /\S/
    
    轉義元字符
    \*        \.        \[        \]、
                                                                               
元字符    加在原子後                                                  
    *        任意多個前面的原子
    +        多個前面的原子
    ?        前面一個原子無關緊要
    |        或
    \b         單詞邊界
    /\b\d{1,2}\b/
    \B         非單詞邊界
    {3}
    {3,7}
    /\d{3,7}/im
    {3,}
    ^ 以……開頭
    /php^/im
    $ 以……結尾
    /php$/im
模式修正符
    忽略大小寫i
    /p.p/i
    貪婪模式(最小化匹配)
    /p.p/U
    多行修正符(把\n視爲多行)
    /\n/m
    把多行視爲獨立的一行
    /(.+)/s
    /php|java/i
    匹配php或java
----------------------------------------------------------------------------------------------------------
數學函數
1.mix();    最大值
mix(1,3,5,7,9);
mix(array('1,3,5,7,9'));
2.min();    最小值
3.round();    四捨五入
4.ceil();    進1
5.floor();    舍1
6.mt_rand();隨機數
mt_rand(0,5);取0~5中的隨機的一個整數
mt_rand();    取21億內的一個隨機整數
----------------------------------------------------------------------------------------------------------
日期函數
time()
microtime();微秒
strtotime()    把字符串轉時間戳
date();        把時間戳轉日期字符串
date('Y-m-d H:i:s',0);
date格式化參數
Y:2017年
m:01~12月
n:1~12月
d:01~21天
j:1~31天
H:24小時
h:12小時
i:00-59分
s:00-59秒
w:0~6周
A:AM或PM
a:am或pm
L:是否閏年
t:某月天數
-------------
閏年定義:
1.能被4整除但不能被100整除
2.能被4整除而且能被100整除且能被400整除
-------------
C:\wamp64\bin\apache\apache2.4.23\bin
修改apache服務器中php配置文件可修改默認時間戳:date.timezone ="UTC"
-------------
php的錯誤處理
1.錯誤報告級別
2.調整錯誤報告級別
-------------
C:\wamp64\bin\apache\apache2.4.23\bin
修改apache服務器中php配置文件可修改報錯狀況
設置是否報錯:
display_errors = On
設置報錯級別:
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED    (~表示除了。。)
E_ALL            全部報錯
E_NOTICE        提示報錯        不會阻斷腳本執行
E_STRICT        提示錯誤        
E_DEPRECATED    將來棄用報錯
E_WARNING        警告報錯        不阻斷
E_ERROR            致命錯誤        阻斷腳本執行
E_PARSE            語法錯誤        所有腳本沒法執行
----------------------------------------------------------------------------------------------------------
php動態圖像處理函數
1.php中gd庫的使用
2.驗證碼的繪製和使用
3.php圖像處理(縮放、裁剪、水印)

 php中建立圖像的六個步驟:
 1.建立畫布資源
    新建一個基於調色板的圖像
    $img=imagecreate(width, height);
    新建一個真彩圖像
    $img=imagecreatetruecolor(width, height);

 2.準備顏色
    $black=imagecolorallocate($img,0,0,0);            //(資源,十進制紅參數,十進制綠參數,十進制藍參數)
    $white=imagecolorallocate($img,255,255,255);
    $red=imagecolorallocate($img,255,0,0);
    $green=imagecolorallocate($img,0,255,0);
    $blue=imagecolorallocate($img,0,0,255);
    $yellow1=imagecolorallocate($img,255,153,0);
    $yellow2=imagecolorallocate($img,204,102,0);

 3.畫布填充
imagefill($img,0,0,$red);

 4.在畫布上畫圖像和文字
    畫圓環:
    imagedellipse($img, 450, 250, 300, 300, $yellow1);//(資源,圓心x座標,圓心y座標,圓的橫軸長,圓的縱軸長,填充顏色)
    畫填充圓:
    imagefilledellipse($img, 450, 250, 300, 300, $yellow1);//(資源,圓心x座標,圓心y座標,圓的橫軸長,圓的縱軸長,填充顏色)
    畫點(畫一個像素):
    imagesetpixel($img, 10, 10, $red);//(資源,橫座標,縱座標,顏色)
    --------
    點干擾素:
    for ($i=0; $i <10000 ; $i++) {
        imagesetpixel($img, mt_rand(0,900), mt_rand(0,500), $red);
    }
    --------
    畫線:
    imageline($img,0,0,200,300,$white);//(資源,起始點橫座標,起始點縱座標,終點橫座標,終點縱座標,顏色)
    --------
    線干擾素:
    for ($i=0; $i <1000 ; $i++) {
        imageline($img, mt_rand(0,900), mt_rand(0,500), mt_rand(0,900), mt_rand(0,500),$black);
    }
    --------
    畫矩形:
    imagerectangle(image, x1, y1, x2, y2, color);
    畫矩形並填充:
    imagefilledrectangle(image, x1, y1, x2, y2, color);
    矩形干擾素:
    --------
    for ($i=0; $i <100 ; $i++) {
        imagerectangle($img, mt_rand(0,900), mt_rand(0,500), mt_rand(0,900), mt_rand(0,500),$black);
    }
    --------
    畫多邊形:
    imagepolygon(image, points, num_points, color);
    畫多邊形並填充:
    imagefilledpolygon(image, points, num_points, color);
    $arr=array(
        mt_rand(0,900), mt_rand(0,500),
        mt_rand(0,900), mt_rand(0,500),
        mt_rand(0,900), mt_rand(0,500),
        mt_rand(0,900), mt_rand(0,500),
        );
    imagepolygon($img, $arr, 4,$blue);
    畫圓弧
    imagearc(image, cx, cy, width, height, start, end, color);
    imagearc($img, 0, 250, 300, 300, 0, 360, $red);
    畫橢圓弧並填充
    imagefilledarc(image, cx, cy, width, height, start, end, color);
    水平畫一行字符串
    imagestring(image, font, x, y, string, color);
    imagestring($img, 15, 100, 100, dfadfdasf, $yellow2);
    垂直畫一行字符串
    imagestringup(image, font, x, y, string, color);
    imagestringup($img, 15, 300, 100, dfadfdasf, $yellow2);
    水平畫一個字符
    imagechar(image, font, x, y, c, color);
    imagechar($img, 32, 200, 200, h, $yellow1);
    垂直畫一個字符
    imagecharup(image, font, x, y, c, color);
    imagecharup($img, 32, 250, 200, h, $yellow1);
    truetype寫一段文本
    imagettftext(image, size, angle, x, y, color, fontfile, text);
    imagettftext($img, 50, 15, 100, 300, $red, 'STKAITI.TTF', "nijafdfsafas");
 5.輸出最終圖像或保存最終圖像
    header('content-type:image/jpeg');
    imagejpeg($img);
    header('content-type:image/png');
    imagepng($img);
 6.釋放畫布資源
    imagedestroy($img);
圖片背景管理
imagecreatefromjpeg(filename);
imagecreatefrompng(filename);
imagecreatefromgif(filename);
圖片縮放
$src_image=imagecreatefromjpeg('mv.jpg');
$dst_image=imagecreatetruecolor(960,540);
$dst_x=0;
$dst_y=0;
$src_x=0;
$src_y=0;
$dst_w=960;
$dst_h=540;
$src_w=imagesx($src_image);
$src_h=imagesy($src_image);
imagecopyresampled($dst_image,$src_image,$dst_x,$dst_y,$src_x,$src_y,$dst_w,$dst_h,$src_w,$src_h);
header('content-type:image/jpeg');
imagejpeg($dst_image,'t_meinv.jpg');

圖片裁剪
$src_image=imagecreatefromjpeg('mv.jpg');
$dst_image=imagecreatetruecolor(960,540);
$dst_x=0;
$dst_y=0;
$src_x=0;
$src_y=0;
$dst_w=540;
$dst_h=540;
$src_w=1080;
$src_h=1080;
imagecopyresampled($dst_image,$src_image,$dst_x,$dst_y,$src_x,$src_y,$dst_w,$dst_h,$src_w,$src_h);
header('content-type:image/jpeg');
imagejpeg($dst_image,'t_meinv.jpg');

圖片水印
$dst_im=imagecreatefromjpeg('mv.jpg');
$src_im=imagecreatefrompng('logo.png');
$dst_x=0;
$dst_y=0;
$src_x=0;
$src_y=0;
$src_w=160;
$src_h=80;
imagecopy($dst_im,$src_im,$dst_x,$dst_y,$src_x,$src_y,$src_w,$src_h);
header('content-type:image/jpeg');
imagejpeg($dst_im,'w_mv.jpg');

其餘圖片處理函數
獲取圖片寬高:
imagesx();
imagesy();
getimagesize();    不須要有圖片資源便可獲取圖片大小
------
$file='logo.png';
$arr=getimagesize($file);
echo "<pre>";
print_r($arr);
echo "</pre>";
------
輸出結果:
Array
(
    [0] => 160
    [1] => 80
    [2] => 3
    [3] => width="160" height="80"
    [bits] => 8
    [mime] => image/png
)
------
----------------------------------------------------------------------------------------------
文件處理函數
1.文件操做
    文件測試
        filetype();
        測試文件或目錄/判斷文件類型
        is_dir();
        判斷是不是目錄
        is_file():
        判斷是不是文件
        file_exists();
        文件或目錄是否存在
        filesize();
        文件大小或目錄大小(4k);
    1.文件刪除
    unlink($file);
    2.文件複製
    copy($sfile,$dfile);
    3.重命名文件
    rename($sfile,$dfile);
    4.打開文件
    fopen();
        r     只讀方式打開將文件指針指向文件頭。
        r+     讀寫方式打開,將文件指針指向文件頭。
        w     寫入方式打開,將文件指針指向文件頭並將文件大小截爲零,若是文件不存在則建立新文件
        w+     讀寫方式打開,將文件指針指向文件頭並將文件大小截爲零,若是文件不存在則建立新文件
        a     寫入方式打開,將文件指針指向文件尾,若是文件不存在建立文件。
        a+     讀寫方式打開,將文件指針指向文件尾,若是文件不存在建立文件。
    ----------
    讀txt文件並輸出:
    $file='hope.txt';
    $fr=fopen($file,'r');
    echo fread($fr,filesize($file));
    ----------
    打開txt文本並寫入後讀出:
    $file='hope.txt';
    $fr=fopen($file,'a+');
    fwrite($fr, "不要在奮鬥的年紀選擇了安逸!<br>");
    rewind($fr);
    echo fread($fr,filesize($file));
    ----------
    打開圖片:(圖片的代碼能夠摳出來)
    header('content-type:image/png');
    $file='mv.png';
    $fr=fopen($file,'r');
    echo fread($fr,filesize($file));
    fclose($fr);
    ----------
    5.關閉文件
    fclose();
    6.讀取文件內容
    fread();        //須要資源
    readfile();        //不須要資源
    file_get_contents();//不須要資源
    ----------
    讀txt文件並輸出:
    $file='hope.txt';
    ----------
    header('content-type:image/png');
    $file='mv.png';
    readfile($file);
    ----------
    讀txt文件並輸出:
    $file='hope.txt';
    $sfile=file_get_contents($file);
    echo $sfile;
    ----------
    header('content-type:image/png');
    $file='mv.png';
    $sfile=file_get_contents($file);
    echo $sfile;
    7.寫入文件        
    fwrite();
    file_put_contents();//不須要資源
    file_put_contents($file,'dfasdf');//覆蓋原文件
    file_put_contents($file,'dfasdf',FILE_APPEND);//追加式寫入
    ---------------
    //頁面靜態化/頁面緩存
    $url='http://www.baidu.com';
    $str=file_get_contents($url);
    file_put_contents('baidu.html', $str);
    --------------
    編碼轉換
    $str=iconv("gb2312", "utf-8", $str);
    --------------
    網站標題採集
    $url='http://www.baidu.com';
    $str=file_get_contents($url);
    // $str=iconv("gb2312", "utf-8", $str);
    preg_match('/<title>(.+)<\/title>/is',$str,$ms);
    echo $ms[1];
    --------------
2.目錄操做
    目錄遍歷
        opendir();
        打開目錄資源
        readdir();
        讀取文件資源
        closedir();
        -----------
        $dir="images";
        $od=opendir($dir);
        while ($file=readdir($od)) {
            if ($file!='.'&& $file!='..') {
                echo $file.'<br>';
            }
        }
        closedir($od);
        -----------
        關閉目錄資源
        scandir();
        將文件內文件所有讀取組成數組
        -----------
        $dir="images";
        $od=scandir($dir);
        foreach ($od as $val) {
            if ($val!='.'&& $val!='..') {
                echo $val.'<br>';
            }
        }
        -----------
        $dir="images";
        $od=scandir($dir);
        foreach ($od as $key=>$val) {
            if ($key<2){
                continue;
            }
                echo $val.'<br>';
        }
        -----------
        遍歷目錄並打印文件類型
        $dir='images';
        $arr=scandir($dir);
        foreach ($arr as $key => $value) {
            if ($key>1) {
                $file=$dir.'/'.$value;
                echo filetype($file).':'.$value.'<br>';
            }
        }
        -----------
    建立空目錄
        mkdir();
    刪除空目錄
        rmdir();
    刪除完整目錄deDir();
        -----------
        function delDir($dir){
            $files=scandir($dir);
            foreach ($files as $key=>$val) {
                if ($key>1){
                    $file=$dir.'/'.$val;
                    if(is_dir($file)) {
                        delDir($file);
                    }else{
                        unlink($file);
                    }
                }
            }
            rmdir($dir);
        }
        delDir('images');
        -----------
        參考php官方寫法,scandir();
    複製完整目錄copyDir();
        -----------
        function copyDir($dir1,$dir2){
            mkdir($dir2);
            $files=scandir($dir1);
            foreach ($files as $key=>$val) {
                if ($key>1){
                        $file1=$dir1.'/'.$val;
                        $file2=$dir2.'/'.$val;
                    if(is_dir($file1)) {
                        copyDir($file1,$file2);
                    }else{
                        copy($file1,$file2);
                    }
                }
            }
        }
        copyDir('images','imgs');
        ------------
    移動完整目錄mvDir();
        ------------
        // 文件移動
        moveDir($dir1,$dir2){
            copyDir($dir1,$dir2);
            delDir($dir1);
        }
        ------------
3.文件上傳
    ------------
    $sfile=$_FILES['img']['tmp_name'];
    $dfile='../images/'.$_FILES['img']['name'];
    move_uploaded_file($sfile,$dfile);
    ------------
    move_uploaded_file($sfile,$dfile);
===============================================
//文件上傳實例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>uploads</title>
    <style>
        *{
            font-familay:微軟雅黑;
        }
    </style>
</head>
<body>
    <h3>文件上傳</h3>
    <form action="upload.php" method='post' enctype='multipart/form-data'>
        <p>請選擇文件:</p>
        <p>
            <input type="file" name="img">
        </p>
        <p>
            <input type="submit" value="上傳">
        </p>
    </form>
</body>
</html>
===============================================
<?php

$sfile=$_FILES['img']['tmp_name'];
$uploaddir='../images/';
$filesize=$_FILES['img']['size'];
//建立上傳日期目錄
$year=date(Y);
$mouth=date(m);
$day=date(d);
$datedir=$uploaddir.'/'.$year.'-'.$mouth.'-'.$day;
if (!file_exists($datedir)) {
    mkdir($datedir);
}
//獲取文件後綴
$farr=explode('.',$_FILES['img']['name']);
$fext=array_pop($farr);
//加工文件名
$frand=time().mt_rand();
// 最終上傳路徑和文件名
$dfile=$datedir.'/'.$frand.'.'.$fext;
//限制文件大小(1M)
$size=1*1024*1024;
//限制文件上傳類型
$allows=array('jpg','gif','png','txt');

//文件移動操做
if (in_array($fext,$allows)) {
    if ($filesize<=$size) {
        move_uploaded_file($sfile,$dfile);
    }else{
        echo "<script>alert('文件大小超過1M!')</script>";
    }    
}else{
    echo "<script>alert('文件類型不容許,只容許上傳png,jpg,gif,txt類型!')</script>";
}
//php.ini文件上傳大小限制
//post_max_size = 8M        post限制
//upload_max_filesize = 8M input限制
//upload_max_filesize<=post_max_size
 ?>
 ===============================================
 //文件上傳錯誤碼:
 0 正確
 1 上傳大小超過了input[type=file]的文件上傳框最大大小
 4 沒有上傳任何文件
4.文件下載
----------------------------------------------------------------------------------
php面向對象
1.概念
2.繼承
3.封裝
4.實例:分頁類
5.實例:數據庫操做
6.抽象類
7.接口
8.多態
9.魔術方法
10.關鍵字

面向對象的概念(OOP)(Object-Oriented Progremming,基於/面向對象的編程)
1.OOP使編程的代碼更簡潔,更易於維護,而且具備很強的可重用性。
2.OOP達到了軟件工程的三個目標:重用性,靈活性,擴展性
3.OOP面向對象編程的特色:封裝、繼承、多態

類與對象的關係:類的實例化結果爲對象

類:在面向對象的編程語言中,類是獨立的一個程序單位,是具備相同屬性和服務的一組對象集合。它爲屬於該類的全部對象提供了統一抽象描述,其內部包括成員屬性和服務的方法兩個主要部分。

對象:系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位;

類的組成成員
1.成員屬性
2.成員方法

類實例化對象
$obj=new Person();

對象調用成員
$obj->say();
echo $obj->name;//調用屬性時屬性前不加$

構造方法和析構方法

======================================
<?php
//類定義
//(文件名要與類名相同)
//類名每一個單詞的首字母必須大寫,是最爲嚴格的駝峯式寫法
//駝峯式personAction,嚴格的駝峯式寫法PersonActionGoodLike

class Person{

    //屬性,屬性前必須有修飾詞
    public $name="user";     
    public $age=20;
    public $sex='nan';
    
    //構造方法     在new對象時,默認調用的方法用來傳遞一些參數,
    function __construct($n,$b,$m){
        $this->name=$n;
        $this->age=$b;
        $this->sex=$m;
    }

    //方法名與類名相同時,該方法也爲構造方法
    // function Person($n,$b,$m){
    //     $this->name=$n;
    //     $this->age=$b;
    //     $this->sex=$m;
    // }

    //析構方法
    // 1.      析構方法會自動調用
    // 2.      析構方法主要用於銷燬資源(好比釋放數據庫的連接,圖片資源...銷燬某個對象..);

    // 析構函數會在到對象的全部的引用都被刪除或者當對象被顯示銷燬時執行.   
    // 3.      析構方法調用順序是,先建立的對象後被銷燬
    // 4.      析構方法何時被調用
    // (1)    當程序(進程結束)退出時
    // (2)    當一個對象稱爲垃圾對象的時候,該對象的析構方法也會被調用,
    // (3)    所謂垃圾對象,就是指,沒有任何變量再引用它.
    // (4)    一旦一個對象成爲垃圾對象,析構方法就會當即調用

    // 析構方法小結:
    // ①php5加入的的析構方法function __destruct()
    // ②析構方法沒有返回值也不接受參數
    // ③主要做用是釋放資源的操做,並非銷燬對象自己。
    // ④在銷燬對象前,系統自動的調用該類的析構方法   
    // ⑤一個類最多隻有一個析構方法。
    function __destruct(){
        echo "我是{$this->name},我還會回來的!";
    }

    //方法,方法前 能夠不加修飾詞,默認public
    function say(){
        //$this表明本對象  使用時屬性前不加$
        echo "hello world,my name is {$this->name}!<br>my age is {$this->age}!<br>my sex is {$this->sex}!<br>";
        return $this;    //對象鏈的實現,方法的返回值爲$this,即返回本對象
    }
}

$obj=new Person('shiyi1',20,'nv');
$obj->say();
$obj1=new Person('shiyi2',20,'nv');
$obj1->say()->say();
$obj2=new Person('shiyi3',20,'nv');
$obj2->say();

?>
===============================================
封裝特性
1.public
子類和類外面都可使用
2.protected
子類可用
3.private    
只有本身可用

屬性的做用域        只在類的內部使用,使用時用如:$this->name
局部變量的做用域    函數內部變量,只能在函數內使用
超全局變量            任何地方均可使用
----------------
類方法的調用
//調用的類方法中不能有$this
<?php

class Person{
    public $name="user";
    function see($name){
        echo "hello world,my name is {$name}";
    }
}
Person::see('shiyi');

?>
---------------
類的繼承特性
.子類能夠訪問父類的成員
.繼承關鍵字extends
.可提升代碼的重用性
.子類中寫了一個與父類同名的方法時,會覆蓋父類中的方法

---------------
抽象類:含有抽象方法的類
abstract class Person{
    abstract function show();
    function say(){
        //....
    };
}
抽象方法:沒有方法體的方法
abstract function show();
方法體:
abstract function show(){
    //方法體
    //代碼段
}
================================================
<?php

//抽象方法需加abstract標記
abstract class Usb{
    //抽象類
    function start(){
            echo "<h3>usb start</h3>";
    }
    function run(){
            echo "<h3>usb run</h3>";
    }
    abstract
    function stop();
}

class Upan extends Usb{
    //抽象類起到限制做用,
    function stop(){
            echo "<h3>usb stop</h3>";
    }
    function explode(){
            echo "<h3>usb explode</h3>";
    }

}
$obj=new Upan();
$obj->start();
$obj->run();
$obj->stop();
$obj->explode();
?>
============================================
接口:只含有抽象方法的類
<?php


//抽象類的方法都是抽象方法,不容許出現方法體的類是接口
// abstract class Usb{
//     //抽象類
//     abstract function start();
//     abstract function run();
//     abstract function stop();
// }


interface Usb{
    //抽象類
    function start();
    function run();
    function stop();
}

class Upan implements Usb{
    //抽象類起到限制做用,
    function start(){
            echo "<h3>usb start</h3>";
    }
    function run(){
            echo "<h3>usb run</h3>";
    }
    function stop(){
            echo "<h3>usb stop</h3>";
    }
    function explode(){
            echo "<h3>usb explode</h3>";
    }
}
$obj=new Upan();
$obj->start();
$obj->run();
$obj->stop();
$obj->explode();

?>
======================================
多態
定義:用一個函數去加工相似的具備某些相同方法的對象
用同個方法加工具備相同屬性的不一樣對象

多態是指在面向對象中可以根據使用類的上下文來從新定義或改變類的性質和行爲。    

PHP不支持重載實現多態,可是PHP能夠變向的實現多態效果。


class a{
    function test($i){ // $i能夠是任何類型的變量
        print_r $i;
    }
}


能夠看出因爲PHP是弱類型語言,因此$i能夠是任何類型的變量,這樣一個函數就能夠實現如java等強類型語言中靠改變參數類型重載方法的多態形式。這種形式比JAVA的參數類型重載更便捷高效,但也存在問題,


能夠看出這樣靈活的多態,須要一些控制,在PHP5.3之後能夠對參數作類型限制,以下:
// 仿java,在變量參數前加一個限制類名
    function drawPolygon(Polygon $polygon){
        $polygon->draw();
    }

    這樣就限制了只能傳入Polygon及其子類。
    還有一隻是改變參數數量的重載,一樣是由於PHP也不支持方法的重載,因此也須要些變通的方法實現,以下:
---------------------------------------------------
<?php
// 經過可變參數來達到改變參數數量重載的目的
// 不是必須傳入的參數,必須在函數定義時賦初始值
function open_database($DB, $cache_size_or_values=null, $cache_size=null){
    switch (function_num_args())           //經過function_num_args()函數計算傳入參數的個數,根據個數來判斷接下來的操做
    {
        case 1:
            $r = select_db($DB);
            break;
        case 2:
            $r = select_db($DB, $cache_size_or_values);
            break;
        case 3:
            $r = select_db($DB, $cache_size_or_values, $cache_size);
            break;
    }
    return is_resource($r);
}
?>
-----------------------------------------------
魔術方法
在某些狀況下自動調用
1.__construct    構造方法
2.__destruct    析構方法
3.__toString    給類增長一個說明
--------------------
<?php
class Upan{
    function start(){
            echo "<h3>usb start</h3>";
    }
    function __toString(){
        return 'this is a class that used for Upan';
    }
}

$obj=new Upan();
echo $obj;
?>
--------------------
4.__call    調用類中不存在或沒有權限的方法時自動調用該魔術方法
參數1爲調用的方法名字,參數2爲調用方法傳遞的參數
--------------------
<?php
class Upan{
    function start(){
            echo "<h3>usb start</h3>";
    }
    function __call($i,$j){
        echo "您調用的{$i}方法不存在!";
    }
}
$obj=new Upan();
$obj->call();
?>
--------------------
5.__get        調用類中不存在或沒有權限的屬性時自動調用該魔術方法
參數爲調用的屬性名字
--------------------
<?php
class Upan{
    private $name;
    function start(){
            echo "<h3>usb start</h3>";
    }
    function __get($i){
        echo "您無權訪問{$i}屬性!";
    }
}

$obj=new Upan();
$obj->name;
?>
-------------------
6.__set     調用類中不存在或沒有權限的屬性並賦值時自動調用該魔術方法
參數1爲調用的屬性名字,參數2爲所賦值!
-------------------
<?php
class Upan{
    private $name;
    function start(){
            echo "<h3>usb start</h3>";
    }
    function __set($i,$j){
        echo "您設置的{$i}屬性不存在!";
    }
}

$obj=new Upan();
$obj->name='shiyi';
?>
-------------------
7.__isset     查看類中不存在或沒有權限的屬性並賦值時自動調用該魔術方法
參數爲查看的屬性名字!
-------------------
<?php
class Upan{
    private $name;
    function start(){
            echo "<h3>usb start</h3>";
    }
    function __isset($i){
        echo "您無權查看{$i}是否存在!";
    }
}

$obj=new Upan();
isset($obj->name);
?>
-------------------
8.__unset     刪除類中不存在或沒有權限的屬性並賦值時自動調用該魔術方法
參數爲刪除的屬性名字!
-------------------
<?php
class Upan{
    private $name;
    function start(){
            echo "<h3>usb start</h3>";
    }
    function __unset($i){
        echo "您無權刪除{$i}!";
    }
}

$obj=new Upan();
unset($obj->name);
?>
-------------------
面向對象關鍵字/修飾詞
1.類常量    const     只能用類名調用,而且不能修改;
-------------------
<?php
class Upan{
    const HOST='www.shiyi.website';
    function start(){
            echo "<h3>usb start</h3>";
    }
}
echo Upan::HOST;
?>
-------------------
2.最終版本    final 類前加final不能有子類,類中方法前加final,子類中不能重寫該方法
-------------------

<?php
class BaseClass {
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
   public function moreTesting() {
       echo "ChildClass::moreTesting() called\n";
   }
}
// Results in Fatal error: Cannot override final method BaseClass::moreTesting()
?>
<?php
final class BaseClass {
    }

class ChildClass extends BaseClass {
    }
// 產生 Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>
-----------------
3.靜態成員    static
-----------------
//靜態屬性
<?php
//獲取一個類實例化過多少對象
class Upan{
    public static $tot;
    const HOST='www.shiyi.website';
    function start(){
            echo "<h3>usb start</h3>";
    }
    function __construct(){
        //Upan::$tot++;
        SELF::$tot++;
    }
}
$obj=new Upan();
$obj2=new Upan();
$obj3=new Upan();
$obj4=new Upan();
$obj5=new Upan();
echo $obj->start();
echo Upan::$tot;
?>
------------------
//靜態方法
<?php
//獲取一個類實例化過多少對象
class Upan{
    const HOST='www.shiyi.website';
    static function start(){
            echo "<h3>usb start</h3>";
    }
}
$obj=new Upan();
$obj->start();
Upan::start();
?>
------------------
==================================================================================
SQL數據庫(關係型)
1.收費
DB2
Sqlserval
Oracle
2.免費開源
Mysql
Sqlite    大部分語言默認支持的一個小型數據庫
postgrepsql
NOSQL   非數據庫(關係型)
1.MongoDB
2.Redis
3.Memcache

LAMP架構
Linix
Apache
Mysql
PHP

mysql服務端        C:\wamp64\bin\mysql\mysql5.7.14\bin\mysqld.exe
mysql客戶端        C:\wamp64\bin\mysql\mysql5.7.14\bin\mysql.exe
mysql是各戶端服務端模式
phpmyadmin是mysql的一種客戶端

1.數據庫設計
2.數據庫操做


數據庫服務器
1.數據庫
2.數據表

數據表
1.表結構(字段)
2.表數據(記錄)
3.表索引(加快檢索)

表引擎
1.myisam(一個表三個文件)
2.innodb(2個文件)

mysql基本命令:
1.net stop mysql;
關閉mysql
2.net start mysql;
開啓mysql
3.mysql -uroot -p123;
登陸mysql
4.show databases;
查看數據庫
5.use test;
切換到test數據庫
6.show tables;
查看數據表
7.select * from t1; *表明列
  select id from t1;

查看t1表中的數據
8.desc t1;
查看 t1表列結構
9.exit;
退出mysql客戶端
----------------
數據庫操做
1.如何建立數據庫
create database shiyi;
2.如何刪除數據庫
drop database shiyi;
----------------
表操做:
1.建立表
create table shiyi(
id int,
username varchar(50),
age int
);
2.刪除表
drop table shiyi;
3.修改表
update shiyi set age=25 where id=2;
4.查看錶
select * from t1;
-----------------
數據操做
1.插入數據
insert into shiyi(id,username,age) values(2,'user2',18);

2.刪除數據
delete from shiyi where id=1;

3.修改數據
update shiyi set age=25 where id=2;

4.查找數據
select * from shiyi;

2012年php開發特級課程
mysql優化
shell編程
----------------------------------
表字段類型
1.數值
tinyint(4) 無符號 <256
tinyint(3) 有符號 <128
int(11)     無符號 <4294967296
int(10)     有符號 <2147483648
bigint(20)  無符號
bigint(19)  有符號
float

2.字符串類型
char(255)    <255字節
varchar(65535)    <65535字節
    char和varchar區別
    1.char最長255,varchar最長65535
    2.char固定長度空間,varchar可變長度空間(實際空間+1)
text         <65535字節
mediumtext  <16777216
longtext      <4294967296

3.時間和日(期數值)
數值時間戳
推薦使用php中的time()時間戳
數值字段屬性
1.unsigned     無符號
2.zerofill    0填充
    -> create table bbd(
    -> id int(5) zerofill);
    insert into bbd(id) values(10);
    insert into bbd(id) values(1000000);
    -------------
    00010
    1000000
3.auto_increment
自增需加主鍵!
-----------------
mysql> create table t1(
    -> id int unsigned auto_increment,
    -> name varchar(30),
    -> primary key(id)
    -> );
Query OK, 0 rows affected (0.00 sec)
--------------------------------------------------------------------------
mysql經過索引進行的優化
--------------------------------------------------------------------------
表索引:
做用:節約檢索速度
1.主鍵索引
一個表只容許有一個
加主鍵索引:
alter table t8 add primary key(id);
刪除主鍵索引:
alter table t8 drop primary key;
加無符號和自增屬性:
alter table t8 modify id int unsigned auto_increment;
alter table t8 modify id int unsigned not null;
2.惟一索引
惟一索引所在列中的值不容許重複
添加惟一索引
alter table t8 add unique uni_name(QQ);
添刪除惟一索引
alter table t8 drop index idx_name;

3.普通索引
添加主鍵索引
alter table t8 add index idx_name(name);
刪除普通索引
alter table t8 drop index idx_name;
-----------------
-----------------
4.null
5.not null
-----------------
mysql> create table t6(
    -> id int unsigned auto_increment primary key,
    -> name varchar(30) not null default 'shiyi');
Query OK, 0 rows affected (0.00 sec)
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30)      | NO   |     | shiyi   |                |
+-------+------------------+------+-----+---------+----------------+
mysql> insert into t6() values();
Query OK, 1 row affected (0.00 sec)
----------------
mysql> create table t7(
    -> id int unsigned auto_increment primary key,
    -> name varchar(30) not null);
Query OK, 0 rows affected (0.00 sec)
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30)      | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
mysql> insert into t7() values();
ERROR 1364 (HY000): Field 'name' doesn't have a default value
-----------------
6.default 默認值
-----------------

結構化查詢語言sql
大多數數據庫包含4個部分
1.DDL //數據定義語言。create,drop,alter
2.DML //數據庫操做語言。insert,delete,updade
3.DQL //數據庫查詢語言。select
4.DCL //數據控制語言。grant,commit,rollback


修改數據表字段
1.增
alter table t8  add sex tinyint not null;
alter table t8  add sex tinyint not null after name;
alter table t8  add sex tinyint not null first;
2.刪
alter table t8  drop sex;
3.改
alter table t8 change cla_id class_id int;
alter table t8 modify class_id int unsigned not null;


數據表操做:
sql條件
1).數學運算符
+ - * / %
2).邏輯運算符
&& || and or
3).比較運算符
= != <= >= <>(不等於)

1.增:insert
insert into t8(name,schoolnumber,sex,QQ) values('shiyi',1601141019,'nan',211874876);
2.刪:delete
delete from t8;(刪除表數據)
delete from t8 where id=4;
delete from t8 where id>=3 and id<=5;
delete from t8 where id<=3 or id>=5;
delete from t8 where id between 3 and 5;
delete from t8 where id in(1,2,5);
truncate t8;(清空數據表,重置自增值)
3.改:update
update t8 set sex='nv';
update t8 set sex='nv' where id=3;
4.查:select
select * from t8;
select * from t8 where id=2;
select * from t8 where id<2;
select id,name from t8 where id<2;(使用where條件查詢)
select name as 'xingming',schoolnumber as'sn'from t8;(起別名)
select name 'xingming',schoolnumber 'sn' from t8;(起別名)
select distinct name from t8; (查詢全部惟一值)
select * name from t8 where name is null; (查詢空值)
select * name from t8 where name is not null; (查詢空值)
select * name from t8 where id=1 or id=3 or id=7; (in的使用方法)
select * name from t8 where id in(1,3,7); (in的使用方法)
like的使用方法:
% 匹配全部
_ 匹配一個字符
select * from t8 where name like "%shiyi%";
//% 在前,name這一列的索引會失效
regexp正則檢索
select * from t8 where name regexp 'shiyi';
select * from t8 where name regexp '^shiyi';
select * from t8 where name regexp 'shiyi$';
使用order by對查詢結果排序
select * from t8 order by id asc;//默認就是升序,從小到大;
select * from t8 order by id desc;//從大到小
select * from t8 order by rand(); //亂序
limit限制輸出個數:(分頁實現)
select * from t8 order by id limit 1,5;從第一條開始,截5條
select * from t8 order by id limit 5;(前5條,0省略不寫 )
mysql經常使用函數
鏈接函數concat()
select concat('hello','world','!!!');
select concat(id,'-',name) shiyi from t8;
隨機數rand()
select * from t8 order by rand();//亂序
select * from t8 order by rand() limit 3;
統計表總行數count()
select count(id) from t8;
select count(*) from t8;//*特指主鍵
+----------+
| count(*) |
+----------+
|       11 |
+----------+
統計表總行數
求和sum()
select sum(id) from t8;
平均值avg()
select avg(id) from t8;
最大值max()
select max(id) from t8;
最小值min()
select min(id) from t8;

分組聚合
1.普通多表查詢
select class_id,count(class_id) from t8 group by class_id;
select concat(class_id,'-','class'),count(class_id) from t8 group by class_id;
-----------------------------
having關鍵字查詢
mysql> select class_id from t8 group by class_id where class_id<2;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where class_id<2' at line 1
mysql> select class_id from t8 group by class_id having class_id<2;
+----------+
| class_id |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)
-------------------------------------------------------------
+----+-------------+
| id | name        |
+----+-------------+
|  1 | class one   |
|  2 | class two   |
|  3 | class three |
|  4 | class four  |
+----+-------------+
+----+-----------+--------------+-----------+-------------+-----+----------+
| id | name      | schoolnumber | QQ        | phonenumber | sex | class_id |
+----+-----------+--------------+-----------+-------------+-----+----------+
|  1 | shiyi     |   1601141019 | 211874876 | 13781206061 |   1 |        2 |
|  2 | gongshuai |   1601141021 | 956167376 | 13781206061 |   1 |        3 |
|  3 | gongshuai |   1601141021 | 956167376 | 13781206061 |   1 |        1 |
|  4 | gongshuai |   1601141021 | 956167376 | 13781206061 |   1 |        2 |
|  5 | gongshuai |   1601141021 | 956167376 | 13781206061 |   1 |        1 |
|  6 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        3 |
|  7 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        2 |
|  8 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        1 |
|  9 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        2 |
| 10 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        3 |
| 11 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        1 |
+----+-----------+--------------+-----------+-------------+-----+----------+
mysql> select * from t8,class where t8.class_id=class.id;
+----+-----------+--------------+-----------+-------------+-----+----------+----+-------------+
| id | name      | schoolnumber | QQ        | phonenumber | sex | class_id | id | name        |
+----+-----------+--------------+-----------+-------------+-----+----------+----+-------------+
|  1 | shiyi     |   1601141019 | 211874876 | 13781206061 |   1 |        2 |  2 | class two   |
|  2 | gongshuai |   1601141021 | 956167376 | 13781206061 |   1 |        3 |  3 | class three |
|  3 | gongshuai |   1601141021 | 956167376 | 13781206061 |   1 |        1 |  1 | class one   |
|  4 | gongshuai |   1601141021 | 956167376 | 13781206061 |   1 |        2 |  2 | class two   |
|  5 | gongshuai |   1601141021 | 956167376 | 13781206061 |   1 |        1 |  1 | class one   |
|  6 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        3 |  3 | class three |
|  7 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        2 |  2 | class two   |
|  8 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        1 |  1 | class one   |
|  9 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        2 |  2 | class two   |
| 10 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        3 |  3 | class three |
| 11 | syj       |   1601141001 | 956167376 | 13781206061 |   0 |        1 |  1 | class one   |
+----+-----------+--------------+-----------+-------------+-----+----------+----+-------------+
mysql> select t8.name,class.name from t8,class where t8.class_id=class.id;
+-----------+-------------+
| name      | name        |
+-----------+-------------+
| shiyi     | class two   |
| gongshuai | class three |
| gongshuai | class one   |
| gongshuai | class two   |
| gongshuai | class one   |
| syj       | class three |
| syj       | class two   |
| syj       | class one   |
| syj       | class two   |
| syj       | class three |
| syj       | class one   |
+-----------+-------------+
mysql> select class.name,count(class_id) from t8,class  where t8.class_id=class.id group by class_id;
+-------------+-----------------+
| name        | count(class_id) |
+-------------+-----------------+
| class one   |               4 |
| class two   |               4 |
| class three |               3 |
+-------------+-----------------+
2.嵌套查詢
select * from t8 where id in(select max(id) from t7);
3.連接查詢

select class.name,count(t8.id) from class left join t8 on class.id=t8.class_id group by class.id;

select class.name,count(t8.id) from t8 right join class on class.id=t8.class_id group by class.id;

mysql> select class.name,count(class.id) from class left join t8 on class.id=t8.class_id group by class.id;
+-------------+-----------------+
| name        | count(class.id) |
+-------------+-----------------+
| class one   |               4 |
| class two   |               4 |
| class three |               3 |
| class four  |               1 |
+-------------+-----------------+

右連接,把右邊的表數據所有輸出
mysql> select class.name,count(t8.id) from t8 right join class on class.id=t8.class_id group by class.id;
+-------------+--------------+
| name        | count(t8.id) |
+-------------+--------------+
| class one   |            4 |
| class two   |            4 |
| class three |            3 |
| class four  |            0 |
+-------------+--------------+
4 rows in set (0.00 sec)

左連接時左邊的表所有輸出,右邊自動補NULL
mysql> select class.name,count(t8.id) from class left join t8 on class.id=t8.class_id group by class.id;
+-------------+--------------+
| name        | count(t8.id) |
+-------------+--------------+
| class one   |            4 |
| class two   |            4 |
| class three |            3 |
| class four  |            0 |
+-------------+--------------+

內連接    徹底等於普通多表查詢,必須是符合條件的多個表的數據纔會顯示
mysql> select class.name,class.id,count(t8.id) from class inner join t8 on class.id=t8.class_id group by class.id;
+-------------+----+--------------+
| name        | id | count(t8.id) |
+-------------+----+--------------+
| class one   |  1 |            4 |
| class two   |  2 |            4 |
| class three |  3 |            3 |
+-------------+----+--------------+
3 rows in set (0.00 sec)
-------------------------------------------------------------------------------------------------------------------------------------
mysql> select class.name,if(count(t8.id),count(t8.id),'無') from class left join t8 on class.id=t8.class_id group by class.id;
+-------------+-------------------------------------+
| name        | if(count(t8.id),count(t8.id),'無')  |
+-------------+-------------------------------------+
| class one   | 4                                   |
| class two   | 4                                   |
| class three | 3                                   |
| class four  | 無                                  |
+-------------+-------------------------------------+
------------------------
mysql> select * from t9;
+----+----------+-------+
| id | username | score |
+----+----------+-------+
|  1 | shiyi    |    60 |
|  2 | shiyi    |    59 |
|  3 | shiyi    |    69 |
|  4 | shiyi    |    79 |
|  5 | shiyi    |    49 |
|  6 | shiyi    |    99 |
|  7 | shiyi    |    79 |
|  8 | shiyi    |    79 |
|  9 | shiyi    |    79 |
| 10 | shiyi    |    79 |
| 11 | shiyi    |    79 |
| 12 | shiyi    |    79 |
| 13 | shiyi    |    79 |
| 14 | shiyi    |    29 |
| 15 | shiyi    |    29 |
| 16 | shiyi    |    29 |
| 17 | shiyi    |    29 |
| 18 | shiyi    |    29 |
| 19 | shiyi    |    29 |
| 20 | shiyi    |    79 |
+----+----------+-------+
輸出及格與不及格總人數
方法一
mysql> select (select count(*) from t9 where score>=60) 及格,(select count(*) from t9 where score<60) 不及格;
+--------+-----------+
| 及格   | 不及格    |
+--------+-----------+
|     12 |         8 |
+--------+-----------+
1 row in set (0.00 sec)
方法二
mysql> select sum(if(score>=60,1,0)) 及格,sum(if(score<60,1,0)) 不及格 from t9;
+--------+-----------+
| 及格   | 不及格    |
+--------+-----------+
|     12 |         8 |
+--------+-----------+
1 row in set (0.00 sec)         
-------------------------

數據庫表設計規律
1.建表時每一個表只有一個主體,每一個主體只含有與該主體相關的屬性
2.表間關係不宜過多
3.包含關係中一對多的狀況下,多者留少者id,即被包含者留包含者id
表與表關係:
一對一
一對多
多對多
-----------------
mysql> create table t5(
    -> id int unsigned auto_increment primary key,
    -> name varchar(30) default 'wsyjlly',
    -> sex varchar(5) default 'nv',
    -> schoolnumber int,
    -> QQ int default 211874876);
-----------------------------------------------------------------------------
| id           | int(10) unsigned | NO   | PRI | NULL      | auto_increment |
| name         | varchar(30)      | YES  |     | wsyjlly   |                |
| sex          | varchar(5)       | YES  |     | nv        |                |
| schoolnumber | int(11)          | YES  |     | NULL      |                |
| QQ           | int(11)          | YES  |     | 211874876 |                |
--------------------------------------------------------------------------------
客戶端字符集
鏈接字符集
服務器字符集
數據庫字符集

Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    gbk
Conn.  characterset:    gbk
改成:
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
方法以下:
-----------
找到mysql的配置文件
C:\wamp64\bin\mysql\mysql5.7.14\my.ini
在
[client]
;password = your_password
port = 3306
socket = /tmp/mysql.sock
後加上
default-character-set = utf8
客戶端和鏈接字符集
在
[wampmysqld64]
;skip-grant-tables
port = 3306
socket = /tmp/mysql.sock
key_buffer_size = 64M
max_allowed_packet = 16M
後加上
character-set-server = utf8
//服務器和數據庫字符集
collation-server = utf8_general_ci
//服務器和數據庫校驗字符集

重啓mysql服務
------------
客戶端字符集:
php設置方法
$sql="set names utf8";
==============================================================
mysql> select * from t8;
+----+------+-----+--------------+-----------+-------------+
| id | name | sex | schoolnumber | QQ        | phonenumber |
+----+------+-----+--------------+-----------+-------------+
|  1 | syj  | nv  |   1601141019 | 211874876 | 13781206061 |
|  2 | syj  | nv  |   1601141019 | 211874876 | 13781206061 |
|  3 | syj  | nv  |   1601141019 | 211874876 | 13781206061 |
+----+------+-----+--------------+-----------+-------------+
mysql> select * from t8\G;
*************************** 1. row ***************************
          id: 1
        name: syj
         sex: nv
schoolnumber: 1601141019
          QQ: 211874876
 phonenumber: 13781206061
*************************** 2. row ***************************
          id: 2
        name: syj
         sex: nv
schoolnumber: 1601141019
          QQ: 211874876
 phonenumber: 13781206061
*************************** 3. row ***************************
          id: 3
        name: syj
         sex: nv
schoolnumber: 1601141019
          QQ: 211874876
 phonenumber: 13781206061

ERROR:
No query specified
=========================================================================
``反引號可規避某些關鍵字
-------------------------------------------------------------------------------------------------------------------------------------
MYSQL的索引

mysql中,不一樣的存儲引擎對索引的實現方式不一樣,大體說下MyISAM和InnoDB兩種存儲引擎。

MyISAM的B+Tree的葉子節點上的data,並非數據自己,而是數據存放的地址。主索引和輔助索引沒啥區別,只是主索引中的key必定得是惟一的。這裏的索引都是非聚簇索引。
MyISAM還採用壓縮機制存儲索引,好比,第一個索引爲「her」,第二個索引爲「here」,那麼第二個索引會被存儲爲「3,e」,這樣的缺點是同一個節點中的索引只能採用順序查找。

InnoDB的數據文件自己就是索引文件,B+Tree的葉子節點上的data就是數據自己,key爲主鍵,這是聚簇索引。非聚簇索引,葉子節點上的data是主鍵(因此聚簇索引的key,不能過長)。爲何存放的主鍵,而不是記錄所在地址呢,理由至關簡單,由於記錄所在地址並不能保證必定不會變,但主鍵能夠保證。

聚簇索引的數據的物理存放順序與索引順序是一致的,即:只要索引是相鄰的,那麼對應的數據必定也是相鄰地存放在磁盤上的。若是主鍵不是自增id,那麼能夠想象,它會幹些什麼,不斷地調整數據的物理地址、分頁,固然也有其餘一些措施來減小這些操做,但卻沒法完全避免。但,若是是自增的,那就簡單了,它只須要一頁一頁地寫,索引結構相對緊湊,磁盤碎片少,效率也高。聚簇索引不但在檢索上能夠大大滴提升效率,在數據讀取上也同樣。好比:須要查詢f~t的全部單詞。一個使用MyISAM的主索引,一個使用InnoDB的聚簇索引。兩種索引的B+Tree檢索時間同樣,但讀取時卻有了差別。由於MyISAM的主索引並不是聚簇索引,那麼他的數據的物理地址必然是凌亂的,拿到這些物理地址,按照合適的算法進行I/O讀取,因而開始不停的尋道不停的旋轉。聚簇索引則只需一次I/O。不過,若是涉及到大數據量的排序、全表掃描、count之類的操做的話,仍是MyISAM佔優點些,由於索引所佔空間小,這些操做是須要在內存中完成的。
鑑於聚簇索引的範圍查詢效率,不少人認爲使用主鍵做爲聚簇索引太多浪費,畢竟幾乎不會使用主鍵進行範圍查詢。但若再考慮到聚簇索引的存儲,就很差定論了。
-------------------------------------------------------------------------------------------------------------------------------------
PDO(PHP Data Object)PHP數據對象(數據庫抽象層)
PDO做用:
一套函數能夠操做不一樣的數據庫:
1.CUBRID
2.MS SQL SERVER
3.Firebird
4.Informix
5.Mysql
6.MS Sql
7.Oracle
8.ODBC
9.PostgreSQL
10.SQLite
11.4D
12.DB2
數據庫操做:
1.PDO class #PDO類
2.PDOStatement class #PDO預處理類
3.PDOException class #PDO異常處理類
---------------------------------------
//鏈接數據庫
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$sql="select * from t8;";
$smt=$pdo->query($sql);
$arr=$smt->fetchAll();                    //混合數組
$arr=$smt->fetchAll(PDO::FETCH_BOTH);    //混合數組
$arr=$smt->fetchAll(PDO::FETCH_ASSOC);    //關聯數組
// $arr=$smt->fetchAll(PDO::FETCH_NUM);    //索引數組
echo "<pre>";
print_r($arr);
echo "</pre>";
----------------------------------------

pdo類
1.query();
2.exec();
3.prepare();
4.lastInsertId();//最後一次插入數據的id
5.setAttribute();//設置默認屬性
6.getAttribute();//獲取默認的獲取模式
7.beginTransaction();//開啓任務
8.commit();//成功提交本次任務
9.rollback();//失敗撤銷本次任務
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$smt=$pdo->exec($sql);//返回影響行數



pdostatement類的方法
1.fetch()        //該方法將數據庫數據轉化爲一維數組的方法
2.fetchAll();    //該方法將數據庫數據轉化爲二維數組的方法
3.fetchColumn() //從結果集中的下一行返回單獨的一列,若是沒有了,則返回 FALSE 。你想從行裏取回的列的索引數字(以0開始的索引)。若是沒有提供值,則 PDOStatement::fetchColumn() 獲取第一列,若是使用 PDOStatement::fetchColumn() 取回數據,則沒有辦法返回同一行的另一列。
4.rowCount();    //返回影響行數
    

$sql="select * from t8;";
$smt=$pdo->query($sql);                    //執行sql語句,返回結果集,返回一個pdostatement對象
//$arr=$smt->fetchAll();                //混合數組
//$arr=$smt->fetchAll(PDO::FETCH_BOTH);    //混合數組
//$arr=$smt->fetchAll(PDO::FETCH_NUM);    //索引數組
$arr=$smt->fetchAll(PDO::FETCH_ASSOC);    //關聯數組
//$arr=$smt->fetchAll(PDO::FETCH_OBJ);    //對象
echo "<pre>";
print_r($arr);
echo "</pre>";


預處理對象不用發送sql語句    可避免sql注入的風險
5.execute();  //執行語句,返回ture或false
6.bindValue();//給予處理綁值
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$pdo->exec('set names utf8');                     //設置客戶端字符集
$sql="insert into t8(name) values('daixinya')";    //插入數據
$smt=$pdo->prepare($sql);
$smt->execute();                                //返回ture或false
if ($smt->execute()) {
    $tot=$smt->rowCount();
    echo "數據操做成功,成功插入{$tot}行!";
}else{
    echo "數據操做失敗!";
}

----------------
獲取影響行數
方法一:
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$sql="select * from t8;";
$smt=$pdo->prepare($sql);
$tot=$smt->rowCount();
echo "查詢了{$tot}行!";
方法二:(建議使用)
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$sql="select count(*) from t8;";
$smt=$pdo->prepare($sql);
$smt->execute();
$tot=$smt->fetchAll(PDO::FETCH_NUM);
echo "查詢了{$tot[0][0]}行!";
方法三:
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$sql="select count(*) from t8;";
$smt=$pdo->prepare($sql);
$smt->execute();
$tot=$smt->fetchColumn();
echo "查詢了{$tot}行!";
--------------
預處理綁值
方法一(類型不限)
bindValue()    
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$pdo->exec('set names utf8'); //設置客戶端字符集
$sql="select * from t8 where id<? or id>?";
$smt=$pdo->prepare($sql);
$smt->bindValue(1,5);
$smt->bindValue(2,25);
$smt->execute();
$arr=$smt->fetchAll(PDO::FETCH_ASSOC);
echo "<pre>";
print_r($arr);
echo "</pre>";
方法二(類型受限)
execute(array())
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$pdo->exec('set names utf8'); //設置客戶端字符集
$sql="select * from t8 where id<?";
$smt=$pdo->prepare($sql);
$smt->execute(array(5));
$arr=$smt->fetchAll(PDO::FETCH_ASSOC);
echo "<pre>";
print_r($arr);
echo "</pre>";
--------------
獲取單行數據fetch()
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);//設置默認輸出數組爲關聯數組
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,2);//設置默認輸出數組爲關聯數組
$pdo->exec('set names utf8'); //設置客戶端字符集
$sql="select count(*) num from t8 where id<?";
$smt=$pdo->prepare($sql);
$smt->execute(array(5));
$arr=$smt->fetch(PDO::FETCH_ASSOC);
echo "<pre>";
print_r($arr);
echo "</pre>";
-------------
返回下一行的某一列數據fetchColumn()
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$sql="select * from t8;";
$smt=$pdo->prepare($sql);
$smt->execute();
$tot=$smt->fetchColumn();
$tot=$smt->fetchColumn();
$tot=$smt->fetchColumn(1);
echo $tot;
-------------
PDO事務機制

PDO類:
beginTransaction();//開啓任務
commit();//成功提交本次任務
rollback();//失敗撤銷本次任務
PDOException類(異常處理):
getMessage();
getFile();
getLine();

=====================================================
事物機制加異常處理完整示例:
<?php
// 鏈接數據庫
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$pdo->exec('set names utf8'); //設置客戶端字符集
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//開啓事務
$pdo->beginTransaction();
try{
    //一次事務
    $sql="insert into t5() values();";
    $smt=$pdo->prepare($sql);
    $smt->execute();
    //一次事務
    $sql="inserte into t5() values();";
    $smt=$pdo->prepare($sql);
    $smt->execute();
    // 提交
    $pdo->commit();
}catch(Exception $e){
    echo $e->getMessage().'<br>';
    // echo $e->getLine();
    //撤回
    $pdo->rollBack();
}
?>
//mysql只有這個InnoDB驅動是支持事務處理的,默認MyIsAM驅動不支持
=========================================================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>usertable</title>
</head>
<body>
    <center>
        <h1>用戶查詢</h1>
        <table width="900" border="1px" cellspacing="0">
            <tr>
                <td>id</td>
                <td>name</td>
                <td>schoolnumber</td>
                <td>QQ</td>
                <td>phonenumber</td>
                <td>sex</td>
                <td>class_id</td>
            </tr>
            <?php
                $pdo=new PDO('mysql:host=localhost;dbname=wsyjlly;','root','234');
                $sql="select * from t5;";
                $smt=$pdo->query($sql);
                $arr=$smt->fetchAll(PDO::FETCH_ASSOC);//返回關聯數組
                foreach($arr as $val){
                    echo "<tr>";
                    echo "<td>{$val['id']}</td>";
                    echo "<td>{$val['name']}</td>";
                    echo "<td>{$val['schoolnumber']}</td>";
                    echo "<td>{$val['QQ']}</td>";
                    echo "<td>{$val['phonenumber']}</td>";
                    echo "<td>{$val['sex']}</td>";
                    echo "<td>{$val['class_id']}</td>";
                    echo "</tr>";
                }
            ?>
        </table>
    </center>
</body>
</html>
===================================================
用戶模塊開發

<?php
$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$pdo->exec('set names utf8'); //設置客戶端字符集
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);//設置默認輸出數組爲關聯數組
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//pdo報錯異常處理默認
//分頁
$length=15;
$page=$_GET['p']?$_GET['p']:1;
$count=($page-1)*$length;
$sqlTot="select count(*) from t5";
$smtTot=$pdo->prepare($sqlTot);
$smtTot->execute();
$tot=$smtTot->fetchColumn();
if ($page>1){
    $last=$page-1;
}else{
    $last=1;
}
if ($page<ceil($tot/$length)) {
    $next=$page+1;
}else{
    $next=ceil($tot/$length);
}
$sql="select * from t5 limit {$count},{$length}";
$smt=$pdo->prepare($sql);
$smt->execute();
$arr=$smt->fetchAll();
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用戶模塊開發</title>
    <style>
        *{
            font-size: 18px;
        }
        h1{
            font-size: 25px;
        }
        a{
            text-decoration: none;
            color: #ff6700;
        }
    </style>
</head>
<body>
    <center>
        <h1>用戶模塊開發</h1>
        <table border='1' cellspacing="0" width="900">
            <tr>
                <td colspan="4"><a href="javascript:" onclick="location.reload()"><center>查看用戶</center></a></td>
                <td colspan="5"><a href="insert.php"><center>添加</center></a></td>
            </tr>
            <tr>
                <td>id</td>
                <td>name</td>
                <td>schoolnumber</td>
                <td>QQ</td>
                <td>phonenumber</td>
                <td>sex</td>
                <td>class_id</td>
                <td>修改</td>
                <td>刪除</td>
            </tr>
            <?php
                foreach ($arr as $val) {
                    echo "<tr>";
                    echo "<td>$val[id]</td>";
                    echo "<td>$val[name]</td>";
                    echo "<td>$val[schoolnumber]</td>";
                    echo "<td>$val[QQ]</td>";
                    echo "<td>$val[phonenumber]</td>";
                    echo "<td>$val[sex]</td>";
                    echo "<td>$val[class_id]</td>";
                    echo "<td><a href='update.php?id={$val[id]}'>修改</a></td>";
                    echo "<td><a href='delete.php?id={$val[id]}'>刪除</a></td>";
                    echo "</tr>";
                }
             ?>
        </table>
        <div>
            <a href="index.php?p=<?php echo $last ?>">上一頁 |</a>
            <a href="index.php?p=<?php echo $next ?>">下一頁</a>
        </div>
    </center>
</body>
</html>
=========================================================
cookie和session的做用
5.3版本之前coolie和session前不要有任何輸出
不一樣頁面使用同一數據的技術:
1.數據庫
2.文件
3.cookie
4.session
5.內存

cookie數組
1.設置cookie
setcookie('name','shiyi',time()+3600,'/');
setcookie('索引','值',過時時間,做用範圍);

2.刪除cookie
setcookie('name','shiyi',0,'/');    //會話後過時,即關閉瀏覽器後過時

3.清空cookie
setcookie('password','234',time()-1,'/');//當即過時

session數組
1.設置session

session_start();
$_SESSION['name']='shiyi';
$_SESSION['passwd']='125';
$_SESSION['id']='123';
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
//默認會話後過時

2.刪除session

//開啓session
session_start();

//清空session數組
$_SESSION=array();

// 3.刪除客戶端的cookie文件
setcookie('PHPDESSID','',time()-1,'/');

//刪除服務器上的PHPSESSID所對應的session文件
session_destroy();

php配置文件中設置默認session文件過時時間
session.cookie_lifetime = 0

設置關閉瀏覽器後清空session垃圾文件的時間間隔
session.gc_maxlifetime = 1440


[用戶登陸與退出系統]

php頁面跳轉:
header('location:index.php');
js頁面跳轉:
<script>location='login.php'</script>


用戶登陸界面與登陸後頁面之間的php驗證頁面
===================
<?php
// include 'config.php';
session_start();


$pdo=new PDO('mysql:host=localhost;dbname=wsyjlly','root','234');
$pdo->exec('set names utf8'); //設置客戶端字符集
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);//設置默認輸出數組爲關聯數組
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//pdo報錯異常處理默認

$name=$_POST['username'];
$password=md5($_POST['password']);
$sql="select id,name from t5 where name='{$name}' and password='{$password}' and class_id=1";
$smt=$pde->prapare($sql);
$smt->execute();
$arr=$smt->fetch();

if ($arr) {
    $_SESSION['name']=$arr['name'];
    $_SESSION['id']=$arr['id'];
    echo "<script>location='index.php'</script>";
}else{
    echo "<script>location='login.php'</script>";
}

?>
===================
全部登陸後的頁面判斷
<?php
session_start();
if(!$SESSION['id']){
    echo "<script>location='login.php'</script>";
    exit;
}

?>
===================
退出登陸前頁面與登陸頁面之間的php操做session頁面
<?php

session_start();
$_SESSION=array();
setcookie('PHPDESSID','',time()-1,'/');
session_destroy();
echo "<sctipt>location='login.php'</script>"

?>

 


====================================








php

相關文章
相關標籤/搜索