php筆記總結1111

原文鏈接:http://www.runoob.com/php/php-file.html
方法的表單發送的信息,對任何人都是不可見的(不會顯示在瀏覽器的地址欄),並且對發送信息的量也沒有限制。
然而,默認情況下,POST 方法的發送信息的量最大值爲 8 MB(可通過設置 php.ini 文件中的 post_max_size 進行更改)。
eg:<?php echo $_POST["fname"]; ?>
    <?php echo $_POST["age"]; ?>

$_REQUEST 
包含了 $_GET、$_POST 和 $_COOKIE 的內容。
可用來收集通過 GET 和 POST 方法發送的表單數據。
eg:<?php echo $_REQUEST["fname"]; ?>
    <?php echo $_REQUEST["age"]; ?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

日期

date()將時間戳轉化爲可讀性好的日期
eg:
    <?php
    echo date("Y/m/d") . "<br>";
    echo date("Y.m.d") . "<br>";
    echo date("Y-m-d");
    ?>
http://www.runoob.com/php/php-date.html
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

include & require

在服務器執行php之前在該文件中插入一個文件的內容
include如果出錯,會繼續執行下去
require如果出錯,會終止後續的執行
eg:
    <?php include 'header.php'; ?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

文件

fopen() 用於打開文件
fclose()用於關閉文件
feof()  檢測文件是否到達末尾
fgets() 逐行讀取文件
fgetc() 逐字符讀取文件

http://www.runoob.com/php/php-file.html
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

文件上傳

