php - 防止重复插入数据库

标签 php mysql phpmyadmin

我正在将一些数据插入到我的数据库中,这些数据位于两个表中。插入工作正常,但是当我再次尝试插入时,如果单元格有值,新值将插入到它旁边。如果单元格中已经有一个值,我尝试了一个 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;

最佳答案

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

enter image description here

当您使用 mysqli 时,您确实需要考虑重新实现您的数据库访问逻辑以使用 prepared statements ,或者至少开始使用 mysqli_real_escape_string()使您的代码更能抵抗 SQL 注入(inject)滥用。

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

CREATE UNIQUE INDEX keep_af_number_unique 
  ON university (AFnumber);

有了这个约束,您就只能插入一个特定的 AF 编号一次。尝试再次插入相同的值将触发错误(您必须检查并在代码中捕获!),直到您删除现有的 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 session 中的 token 。 This question有一些可能有用的解决方案。

关于php - 防止重复插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31472753/

相关文章:

mysql - 包含 group_concat、GROUP BY 和空值的每月值

php - 显示 WordPress 中某个类别中当前日期的生日

php - 如何使用phpmyadmin在数据库中插入图像?

php - 是什么原因导致XML解析错误: no root element found error?

php - 突出显示表中选定的行(表是由 PHP 从 MySQL 数据库生成的)

php - 文件时间的 Cron 作业错误

phpmyadmin 安装和登录令人头痛

PHP ZMQ 不能在 Windows 上运行,但可以在 Linux 上运行吗?

php - MySQL/PHP foreach 仍然只在数据库中显示第一个

mysql - ubuntu21.10中无法执行apache2重启命令