【问题标题】:Check other duplicate entry (ies) upon edit but disregard a duplicate in current form在编辑时检查其他重复条目,但忽略当前表单中的重复项
【发布时间】:2020-01-04 03:29:38
【问题描述】:

我是 PDO 的新手,在编辑表单时我正在努力检查数据库中的重复项。

目前的情况是:

  • 输入字段是电话号码
  • 插入时会检查它是否已存在于数据库中
  • 在编辑时会再次检查编辑是否在 分贝
  • 我不能只禁止修改电话号码
    添加是因为如果将来需要更改怎么办
  • 在用户点击编辑按钮后,所有数据都被获取并被 回显到其各自的字段,因此用户将知道该字段 已有此类信息或该字段仍为空

当用户只是在编辑其他字段(例如“PIN 更改更新”)时,会出现问题,再次检查电话号码字段,显然它会返回“它已经存在”的错误。

如果没有更改,我如何忽略该字段条目?

这是 edit.php

的部分代码
if(isset($_POST['Edith_SIM'])) {
$id = $_POST['id'];
$s_num = $_POST['sim_num'];
$s_net = $_POST['sim_net'];
$s_pn1 = $_POST['simpn1'];
$s_pn2 = $_POST['simpn2'];
$s_pk1 = $_POST['simpk1'];
$s_pk2 = $_POST['simpk2'];
$s_fea = $_POST['sim_feat'];
$s_typ = $_POST['sim_type'];
$s_acq = $_POST['d_acq'];
$s_afo = $_POST['acq_for'];
$s_ufr = $_POST['d_uf'];
$s_uto = $_POST['d_ut'];
$s_dev = $_POST['use_dev'];
$s_sta = $_POST['sim_stat'];
$s_not = $_POST['sim_notes'];

$chekDuplicate = $dbConn->prepare('SELECT * FROM tst_sims WHERE SIM_num= :sim_num');
    $chekDuplicate->execute(array(':sim_num' => $s_num));

// checking empty fields
if(empty($s_num)) {                
    echo "<font color='red'>Must have SIM number my dudes</font><br/>";
    echo "<br/><a href='javascript:self.history.back();'>Go Back</a>";
} elseif($chekDuplicate->rowCount() > 0) {
    echo "<font color='red'>Its existing my dudes</font><br/>";
    echo "<br/><a href='javascript:self.history.back();'>Go Back</a>";
} else { 
    $sim_passed_e = "UPDATE tst_sims SET 
    SIM_num = :sim_num,
    SIM_network =:sim_net,
    SIM_PIN1 =:simpn1,
    SIM_PIN2 =:simpn2,
    SIM_PUK1 =:simpk1,
    SIM_PUK2 =:simpk2,
    SIM_features =:sim_feat,
    SIM_type =:sim_type,
    Acquired =:d_acq,
    Acquired_for =:acq_for,
    Used_from =:d_uf,
    Used_to =:d_ut,
    Used_devices =:use_dev,
    Status =:sim_stat,
    Notes =:sim_notes
    WHERE Ent_id =:id";

$que_edit = $dbConn->prepare($sim_passed_e); 

            $que_edit->bindparam(':id', $id);
            $que_edit->bindparam(':sim_num', $s_num);
            $que_edit->bindparam(':sim_net', $s_net);
            $que_edit->bindparam(':simpn1', $s_pn1);
            $que_edit->bindparam(':simpn2', $s_pn2);
            $que_edit->bindparam(':simpk1', $s_pk1);
            $que_edit->bindparam(':simpk2', $s_pk2);
            $que_edit->bindparam(':sim_feat', $s_fea);
            $que_edit->bindparam(':sim_type', $s_typ);
            $que_edit->bindparam(':d_acq', $s_acq);
            $que_edit->bindparam(':acq_for', $s_afo);
            $que_edit->bindparam(':d_uf', $s_ufr);
            $que_edit->bindparam(':d_ut', $s_uto);
            $que_edit->bindparam(':use_dev', $s_dev);
            $que_edit->bindparam(':sim_stat', $s_sta);
            $que_edit->bindparam(':sim_notes', $s_not);
            $que_edit->execute();

    header("location: index.php");
    echo "<font color='green'>Data added successfully my dudes.";
    echo "<br/><a href='index.php'>View Result</a>";
}
}

我希望这不会让你们所有人感到困惑,我不知道我应该采取什么样的方法。

【问题讨论】:

  • 仅发送到服务器 id 和更改的字段。

标签: php if-statement pdo duplicates


【解决方案1】:

在重复检查中排除当前 ID。

$chekDuplicate = $dbConn->prepare("SELECT * FROM tst_sims WHERE SIM_num= :sim_num, id != :id");
$chekDuplicate->execute([':sim_num' => $s_num, ':id' => $id]);

sim 号码是否更改无关紧要,只是这个 sim 号码不应该被任何其他用户使用,除了正在更新此记录的当前用户,我们很好。

【讨论】:

  • @ailia,如果这对你有用,请接受并投票给答案。 :)
  • 抱歉延迟回复...我收到一个错误 Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以了解在 ' id != '#idnumber' 附近使用的正确语法,如果我这样做了 - SIM_num= :sim_num AND id != :id" ,它会像不检查一样继续全部。
  • 无论如何,我暂时没有让自己陷入这个(我继续)到开发的其他阶段,我正在重新考虑 - 我为 SIM 号码制作一个单独的表格怎么样。就像 JS 类型的编辑页面的样式,您一次在输入字段上进行编辑,当您的光标离开该字段的焦点时,它会认为它已到达顶峰而无需重新加载页面。
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2014-04-25
  • 2014-07-02
  • 2013-10-31
相关资源
最近更新 更多