PHP-mySql查询执行两次

PHP-mySql查询执行两次,php,android,mysql,mysqli,Php,Android,Mysql,Mysqli,我对php还很陌生,我只是在尝试一个脚本,它写得并不合适,因为它容易受到SQL注入的攻击。我打算对此进行改进,但这只有在我学习PHP时才有可能实现。当我试图从Java(Android)发布变量并使用它们查询我的数据库时,我目前面临一个问题。但是脚本执行了两次,我在数据库中发现了重复的记录。以下是脚本: <?php require 'DbConnect.php'; $Make = $_POST["Make"]; $Model = $_POST["Model"]; $Version= $

我对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';
}

?> 

如果查询执行良好,则页面将重定向到另一个页面。因此,我们避免第二次插入数据。

没有理由执行两次代码,除非您正在刷新页面,或者连接脚本中的某些内容导致此情况发生

我的建议是放慢速度,你的脚本只有几行,但你的原始格式几乎不可读。在不同的位置有等号,无用的空白和不规则的间距,我试图为SO的观众编辑掉这些

第一次尝试做正确的事情。放弃
mysql
语法,查找
mysqli
()并使用面向对象的接口实现您的代码——这要简单得多

您的固定代码将类似于:

<?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中,变量名以小写字母开头。大写字母是为类名保留的。

此代码易受攻击,并且不推荐使用
mysql\u
函数。请改为通过使用参数化查询。单击两次后,您会发现,例如,如果我使用query()函数发布数据,并引导到您的页面,即刷新页面,它将再次发布相同的数据?取消对
if
语句的注释,并在成功插入数据后重定向。也请使用
mySQLi
PDO
如果你使用foreach循环,你可以保存很多代码:
foreach(数组(“make”,“whatever”)作为$col){if(isset($\u POST[$col]){/*复制和转义*/}否则{/*错误*/}
@这不仅仅是易受攻击的,我会努力编写更易受攻击的代码。谢谢你的朋友,我将尝试改进代码,但是我参考的教程以另一种方式教给了我,我猜它们是过时的教程。您的建议非常有用,也非常受欢迎:)我想问题出在我的java代码中,不知怎么的,该代码调用了我的PHP两次。你的答案解释得很好,再次感谢:)是的,有很多教程都是以旧的方式教授的,不幸的是,这意味着很多人在你的情况下使用不推荐的函数。祝你的节目好运。