【问题标题】:Two records insert into Mysql Database other than one两条记录插入Mysql数据库而不是一条
【发布时间】:2019-10-21 08:54:00
【问题描述】:

我有一个问题。它不是让记录插入一次,而是在数据库表中插入两次。我正在使用 Javascript 函数将数据发送到 PHP,现在它将数据保存到数据库,毫无疑问,但不是有一个记录,而是保存了两次。我没有理由解释为什么会这样。

我用来保存数据的 javascript 如下所示:

function submitFormData(){
    var xhr = new XMLHttpRequest();
    var url = 'submit_request.php';
    var fullname = document.getElementById("fullname").value;
    var address = document.getElementById("address").value;
    var address2 = document.getElementById("address2").value;
    var city = document.getElementById("city").value;
    var state = document.getElementById("state").value;
    var telephone = document.getElementById("telephone").value;
    var email = document.getElementById("email").value;
    var vehicle_type = document.getElementById("vehicle_type").value;
    var vehicleNo = document.getElementById("vehicleNo").value;
    var visit_date = document.getElementById("visit_date").value;
    var visit_purpose = document.getElementById("visit_purpose").value;
    var whom_tosee = document.getElementById("whom_tosee").value;
    var login_time = document.getElementById("login_time").value;

    var params = 'fullname='+fullname+'&address='+address+'&address2='+address2+'&city='+city+'&state='+state+'&telephone='+telephone+'&email='+email+'&vehicle_type='+vehicle_type+'&vehicleNo='+vehicleNo+'&visit_date='+visit_date+'&visit_date='+visit_date+'&visit_purpose='+visit_purpose+'&whom_tosee='+whom_tosee+'&login_time='+login_time+'';

    var txt = 'Please confirm the following Information\n FullName : '+fullname+'\n Address : '+address+'\n Address2 : '+address2+'\n City: '+city+'\n State: '+state+'\n Telephone: '+telephone+'\n Email: '+email+'\n Vehicle Type: '+vehicle_type+'\n Vehicle #: '+vehicleNo+'\n Visit Date: '+visit_date+'\n Visit Purpose : '+visit_purpose+'\n Who To see : '+whom_tosee+'\n Login Time : '+login_time+'';
    var response = confirm(txt);

    if(response == true){
        xhr.open('GET', url, true);
        xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4 && xhr.status == 200) {
               // alert('Sending Data');
                var finalurl = url +'?'+params;
                window.location = finalurl;
            }
        }
        xhr.send(params);
    }else{
        window.location ='e-vmsreserve.php';
    }

}

用于将数据保存到数据库中的 PHP 看起来像这样

<?php
        session_start();
        if(!isset($_SESSION['userID']))
        {
                header("location: index.php");
        }
?>

<?php
require_once('inc/config.php');

$con = mysqli_connect($host,$user,$pass,$db) or die ('Cannot connect: '.mysqli_error());

$query = "SELECT * FROM evmsdbusers WHERE username = '".$_SESSION['userID']."'";
$result = mysqli_query($con,$query) or die('Bad Query: '.mysqli_error($con));
while($row = mysqli_fetch_array($result)){

$fullname = $row['fullname'];
$username = $row['username'];
$designation = $row['designation'];
}


?>

<?php

require_once('inc/config.php');

$con = mysqli_connect($host, $user, $pass, $db) or die('Cannot connect, Reason:'.mysqli_error());

$fullname = mysqli_real_escape_string($con,$_GET['fullname']);
$address = mysqli_real_escape_string($con,$_GET['address']);
$address2 = mysqli_real_escape_string($con,$_GET['address2']);
$city = mysqli_real_escape_string($con,$_GET['city']);
$state = mysqli_real_escape_string($con,$_GET['state']);
$telephone = mysqli_real_escape_string($con,$_GET['telephone']);
$email = mysqli_real_escape_string($con,$_GET['email']);
$vehicle_type = mysqli_real_escape_string($con,$_GET['vehicle_type']);
$vehicleNo = mysqli_real_escape_string($con,$_GET['vehicleNo']);
$visit_date = mysqli_real_escape_string($con,$_GET['visit_date']);
$visit_purpose = mysqli_real_escape_string($con,$_GET['visit_purpose']);
$whom_tosee = mysqli_real_escape_string($con,$_GET['whom_tosee']);
$login_time = mysqli_real_escape_string($con,$_GET['login_time']);
$invitee_username =$username;


