Php 防止在数据库中重复插入

Php 防止在数据库中重复插入,php,mysql,phpmyadmin,Php,Mysql,Phpmyadmin,我正在将两个表中的一些数据插入到我的数据库中。插入工作正常,但是当我再次尝试插入时,如果单元格有值,新值将插入到它旁边。如果单元格中已经有值,我尝试使用if/else条件来阻止新的插入,但未能使其正常工作。也许这不是解决办法,或者我做错了。需要帮忙吗 if(isset($_POST['submit'])) { $degree = $_POST['Degree']; $major = $_POST['Major']; $univ = $_POST['Univ'];

我正在将两个表中的一些数据插入到我的数据库中。插入工作正常,但是当我再次尝试插入时,如果单元格有值,新值将插入到它旁边。如果单元格中已经有值,我尝试使用if/else条件来阻止新的插入,但未能使其正常工作。也许这不是解决办法,或者我做错了。需要帮忙吗

if(isset($_POST['submit'])) {   
    $degree = $_POST['Degree'];
    $major = $_POST['Major'];
    $univ = $_POST['Univ'];
    $brevet = $_POST['Brevet'];
    $baccbt = $_POST['Baccbt'];
    $selectaf = $_POST['SelectAF'];

    $sql1="SELECT certificatesgrading.brevet,
                  certificatesgrading.baccbt,
                  university.degree,
                  university.major,
                  university.univ
           FROM   university,
                  certificatesgrading
           WHERE  afnumber = '$selectaf'";

    if ($result=mysqli_query($con,$sql1)) {
        // Return the number of rows in result set
        $rowcount=mysqli_num_rows($result);
    }

    $sql="INSERT INTO university
            (afnumber,
             university.degree,
             university.major,
             university.univ)
          VALUES   ('$selectaf',
                    '$degree',
                    '$major',
                    '$univ')";

            $sql1="INSERT INTO certificatesgrading
            (afnumber,
             certificatesgrading.brevet,
             certificatesgrading.baccbt)
             VALUES     ('$selectaf',
                         '$brevet',
                         '$baccbt') ";
            $result = mysql_query($sql);
            $result = mysql_query($sql1);


}
echo $menu;
if(isset($\u POST['submit']))
{
$degree=$_POST['degree'];
$major=$_POST['major'];
$univ=$_POST['univ'];
$brevet=$_POST['brevet'];
$baccbt=$_POST['baccbt'];
$selectaf=$_POST['selectaf'];
$sql=“SELECT*来自大学,证书等级,其中AFNumber='$selectaf';
$result=mysql\u查询($sql);
$count=计数($result);
如果($count==0)
{
$sql1=“插入大学(AFNumber,university.Degree,university.Major,university.Univ)值('$selectaf'、'$Degree'、'$Major'、'$Univ')”;
$sql2=“插入certificatesgrading(AFNumber、certificatesgrading.brevet、certificatesgrading.baccbt)值(“$selectaf”、“$brevet”、“$baccbt”)”;
$result1=mysql\u查询($sql1);
$result2=mysql\u查询($sql2);
if(isset($result1)和isset($result2))
{
echo'swal(“成功”,“更改已保存”,“成功”);
重定向(base_url().'controller/method');//刷新头
}
其他的
{
回声“出了问题”;
}
}
}
注意:要使用
swal/sweetalert
您需要安装它 检查
$\u POST['degree']
变量以大写或简单开头,在表单
名称
字段中


首先,构建查询的方式非常危险。您从外部源获取原始输入,不进行任何数据验证或转义,而是直接在查询字符串中使用它。SQL注入攻击就是这样发生的

在使用mysqli时,您确实需要考虑重新实现要使用的数据库访问逻辑,或者至少开始使用它,使代码更能抵抗SQL注入滥用

至于您的特定问题,我将假设某些列或列的组合必须是唯一的,而其他列则不必是唯一的。对于确实需要唯一的列/组合,可以创建指示其值不能重复的索引。例如,我将假设AFnumber字段是大学的某种标识码,它在universions表中必须是唯一的。如果是这样的话,那么您可以指定该字段必须是唯一的

CREATE UNIQUE INDEX keep_af_number_unique 
  ON university (AFnumber);
有了此约束,则只能插入一次特定的AFnumber。再次尝试插入相同的值将触发错误(您必须在代码中检查并捕获错误!),直到您删除现有的AFnumber或更改其值

如果有一组列,其中包含的值的组合需要唯一,则可以跨多个列创建唯一索引

CREATE UNIQUE INDEX multi_col_unique
  ON table_name (column1, column2, column3);
对于这三个列,一个单独的列可以多次保存相同的值,但是组合在一起的列必须是唯一的。例如,允许使用以下数据:

col1 | col2 | col3
===================
   1 |    1 |    1
   2 |    2 |    2
   1 |    1 |    2
但是,如果您试图添加另一个值为
1,1,1
的行,则会发生错误

除此之外,在代码中实现一个系统来检测和防止多个表单提交也是一个好主意,也许可以使用PHP会话中存储的令牌。有一些可能有用的解决方案

如果您想涵盖所有可能的情况,尤其是如果您想处理表之间的关系,那么这种行为很难自行开发

我认为你应该考虑使用ORM,比如。这样,您就可以修复ORM将为您处理和检查的数据模型。同时考虑使用它与PHP框架类似SyphyY2。您不必实现完整的堆栈,根据您的需要,使用一些组件就足够了

以下是注释和工作原理给出的示例:

<?php
/**
 * @Entity
 * @Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})})
 */
class ECommerceProduct
{
}

这样做有用吗?如果是这样,为什么不直接使用它呢!我想不出一个“更好”的方法。在
大学
之间应该有一个
连接条件
证书评分
在第一个查询中,
在哪里
连接。。。在
上,很好。@RyanVincent抱歉,我没有完全理解你的意思。。在哪里申请加入?@RyanVincent仍然是相同的请用新代码更新您的问题。您仍然需要使用使用
$rowcount
结果决定是否插入新行的测试来包装插入。正如答案中已经提到的,这不会防止重复-请参阅@GordonM comments。您可以使用
事务来帮助解决该问题。此代码不会阻止多行,因为它不允许两个进程同时尝试插入相同的数据,如果数据库中有多行具有相同的值,则计数检查也将失败@戈登亚<代码>如果($count==1)
应该出现
如果($count==0)
<?php
/**
 * @Entity
 * @Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})})
 */
class ECommerceProduct
{
}