2016-03-27 35 views
0

爲了防止sql注入,我將查詢轉換爲預準備語句。我剩下一個。它也包含一個可能的空值,因此證明有點困難。將MySQL查詢轉換爲可能的空值的預準備語句

正常:

// Declare $dbc, $varA, $varB, $varC, $ID 

$varC = ($varC == '-') ? "NULL" : "'" . $varC . "'"; 

$query = "UPDATE myTable "; 
$query .= "SET VARA = '{$varA}', VARB = '{$varB}', VARC = $varC "; 
$query .= "WHERE ID = '{$ID}'"; 

$result = @mysqli_query($dbc, $query) or die("Error updating record: " . mysqli_error($dbc)); 

嘗試在事先準備好的聲明:

// Declare $dbc, $varA, $varB, $varC, $ID 

$varC = ($varC == '-') ? "NULL" : "'" . $varC . "'"; 

$query = "UPDATE myTable "; 
$query .= "SET VARA = ? VARB = ? VARC = ? "; 
$query .= "WHERE ID = ?"; 

$stmt = mysqli_prepare($dbc, $query); 
$bind = mysqli_stmt_bind_param($stmt, "ssss", $varA, $varB, $varC, $ID); 
$exec = mysqli_stmt_execute($stmt); 
mysqli_stmt_close($stmt); 
+0

只要列可以爲null,插入null應該沒有問題。我不會發送字符串「NULL」,雖然(NULL!==「NULL」),你不必引用這樣的參數'「'」。 $ varC。 「'」' - 只需發送'$ varC' – JimL

+0

我也嘗試過這種方式,但查詢似乎無法以任何方式更新數據庫。 – Ali

回答

2

爲什麼不

$varC = ($varC == '-') ? null : $varC; 

而且,你缺少的逗號查詢

$query .= "SET VARA = ?, VARB = ?, VARC = ? "; 

編輯: 我只是跑了我的變化的代碼,它似乎工作好。作爲參考,這是我使用的代碼:

<?php 
error_reporting(-1); 
ini_set('display_errors', 'On'); 

$dbc = mysqli_connect("127.0.0.1", "test", "test", "test"); 


$ID = "1"; 
$varA = "a"; 
$varB = "b"; 
$varC = "-"; 

$varC = ($varC == '-') ? null : $varC; 

$query = "UPDATE myTable "; 
$query .= "SET VARA = ?, VARB = ?, VARC = ? "; 
$query .= "WHERE ID = ?"; 

$stmt = mysqli_prepare($dbc, $query); 
$bind = mysqli_stmt_bind_param($stmt, "ssss", $varA, $varB, $varC, $ID); 
$exec = mysqli_stmt_execute($stmt); 
mysqli_stmt_close($stmt); 

你能嘗試添加錯誤報告行代碼的頂部,看看你得到任何錯誤?

+0

我也是這樣試過的,但是查詢似乎沒有更新數據庫。 – Ali

+0

@Ali,你也忘記了SET語句中所有字段之間的逗號。我會更新我的答案來解決這個問題。 – Chris

+0

不錯的抓住!,但在數據庫中沒有變化。有沒有辦法在準備好之後輸出查詢? – Ali