我对php很陌生,我只是尝试使用脚本,但它并不适合编写,因为它易受SQL注入攻击。我打算对此进行改进,但这只有在PHP推进时才有可能。当我尝试从Java(Android)发布变量并使用它们来查询我的数据库时,我正面临一个问题。但是脚本执行了两次,我在数据库中找到了重复的记录。以下是剧本:
<?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';
}
?>
答案 0 :(得分:2)
除非您刷新页面,否则没有理由将代码执行两次,或者连接脚本中的某些内容导致代码执行。
我的建议是放慢速度,你的脚本只有几行但你的原始格式几乎无法读取。你有不同位置的标志,无用的空白区域和不规则的间距,我试图为SO观众编辑。
第一次尝试做正确的事情。放弃mysql
语法,查找mysqli
(documentation & 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 = string,i = int等。您需要按正确的顺序正确列出这些参数。如果需要帮助,请参阅文档。绑定参数完全消除了SQL注入攻击的可能性,并且是在传递用户输入值时使用MySQL的首选方法。
在一个不相关的注释中,通常在PHP中我们用小写字母开始变量名。大写字母是为类名保留的。
答案 1 :(得分:0)
如果条件查询执行得很好,那么页面将重定向到另一个。所以我们避免第二次插入数据。