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 字符告訴數據庫該參數為字符串。

4. MySQLi 預處理語句及綁定結果
<?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(); ?>
詳情請看:網頁鏈接