2013-04-26 128 views
0

我很新的PHP和我只是想我的手在一個腳本,它不恰當地寫然而,因爲它是容易受到SQL注入。我打算在這方面做出改進,但這隻有在PHP推進時纔有可能。當我嘗試從Java(Android)POST變量並使用它們查詢數據庫時,我正面臨着一個問題。然而,腳本執行兩次,我發現我的數據庫中有重複的記錄。以下是該腳本:PHP - MySQL查詢執行兩次

<?php 

require 'DbConnect.php'; 


$Make = $_POST["Make"]; 
$Model = $_POST["Model"]; 
$Version= $_POST["Version"]; 
$FuelType= $_POST["FuelType"]; 
$Kilo = $_POST["Kilo"]; 
$Price= $_POST["Price"]; 
$Reg= $_POST["Reg"]; 
$Color= $_POST["Color"]; 
$Mdate= $_POST["Mdate"]; 
$Desc= $_POST["Desc"]; 
$Loc= $_POST["Loc"]; 
$Owners = $_POST["Owners"]; 
$Negot= $_POST["Negot"]; 
$Trans= $_POST["Trans"]; 
$AC= $_POST["AC"]; 
$car_lockk= $_POST["Lockk"]; 
$Sunroof= $_POST["Sunroof"]; 
$Window= $_POST["Window"]; 
$Seat= $_POST["Seats"]; 
$Stearing= $_POST["Stearing"]; 
$Music= $_POST["Player"]; 
$Wheels= $_POST["Wheel"]; 
$Sound= $_POST["Sound"]; 
$Drive= $_POST["Drive"]; 
$ID = $_POST["Seller_ID"]; 

$query2 = "INSERT INTO used_cars (make, model, version, color, \ 
    manufacturing_date, km_driven, fuel_type, expected_price, \ 
    negotiable, registration_place, no_of_owners, description, \ 
    current_location, transmission, ac, sunroof, window, seats, \ 
    stearing, player, wheels, sound_system, drive, car_lockk, seller_id) \ 
    VALUES ('$Make', '$Model', '$Version', '$Color', '$Mdate', '$Kilo', \ 
    '$FuelType', '$Price', '$Negot', '$Reg', '$Owners', '$Desc', '$Loc', \ 
    '$Trans', '$AC', '$Sunroof', '$Window', '$Seat', '$Stearing', \ 
    '$Music', '$Wheels', '$Sound', '$Drive', '$car_lockk', '$ID')"; 

if(mysql_query($query2)){ 
    echo 'success'; 
    //echo $Img 
}else{ 
    echo 'Fail'; 
} 

?> 
+4

此代碼是易受[SQL注入](https://www.owasp.org/index.php/SQL_Injection),以及'mysql_'功能棄用。請改爲通過[MySQLi](http://php.net/manual/en/book.mysqli.php)使用參數化查詢。 – Polynomial 2013-04-26 12:30:47

+0

經過兩次點擊後,您會知道,例如,如果我發佈了我的數據,並使用query()函數引導到您的頁面,並且刷新頁面,它會再次發佈相同的數據? – 2013-04-26 12:32:40

+0

取消註釋'if'語句,並在成功插入數據後重定向。請使用'mySQLi'或'PDO'。 – chriz 2013-04-26 12:39:08

回答

2

沒有理由要執行的代碼兩次,除非你刷新頁面,或者說在你的連接腳本導致它發生。

我的建議是慢下來,你的劇本是隻與原始格式是勉強讀了幾行呢。你有不同位置的等號,無用的空白空間以及我試圖爲SO讀者編輯的不規則空格。

嘗試做正確的事情還是第一次。放棄mysql語法,查找mysqlidocumentation & examples),並使用面向對象的接口實現您的代碼 - 這非常簡單。

你固定的代碼看起來類似:

<?php 
    // Create DB connection object 
    $mysqli = new mysqli("localhost","username","password","database"); 

    // Get our POST variables 
    $make = $_POST["Make"]; 
    ... put them here ... 
    $id = $_POST["Seller_ID"]; 

    // Create our base query and bind parameters 
    $query = $mysqli->prepare("INSERT INTO used_cars (make, ..., id) VALUES (?, ..., ?)"); 
    $query->bind_param('s...i', $make, ..., $id); 

    if($query->execute()) { // Will return true on success 
     echo "Success"; 
    } else { 
     echo "Fail"; 
    } 
?> 

的第一個參數是bind_param數據類型的列表:S =串,I = INT等您需要正確的列出這些正確的順序。如果您需要幫助,請參閱文檔。綁定參數完全消除了SQL注入攻擊的可能性,並且是傳遞用戶輸入值時使用MySQL的首選方式。

在一個不相關的說明中,通常在PHP中我們用小寫字母開始變量名。大寫字母保留給類名稱。

+0

謝謝你的隊友,我會盡力改善代碼,但是我所教的教程讓我以另一種方式猜他們過時的教程。你的建議是非常有用的,非常感謝:)我想這個問題在於我的java代碼,不知何故,代碼是兩次調用我的PHP。你的答案很好解釋再次感謝:) – 2013-04-27 04:01:09

+1

是的,有很多教程不幸的教老方式,這意味着很多人在你的情況下來到這裏使用不推薦使用的函數。祝你的節目順利。 – 2013-04-27 06:12:58

0

中,如果條件執行以及隨後頁面查詢將重定向到另一個one.so我們,避免數據的第二次插入。