PHP開發中遇到的問題


1. 數據庫連接

問題:在執行sql語句的函數中,因為strsql用單引號引住,所以里面的變量值無法獲得,

方法一:

通過字符串連接的方式完成(.):‘字符串’+.變量來構成一條完整的sql語句。如下面代碼所示:

//這個函數的作用是,如果輸入框的數據發生改變,則更新到服務器中
public function UpdateProjInfo($uPid = 0)
    {
        $uPid = intval($uPid);
        if ($uPid <= 0)
        {
            echo '{"success":0,"error":"未指定項目"}';
            return;
        }
          //從前端獲取兩個數據:column和changed_value  
        $column = $_POST['col'];
        $changed_value = $_POST['changed_value'];
        $oDBConn = $this->_createMysqlConn();
        $oResult = $this->_execSql($oDBConn,'UPDATE `tbl_project` SET '.$column.'='. $changed_value);

        if ($oResult)
            $strRsp = '{"success":1,"messg":"Update Success"}';
        else
            $strRsp = '{"success":0,"error":"數據更改失敗"}';
        mysqli_close($oDBConn);
        echo $strRsp;
        }
};    

方法二:預處理語句

在網上還找到一種方式——預處理語句,綁定參數及綁定結果。因為我們項目中封裝的是mysqli接口,blabla我也不太清楚,一直沒成功,所以只是先貼在這里,供以后參考。

預處理語句對於防止 MySQL 注入是非常有用的。使用預准備語句可提高重復使用語句的性能,在PHP中,使用prepare()方法來進行預准備語句查詢,使用execute()方法來執行預准備語句。PHP有兩種預准備語句:一種是綁定結果,另一種是綁定參數

1. 工作原理

1)預處理:創建SQL語句模板並發送到數據庫。預留的值用參數“?”來標記,例如:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)";

2)數據庫解析,編譯,對SQL語句模板執行查詢優化,並存儲結果不輸出。

3)執行:最后,將應用綁定的值傳遞給參數(”?” 標記),數據庫執行語句。應用可以多次執行語句,如果參數的值不一樣。

2. 優點

相比於直接執行SQL語句,預處理語句有兩個主要優點:

  • 預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執行)。
  • 綁定參數減少了服務器帶寬,你只需要發送查詢的參數,而不是整個語句。
  • 預處理語句針對SQL注入是非常有用的,因為參數值發送后使用不同的協議,保證了數據的合法性。

3. 具體實現——MySQLi 預處理語句及綁定參數

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "ikeepstudying";

// 創建連接
$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);

// 設置參數並執行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();

echo "新記錄插入成功";

$stmt->close();
$conn->close();
?>
解析以下實例的每行代碼:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"

在 SQL 語句中,我們使用了問號 (?),在此我們可以將問號替換為整型,字符串,雙精度浮點型和布爾值。

接下來,讓我們來看下 bind_param() 函數:

$stmt->bind_param("sss", $firstname, $lastname, $email);

該函數綁定了 SQL 的參數,且告訴數據庫參數的值。 “sss” 參數列處理其余參數的數據類型。s 字符告訴數據庫該參數為字符串。

types:綁定的變量的數據類型,它接受的字符種類包括4個,如表所示。
參數types接受的字符的種類和綁定的變量需要一一對應。通過告訴數據庫參數的數據類型,可以降低 SQL 注入的風險。

4. MySQLi 預處理語句及綁定結果

所謂綁定結果就是 把PHP腳本中的自定義變量綁定到結果集中的相應字段上,這些變量就代表着所查詢的記錄,綁定結果的示例代碼如下:
<?php
    $mysqli = new mysqli("localhost","root","root","ikeepstudying");     //實例化mysqli
    $query  = "select * from MyGuests";
    $result = $mysqli->prepare($query);                                  //進行預准備語句查詢
    $result->execute();                                                  //執行預准備語句
    $result->bind_result($id,$firstname,$lastname,$email);                        //綁定結果
    while ($result->fetch()) {
        echo $id;
        echo $firstname;
        echo $lastname;
        echo $email;
    }
    $result->close();                                                     //關閉預准備語句
?>

在綁定結果的時候,腳本中的變量要與結果集中的字段一一對應,綁定完以后,通過fetch()方法將綁定在結果集中的變量一一取出來,最后將預准備語句和數據庫連接分別關閉。

5. MySQLi 同時綁定參數和綁定結果

在一個腳本中還可以同時綁定參數和綁定結果,示例代碼如下:

<?php
    $conn   = new mysqli("localhost","root","root","ikeepstudying");     //實例化mysqli
    $query  = "select * from MyGuests where id < ?";
    $result = $conn->prepare($query);
    $result->bind_param("i",$id);                                    //綁定參數
    $id=4;
    $result->execute();
    $result->bind_result($id,$number,$name,$age);                   //綁定結果
    while ($result->fetch()) {
        echo $id;
        echo $firstname;
        echo $lastname;
        echo $email;
    }

    $result->close();
    $conn->close();
?>

詳情請看:網頁鏈接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM