如何防止在SQL中插入现有数据

时间:2019-03-14 16:34:55

标签: php mysql sql

我一直在努力编写代码,以避免已经存在的数据插入,但是由于我必须使用系统的另一个重要功能,所以现在我想使用建议和答案将其编码回去时,我将其遗忘了。在此站点上,我感到压力很大,因为我的SQL语句太拥挤,导致致命错误,现在,我不得不问当我要避免重复名为发票的数据时应在SQL行中添加什么。这是我构造代码的方式:

if($_POST["controller"] == "add") {
    // validations here
    if(empty($_POST["main_date"])) {
        echo 'error'; die();
    }else{
        // upload file
        $uniquesavename = time().uniqid(rand());
        $extension = pathinfo($_FILES['fileToUpload']['name'], PATHINFO_EXTENSION);
        $target_dir = "../files/laboratory/receipt/";
        $uploadOk = 1;

        $target_file = $target_dir . $uniquesavename . '.' . $extension;

        // check filesize
        if ($_FILES["fileToUpload"]["size"] > 1000000) {
            $uploadOk = 0;
        }

        if ($uploadOk == 0) {
            echo 'error in upload attachment 1'; die();
        // if everything is ok, try to upload file
        } else {
            if (!move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
                // move file failed
                echo 'error in upload attachment 2'; die();
            }
        }
    }

    $result = $_POST["employee"];
    $result_explode=explode('|', $result);
    $result = query("INSERT INTO tbl_maintenance 
        (employee_id,
        carid,
        account_id,
        main_date,
        invoice,
        up_date,
        previous,
        present,
        particular,
        code,
        amount,
        attachment,
        dateAdded) 
        VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", 
        $result_explode[1],  
        $_POST["platenumber"], 
        $_POST["account_id"], 
        $_POST["main_date"], 
        $_POST["invoice"], 
        $_POST["up_date"], 
        $_POST["previous"], 
        $_POST["present"], 
        $_POST["particular"], 
        $_POST["code"], 
        $_POST["amount"], 
        $target_file,
        date("Y-m-d"));
    if($result === false) {
        echo 'mali imong code'; die();
    }
    else {
        $row = query("SELECT LAST_INSERT_ID() AS mId");
        $id = $row[0]["mId"];
        redirect("maintenance.php?profile=" . $id);
    }
}

2 个答案:

答案 0 :(得分:1)

我将更新表并向其中添加UNIQUE约束:

ALTER TABLE tbl_maintenance ADD CONSTRAINT invoice_unique UNIQUE (invoice);

当您尝试插入重复的数据时,MySQL将返回一个唯一的违反约束错误。您必须使用mysqli_error()PDO::errorInfo()或用于查询数据库的任何方法进行手动检查。 (提示:错误代码为1062。)


如果您希望更新重复的行而不是不执行任何操作,则可以使用ON DUPLICATE KEY UPDATE,例如:

INSERT INTO tbl_maintenance
(
    yourCols
)
VALUES
(
    yourValues
)
ON DUPLICATE KEY UPDATE
    col1 = val1,
    col2 = val2,
    ...

答案 1 :(得分:1)

您不一定需要大量的PHP。您唯一需要的是:

try {
    $result = query($yourLongQuery);
} catch (Exception $e) {
    if(mysqli_errno() === '1062') {
        echo "Duplicate data!";
    } else {
        echo "Something went wrong!";
    }        
}

要执行此操作,必须在表上定义UNIQUES。默认情况下,主数据库将始终是唯一的,但是您可以通过以下方式添加更多UNIQUE:

ALTER TABLE tableName ADD UNIQUE INDEX indexName (columnName);

如果您尝试插入一个副本,它将是错误代码1062。您可以发现这种情况并做出相应的反应。