PHP防止SQL注入方法

方法一:execute代入參數

<?php
if(count($_POST)!= 0) {

    $host = 'aaa';
    $database = 'bbb';
    $username = 'ccc';
    $password = '***';

    $num = 0;
    $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);//創建一個pdo對象
    foreach ($_POST as $var_Key => $var_Value) {

        //獲取POST數組最大值
        $num = $num + 1;
    }

    //下標爲i的數組存儲的是商品id, 下標爲j數組的存儲的是此商品的庫存
    for($i=0;$i<$num;$i=$i+2)

    {
        //庫存下標
        $j = $i+1;

        //判斷傳遞過來的數據合法性
        if(is_numeric(trim($_POST[$i])) && is_numeric(trim($_POST[$j]))){

            //禁用prepared statements的仿真效果
            $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

           //查詢數據庫中是否存在該ID的商品
            //當調用 prepare() 時,查詢語句已經發送給了數據庫服務器,此時只有佔位符 ? 發送過去,沒有用戶提交的數據
            $stmt = $pdo->prepare("select good_id from delphi_test_content WHERE good_id = ?");
           //當調用到 execute()時,用戶提交過來的值纔會傳送給數據庫,他們是分開傳送的,兩者獨立的,SQL攻擊者沒有一點機會。
            $stmt->execute(array($_POST[$i]));

            //返回查詢結果
            $count = $stmt->rowCount();

            //如果本地數據庫存在該商品ID和庫存記錄,就更新該商品的庫存
            if($count != 0)
            {
                $stmt = $pdo->prepare("update delphi_test_content set content = ? WHERE good_id = ?");
                $stmt->execute(array($_POST[$j], $_POST[$i]));

            }

            //如果本地數據庫沒有該商品ID和庫存記錄,就新增該條記錄
            if($count == 0)
            {
                $stmt = $pdo->prepare("insert into delphi_test_content (good_id,content) values (?,?)");
                $stmt->execute(array($_POST[$i], $_POST[$j]));

            }
        }

    }
    $pdo = null;
    //關閉連接
}
?>

方法二:bindParam綁定參數

<?php
if(count($_POST)!= 0) {

    $host = 'aaa';
    $database = 'bbb';
    $username = 'ccc';
    $password = '***';


    $num = 0;
    $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);//創建一個pdo對象
    foreach ($_POST as $var_Key => $var_Value) {

        //獲取POST數組最大值
        $num = $num + 1;
    }

    //下標爲i的數組存儲的是商品id, 下標爲j數組的存儲的是此商品的庫存
    for($i=0;$i<$num;$i=$i+2)

    {
        //庫存下標
        $j = $i+1;

        //判斷傳遞過來的數據合法性(此數據爲商品編號以及庫存,嚴格來說字符串全是由數字組成的)
        if(is_numeric(trim($_POST[$i])) && is_numeric(trim($_POST[$j]))){

            //查詢數據庫中是否存在該ID的商品
            $stmt = $pdo->prepare("select good_id from delphi_test_content WHERE good_id = ?");
            $stmt->execute(array($_POST[$i]));
            $stmt->bindParam(1,$_POST[$i]);
            $stmt->execute();

            //返回查詢結果
            $count = $stmt->rowCount();

            //如果本地數據庫存在該商品ID和庫存記錄,就更新該商品的庫存
            if($count != 0)
            {
                $stmt = $pdo->prepare("update delphi_test_content set content = ? WHERE good_id = ?");
                $stmt->execute(array($_POST[$j], $_POST[$i]));
                $stmt->bindParam(1,$_POST[$j]);
                $stmt->bindParam(2,$_POST[$i]);
                $stmt->execute();
            }

            //如果本地數據庫沒有該商品ID和庫存記錄,就新增該條記錄
            if($count == 0)
            {
                $stmt = $pdo->prepare("insert into delphi_test_content (good_id,content) values (?,?)");
                $stmt->bindParam(1,$_POST[$i]);
                $stmt->bindParam(2,$_POST[$j]);
                $stmt->execute();
            }
        }

    }
    $pdo = null;
    //關閉連接
}
?>

發佈了55 篇原創文章 · 獲贊 32 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章