文件上傳表單+處理php代碼
表單:
<form action="upload_file.php" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>
enctype表示提交表單時使用的內容類型
type="file"規定將輸入作爲文件處理
文件上傳是一個安全風險,要謹慎開放
使用$_FILES作爲文件上傳的容器
通過對$_FILES的各個屬性做限制來約束上傳文件的屬性
$_FILES["file"]["name"] - 上傳文件的名稱
$_FILES["file"]["type"] - 上傳文件的類型
$_FILES["file"]["size"] - 上傳文件的大小,以字節計
$_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱
$_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼
上傳之後還需要保存的操作,將其拷貝到upload文件夾下,否則只有一個臨時的文件副本。
eg:
    if (file_exists("upload/" . $_FILES["file"]["name"])){
        echo $_FILES["file"]["name"] . " 文件已經存在。 ";
    } else {
        // 如果 upload 目錄不存在該文件則將文件上傳到 upload 目錄下
        move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
        echo "文件存儲在: " . "upload/" . $_FILES["file"]["name"];
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Cookie

常用於識別用戶
是一種服務器留在用戶計算機上的小文件,當同一臺計算機通過瀏覽器請求頁面時,這臺計算機將會發送cookie
setcookie()     設置cookie值   必須位於<html>標籤之前
setcookie(name, value, expire, path, domain); //cookie名,值,過期時間(單位是秒),路徑,主機名
setrowcookie()  設置原始cookie,不會被URL編碼
$_COOKIE['cookie名'] 取回cookie值
eg:
    <?php
    if (isset($_COOKIE["user"]))
        echo "歡迎 " . $_COOKIE["user"] . "!<br>";
    else
        echo "普通訪客!<br>";
    ?>
將expire的時間設置爲過去,值設置爲空即可刪除該cookie
eg:
    <?php
    // 設置 cookie 過期時間爲過去 1 小時
    setcookie("user", "", time()-3600);
    ?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Session

用於存儲關於用戶會話的信息,或者更改用戶會話的設置。
Session 變量存儲單一用戶的信息,並且對於應用程序中的所有頁面都是可用的。
Session 的工作機制:
    爲每個訪客創建一個唯一的 id (UID),並於這個 UID 來存儲變量。UID 存儲在 cookie 中,或者通過 URL 進行傳導。
啓動會話    
    session_start()     
    必須位於<html>標籤之前      
    向服務器註冊會話以便保存用戶信息並分配一個UID
存儲和引用Session    
    $_SESSION['session名']
銷燬Session   
    unset($_SESSION['session名'])   釋放指定的session變量
    session_destroy()   徹底銷燬session 將會重置session會失去所有爲未儲的session
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

E-mail

mail(to,subject,message,headers,parameters)
*需要有一個已安裝且正在運行的郵件系統,通過php.ini設置
爲了防止注入攻擊需要對輸入做檢查和過濾
filter_var()
  • 1
  • 2
  • 3
  • 4
  • 5

錯誤處理

報錯時會直接將錯誤發送給瀏覽器包含文件名,行號,錯誤的消息,但這顯然是不安全的
解決辦法:
    A.  die(),用if...else...添加判斷,如果出錯,用die()返回提示消息,但是這種辦法會終止腳本的執行
        eg:
            <?php
            if(!file_exists("welcome.txt"))
            {
                die("文件不存在");
            }
            else
            {
                $file=fopen("welcome.txt","r");
            }
            ?>
    B.  創建自定義錯誤處理器
        error_function(error_level,error_message,error_file,error_line,error_context)
        http://www.runoob.com/php/php-error.html
        eg:
            function customError($errno, $errstr)// 錯誤處理函數
            {
                echo "<b>Error:</b> [$errno] $errstr<br>";
                echo "腳本結束";
                die();
            }
            set_error_handler("customError");// 設置錯誤處理函數
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

異常

try throw catch結構來實現,總體和Java是類似的
可以拋出多個異常被多個catch捕獲並處理
可以重新拋出異常,對用戶顯示友好的提示,對後臺顯示真正的錯誤位置(在catch塊中再次throw)
頂層異常處理器,用於處理所有未被捕獲的異常,set_exception_handler()
  • 1
  • 2
  • 3
  • 4
  • 5

過濾器

過濾的目的是防止非安全來源的數據對系統造成破壞
表單數據,cookies,web服務數據,服務器變量,數據庫查詢結果都是外部數據都需要過濾
filter_var() - 通過一個指定的過濾器來過濾單一的變量
filter_var_array() - 通過相同的或不同的過濾器來過濾多個變量
filter_input - 獲取一個輸入變量,並對它進行過濾
filter_input_array - 獲取多個輸入變量,並通過相同的或不同的過濾器對它們進行過濾
參數包含待過濾的變量和過濾器(例如,FILTER_VALIDATE_EMAIL用於驗證傳入的變量是否是一個email地址)
過濾器種類和過濾函數參考鏈接http://www.runoob.com/php/php-ref-filter.html
過濾器有兩類Validating和Sanitizing
V用於驗證用戶輸入,有嚴格的格式規則(URL,E-mail),如果成功則返回預期的類型否則返回false
S用於允許或禁止字符串中指定的字符,無數據格式規則,始終返回字符串
通過filter callback可以調用自己設置的過濾器,參數有一個關聯數組,鍵爲options
<?php
function convertSpace($string)
{
    return str_replace("_", ".", $string);
}

$string = "www_runoob_com!";

echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>
http://www.runoob.com/php/php-filter.html
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

PHP與mySQL

A.  連接和關閉數據庫
有mysqli和PDO兩種辦法,mysqli專用,PDO通用
mysqli:
  • 1
  • 2
  • 3
  • 4
        <?php
        $servername = "localhost";
        $username = "username";
        $password = "password";

        // 創建連接
        $conn = new mysqli($servername, $username, $password);

        // 檢測連接
        if ($conn->connect_error) {
            die("連接失敗: " . $conn->connect_error);
        } 
        echo "連接成功";
        //關閉連接
        $conn->close();
        ?>
    PDO:
        <?php
        $servername = "localhost";
        $username = "username";
        $password = "password";

        try {
            //需要指定數據庫名
            $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
            echo "連接成功"; 
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
        //關閉連接
        $conn = null;
        ?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
B.  創建數據庫
mysqli:
  • 1
  • 2
  • 3
        $sql = "CREATE DATABASE myDB";
        if ($conn->query($sql) === TRUE) {
            echo "數據庫創建成功";
        } else {
            echo "Error creating database: " . $conn->error;
        }
    PDO:
        try { 
            $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password); 

            // 設置 PDO 錯誤模式爲異常 
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
            $sql = "CREATE DATABASE myDBPDO"; 

            // 使用 exec() ,因爲沒有結果返回,如果出錯會拋出異常進入catch塊 
            $conn->exec($sql); 

            echo "數據庫創建成功<br>"; 
        } 
        catch(PDOException $e) 
        { 
            echo $sql . "<br>" . $e->getMessage(); 
        } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
C.  創建表
    和標準sql一樣的辦法,執行過程與B類似,mysqli判斷返回值真假,PDO直接exec()
D.  插入、修改、刪除數據
    和標準sql一樣的辦法,執行過程與B類似,mysqli判斷返回值真假,PDO直接exec()
E.  查詢數據
mysqli:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
    <?php
    $servername = "localhost";
    $username = "username";
    $password = "password";
    $dbname = "myDB";

    // 創建連接
    $conn = new mysqli($servername, $username, $password, $dbname);
    // 檢測連接
    if ($conn->connect_error) {
        die("連接失敗: " . $conn->connect_error);
    } 

    $sql = "SELECT id, firstname, lastname FROM MyGuests";
    $result = $conn->query($sql);//返回查詢結果集

    if ($result->num_rows > 0) {
        // 輸出每行數據
        while($row = $result->fetch_assoc()) {//fetch_assoc用於取出每一個結果
            echo "<br> id: ". $row["id"]. " - Name: ". $row["firstname"]. " " . $row["lastname"];
        }
    } else {
        echo "0 個結果";
    }
    $conn->close();
    ?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
PDO:
  • 1
  • 2
    <?php
    echo "<table style='border: solid 1px black;'>";
    echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th><th>Email</th><th>Reg date</th></tr>";//設置表頭

    class TableRows extends RecursiveIteratorIterator { //構造出一個表的結構
        function __construct($it) { 
            parent::__construct($it, self::LEAVES_ONLY); 
        }

        function current() {
            return "<td style='width: 150px; border: 1px solid black;'>" . parent::current(). "</td>";
        }

        function beginChildren() { 
            echo "<tr>"; 
        } 

        function endChildren() { 
            echo "</tr>" . "\n";
        } 
    } 

    $servername = "localhost";
    $username = "username";
    $password = "password";
    $dbname = "myDBPDO";

    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $conn->prepare("SELECT * FROM MyGuests"); 
        $stmt->execute();

        // 設置結果集爲關聯數組
        $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 

        foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
            echo $v;
        }
        $dsn = null;
    }
    catch(PDOException $e)
    {
        echo "Error: " . $e->getMessage();
    }
    $conn = null;
    echo "</table>";
    ?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