$sql = "insert into new_reservation (fullname,address,address2,city,state,telephone,email,vehicle_type,vehicleNo,visit_date,visit_purpose,whom_tosee,login_time,visitor_username) values ('".$fullname."','".$address."','".$address2."','".$city."','".$state."','".$telephone."','".$email."','".$vehicle_type."','".$vehicleNo."','".$visit_date."','".$visit_purpose."','".$whom_tosee."','".$login_time."','".$invitee_username."')";
    mysqli_query($con, $sql) or die ('Bad Query, Reason: '.mysqli_error($con));

    $message = "Appointment Reserved!";
    echo '<script type="text/javascript">'; 
    echo 'alert("'.$message.'");'; 
    echo '</script>';

?>

现在我似乎不明白为什么我有 2 条记录,虽然不重复但它应该只有一条记录。

【问题讨论】:

  • 为什么在post数据的时候使用$_GET方法,还要使用prepare语句来防止SQL注入
  • GET with insert 是 SQL 注入的公开邀请,其次,由于$_GET,这将在每次刷新时插入
  • @RobinSingh,$_GET 是重复记录的原因吗?
  • 不,这不是原因

标签: javascript php mysql


【解决方案1】:

首先,您的代码对 SQL 注入是开放的,使用$_GET 是对 SQL 注入的公开邀请。我建议你使用 Prepared 语句,这样可以防止你的代码受到 SQL 攻击。

代码中的问题window.location = finalurl; 这一行,这将重定向到具有相同参数的相同php 文件,并且由于$_GET 值,您的查询将插入两次。

因此,您只需在收到response 200 时显示您的回复,无需使用相同的参数重定向到相同的网址'submit_request.php'

一些有用的链接:

Are PDO prepared statements sufficient to prevent SQL injection?

Prepared Statement Manaul

header(); 之后总是有更多建议exit();,否则您的代码将不会终止。

php - Should I call exit() after calling Location: header?

【讨论】:

  • 如果我把 window.location 拿走,它不会保存到数据中,它甚至不会重定向,如果我把它加回去,它会保存,但我有 2 条记录
  • @Sam: 是的,删除这部分,然后告诉我你的 php 代码 SELECT 和 INSERT 都在 1 个文件中??
  • 第二个文件是“submit_request.php”,它应该访问从 javascript 创建的 GET 请求,所以是的,SELECT 假设使用会话来获取信息,我将在插入语句。所以是的,它们是一个文件。
  • @Sam: 好的,那你又犯了一个错误,不要建立数据库连接两次
  • @Sam: 在mysqli_query($con, $sql) or die ('Bad Query, Reason: '.mysqli_error($con)); 之前第二次使用echo $sql; exit; 并分享结果,请打印一次或两次查询
【解决方案2】:

谢谢 DevPro,不知何故我设法看到了错误所在。执行get请求时,应该在模式url+'?'+parameters

我记得并在我的代码中尝试过,不知何故它现在保存得很好,没有重复记录或双重插入。如果将来有人需要它:),PHP 保持不变。

我是这样做的 xhr.open('GET', url+"?"+params, true);

function submitFormData(){
    var xhr = new XMLHttpRequest();
    var url = 'submit_request.php';
    var fullname = document.getElementById("fullname").value;
    var address = document.getElementById("address").value;
    var address2 = document.getElementById("address2").value;
    var city = document.getElementById("city").value;
    var state = document.getElementById("state").value;
    var telephone = document.getElementById("telephone").value;
    var email = document.getElementById("email").value;
    var vehicle_type = document.getElementById("vehicle_type").value;
    var vehicleNo = document.getElementById("vehicleNo").value;
    var visit_date = document.getElementById("visit_date").value;
    var visit_purpose = document.getElementById("visit_purpose").value;
    var whom_tosee = document.getElementById("whom_tosee").value;
    var login_time = document.getElementById("login_time").value;

    var params = 'fullname='+fullname+'&address='+address+'&address2='+address2+'&city='+city+'&state='+state+'&telephone='+telephone+'&email='+email+'&vehicle_type='+vehicle_type+'&vehicleNo='+vehicleNo+'&visit_date='+visit_date+'&visit_date='+visit_date+'&visit_purpose='+visit_purpose+'&whom_tosee='+whom_tosee+'&login_time='+login_time+'';

    var txt = 'Please confirm the following Information\n FullName : '+fullname+'\n Address : '+address+'\n Address2 : '+address2+'\n City: '+city+'\n State: '+state+'\n Telephone: '+telephone+'\n Email: '+email+'\n Vehicle Type: '+vehicle_type+'\n Vehicle #: '+vehicleNo+'\n Visit Date: '+visit_date+'\n Visit Purpose : '+visit_purpose+'\n Who To see : '+whom_tosee+'\n Login Time : '+login_time+'';
    var response = confirm(txt);

    if(response ==true){
        xhr.open('GET', url+"?"+params, true);
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4 && xhr.status == 200) {
                alert('ok');
            }   
        }
        xhr.send(null);
    }

}

谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多