SQL查询两次在数据库中插入数据

时间:2019-03-05 20:56:30

标签: php mysql mysqli

当重复行开始存储在数据库中时,我正在使用php和mysql更新数据库字段。 在服务器上的localhost上都不起作用 这是代码:

<?php
$con = mysqli_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysqli_error($con));
  }
mysqli_select_db($con,"excel");
$sql="INSERT INTO mark (date, time_stamp, agency, a_name, first_name, last_name, address, city, zip, phone, auto, ins_det)
VALUES ('$_POST[date]','$_POST[time]','$_POST[agency]','$_POST[a_name]','$_POST[f_name]','$_POST[l_name]','$_POST[add]','$_POST[city]','$_POST[zip]','$_POST[phone]','$_POST[auto]','$_POST[ins_det]')";

$res = mysqli_query($con,$sql);
if (!$res)
  {
  die('Error: ' . mysqli_error($con));
  }
    else
    {
        echo "1 record added";
    }
mysqli_close($con);
?>

这是Webform的代码,提交后会重定向到上面的代码

<html>
    <head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
    <h2 align='center'>Mark Noffsinger</h2>
    </head>
<body>
    <div class="outer-container">
        <div class="col-sm-4"><form action="show_data.php">
            <input type="submit" class="btn btn-default" value="Show this month's leads"/></form>
            </div>
        <form action="form_data.php" method="post" class="form-horizontal">

            <div class="col-sm-8" "form-group">
                <label>Date:</label><br>
                <input type="date" class="form-control" id="date" name="date"/>
                <label>Time:</label><br>
                <input type="time" class="form-control" id="time" name="time"/>
                <label>Agency:</label><br>
                <input type="text" class="form-control" id="agency" name="agency"/>
                <label>Agent's Name:</label><br>
                <input type="text" class="form-control" id="a_name" name="a_name"/>
                <label>First Name:</label><br>
                <input type="text" class="form-control" id="f_name" name="f_name"/>
                <label>Last Name:</label><br>
                <input type="text" class="form-control" id="l_name" name="l_name"/>
                <label>Address:</label><br>
                <input type="text" class="form-control" id="add" name="add"/>
                <label>City:</label><br>
                <input type="text" class="form-control" id="city" name="city"/>
                <label>Zip:</label><br>
                <input type="number" class="form-control" id="zip" name="zip"/>
                <label>Phone:</label><br>
                <input type="number" class="form-control" id="phone" name="phone"/>
                <label>Auto:</label><br>
                <input type="number" class="form-control" id="auto" name="auto"/>
                <label>Insurance Details:</label><br>
                <input type="text" class="form-control" id="ins_det" name="ins_det"/><br>
                <input type="Submit" value="Submit" class="btn btn-default" />
            </div>  
        </form>
    </div>
    </body>
</html>

edit:电话号码在这里用作主键,每次我使用缓存的信息插入我认为是的数据,尝试清除缓存,使用差异浏览器时,但每次我提交表格时都使用最后一行的电话号码已更新,并给出了复制潜在客户的错误

2 个答案:

答案 0 :(得分:0)

就像其他Stackoverflow工程师所说的那样,如果您打算在生产中使用它,那么您的代码就是安全灾难。

我只选择三个表单参数**(名字,姓氏,地址)**以重新创建您的代码,同时确保sql注入 攻击是不可能的。您可以按照我的方法添加其他表单参数。

在测试之前,请确保所有数据库凭据都可以

<?php
$con=mysqli_connect("localhost","root","my_password","yourdb goes");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// escape variables Against sql injections
$firstname = mysqli_real_escape_string($con, $_POST['f_name']);
$lastname = mysqli_real_escape_string($con, $_POST['l_name']);
$address = mysqli_real_escape_string($con, $_POST['add']);

$sql="INSERT INTO mark (first_name, last_name, address)
VALUES ('$firstname', '$lastname', '$address')";

if (!mysqli_query($con,$sql)) {
  die('Error: ' . mysqli_error($con));
}
echo "1 record added";

mysqli_close($con);
?> 

答案 1 :(得分:0)

当您使用INSERT时,很可能(试图)INSERT出现新行...

正确的动词应为REPLACE INTO,即UPDATEINSERT INTO。这将保存一个先前的SELECT语句,该语句必须确定必须使用UPDATE还是INSERT INTO;因为您要尝试做的是两次添加一个UNIQUE密钥,这完全是非法的。

phone用作PRIMARY KEY可能会导致问题。宁愿建议改用AUTOINCREMENT contact_id列...只是因为存在多种格式设置电话号码的方法-这是用户输入-进一步检查输入$_POST建议使用isset()!empty();此处的其他客户端数据验证无关紧要。我还发现表名mark很奇怪,可能应该将其标准化为列agent_id

请参阅prepared statements的文档,该文档非常有用。