F.  預處理語句
目的:
    在大量重複操作時,提高數據庫操作效率,節省帶寬
    防止SQL注入攻擊,
mysqli:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
        <?php
        $servername = "localhost";
        $username = "username";
        $password = "password";
        $dbname = "myDB";

        // 創建連接
        $conn = new mysqli($servername, $username, $password, $dbname);

        // 檢測連接
        if ($conn->connect_error) {
            die("連接失敗: " . $conn->connect_error);
        }

        // 預處理及綁定
        $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");
        $stmt->bind_param("sss", $firstname, $lastname, $email);//sss表示後續共三個參數,每個參數都是string類型 i(int) d(double) s(string) b(BLOB二進制大對象)

        // 設置參數並執行
        $firstname = "John";
        $lastname = "Doe";
        $email = "[email protected]";
        $stmt->execute();

        $firstname = "Mary";
        $lastname = "Moe";
        $email = "[email protected]";
        $stmt->execute();

        $firstname = "Julie";
        $lastname = "Dooley";
        $email = "[email protected]";
        $stmt->execute();

        echo "新記錄插入成功";

        $stmt->close();
        $conn->close();
        ?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
PDO:
  • 1
  • 2
        <?php
        $servername = "localhost";
        $username = "username";
        $password = "password";
        $dbname = "myDBPDO";

        try {
            $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
            // 設置 PDO 錯誤模式爲異常
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            // 預處理 SQL 並綁定參數,這裏與mysqli略有不同
            $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) 
            VALUES (:firstname, :lastname, :email)");
            $stmt->bindParam(':firstname', $firstname);
            $stmt->bindParam(':lastname', $lastname);
            $stmt->bindParam(':email', $email);

            // 插入行
            $firstname = "John";
            $lastname = "Doe";
            $email = "[email protected]";
            $stmt->execute();

            // 插入其他行
            $firstname = "Mary";
            $lastname = "Moe";
            $email = "[email protected]";
            $stmt->execute();

            // 插入其他行
            $firstname = "Julie";
            $lastname = "Dooley";
            $email = "[email protected]";
            $stmt->execute();

            echo "新記錄插入成功";
        }
        catch(PDOException $e)
        {
            echo $sql . "<br>" . $e->getMessage();
        }
        $conn = null;
        ?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章