2013-04-14 151 views
-1

在我的PHP文件,我得到了一個SQL查詢看起來像這樣:準備SQL查詢

if(isset($_GET['id'])) 
{ 
    $id = $_GET['id']; 
    $q = "SELECT * FROM `objekt_t` WHERE `id`='" . $id . "'"; 
    $row = mysqli_query($con, $q) or die(mysqli_error($con)); 
    while($r = mysqli_fetch_assoc($row)) 
    { 
     $objekt = $r; 
    } 
} 

我意識到這是關於SQL注入和這樣非常不安全的做法,所以我一直在尋找到準備的SQL querys ,使用綁定參數。看着bobby-tables.com我看到這個例子查詢:

$stmt = $db->prepare('update people set name = ? where id = ?'); 
$stmt->bind_param('si',$name,$id); 
$stmt->execute(); 

我不明白,我應該怎麼修改我的當前查詢匹配使用綁定參數更安全的一個。任何幫助表示讚賞。

回答

1

用同樣的方法

$mysqli = new mysqli("localhost", "my_user", "my_password", "db"); 

if(isset($_GET['id'])) 
{ 
    $id = $_GET['id']; 
    $q = "SELECT some_field FROM `objekt_t` WHERE `id`= ?"; 

    if ($stmt = $mysqli->prepare($q)) {  
     $stmt->bind_param("i", $id); 
     $stmt->execute(); 
     $stmt->bind_result($result); 
     $stmt->fetch(); 
    } 
} 

現在$結果變量包含您查詢的結果。

+0

我查詢的結果是在'$ stmt'還是'$ result'中? –

+0

我剛剛編輯過這篇評論。 $ result變量在腳本執行後包含查詢的結果。 – zavg

+0

嘗試'var_dump($ result);'給我NULL。爲什麼是這樣? –

1

準備語句將原始數據傳輸到查詢,以便SQL注入是不可能的。沒有必要爲real_escape_String或任何其他格式化函數轉義,因爲這樣做對你有用。

例子:

$db = new mysqli ("host","user","password","database"); 
$statement = $db->prepare("SELECT test FROM test WHERE Username=?"); 
$statement->bind_param('s',$_POST['Username']); 
$statement->execute(); 
$statement->bind_result($resultCol); 
$statement->fetch(); 
$statement->close(); 

,因爲數據被髮送爲原料,因此即使查詢中包含注射劑的形式,爲$ _ POST [我基本上是直接結合我的$ _ POST數據查詢'用戶名'];該查詢將正常運行。


中的過程和OOP風格而言,它的下跌喜好,我personlly喜歡OOP風格在其他選項,因爲它是更具可讀性。

與數字打交道:

$ID= 5; 
$db = new mysqli ("host","user","password","database"); 
$statement = $db->prepare("SELECT test FROM test WHERE ID=?"); 
$statement->bind_param('i',$ID); 
$statement->execute(); 
$statement->bind_result($resultCol); 
$statement->fetch(); 
$statement->close(); 

或者你可以用精確值直接在聲明中工作:

$db = new mysqli ("host","user","password","database"); 
$statement = $db->prepare("SELECT test FROM test WHERE ID='5'"); 
$statement->execute(); 
$statement->bind_result($resultCol); 
$statement->fetch(); 
$statement->close(); 
+0

如何我使用查詢的結果呢?嘗試'var_dump($ resultCol);'給我null。我不明白如何使用/調用查詢的結果。 –

+0

通過我的修改,您應該修改'prepare'中的查詢以從您的數據庫返回有效的結果。 bind_result會將一個變量綁定到所使用的列上,所以如果您在查詢中選擇4列,則需要分配4個變量 –

+0

如果我將整個'prepare'行更改爲'$ db-> prepare( 「SELECT * FROM objekt_t WHERE id =?」);'和下面一行到'bind_param('s','5');',只有1列可以被選作我的表中只有1列'ID ='5''。當我嘗試'var_dump($ resultCol);'時,這仍然沒有給我提供任何幫助。我覺得我失去了一些明顯的東西。 –

0

你可以這樣說:

$stmt = $mysqli->prepare('SELECT * FROM objekt_t WHERE id = ?'); 
$stmt->bind_param('i', $id); 
$stmt->execute(); 

$result = $stmt->get_result(); 

while ($row = $result->fetch_assoc()) { 
    // $row is an associative array 
} 
+0

更改行'// $行是關聯數組''var_dump($ row);'執行時給我一個空文檔,爲什麼? –

+0

get_result方法需要MySQL本地驅動程序(mysqlnd)。可能是你沒有安裝它。 – jithujose