2013-04-26 132 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我们,避免数据的第二次插入。