为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法在插入记录时找出mysql中的重复值?

有没有办法在插入记录时找出mysql中的重复值?

PHP
慕桂英3389331 2022-06-17 10:49:39
我读了很多问题,但我没有找到我的问题的解决方案。我的顾虑:我正在使用 PHP 中的 foreach 循环在 My SQL 中插入新记录。因此,在插入之前有什么方法可以找出我在我的 sql 中插入的记录是否已经存在。如果它存在,那么它应该返回“ALREADY EXIST”。根据我的代码:当我使用 FOR-EACH LOOP 时,我想要哪个qstonesid已经存在于我的 sql tbl_stickering中。如果存在,那么它应该返回 ECHO “ $qstonesid 已经存在”,如果$qstonesid不存在,那么调用我的 STORED PROCEDURE sp_stickering。我希望我把我的担忧说清楚了,我对 PHP 和 mySql 完全陌生,任何帮助将不胜感激,下面,我分享我的PHP代码<?phperror_reporting(E_ERROR | E_PARSE);include "config.php";$stones = $_POST['stones'];//echo json_encode($stones, true);$StoneArr = json_decode($stones, true);$updstmt = '';  foreach ($StoneArr as $Stone)  {    $currentdate=!empty( $Stone['currentdate'] ) ? $Stone['currentdate'] : '0000-00-00 00:00:00';    $qstonesid=$Stone['qstonesid'];    $clientname = $_REQUEST['clientname'];    $empid = $_REQUEST['empid'];     $updstmt .= 'CALL sp_stickering('.'"'.$currentdate.'"'.',                                          '.'"'.$clientname.'"'.',                                          '.'"'.$qstonesid.'"'.',                                          '.'"'.$empid.'"'.'                                        );';  }    //echo $updstmt;       $res = query($updstmt);       if (strlen($res) > 0) {           echo $res;        } else {            echo 'Records added successfully...';            }下面是我正在使用的存储过程,CREATE DEFINER=`root`@`%` PROCEDURE `sp_stickering`( IN `_sdate_stickering` DATETIME, IN `_client_name` VARCHAR(100), IN `_qstonesid` VARCHAR(100), IN `_empid` INT)BEGINIF EXISTS (SELECT qstonesid FROM tbl_stickering WHERE qstonesid = _qstonesid AND client_name = _client_name) THENBEGIN    UPDATE tbl_stickering SET empid = _empid WHERE qstonesid = _qstonesid AND client_name = _client_name;END;ELSEBEGIN    INSERT INTO tbl_stickering    (sdate_stickering, client_name, qstonesid, empid)    VALUES    (_sdate_stickering, _client_name, _qstonesid, _empid);END;END IF;END
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

一种方法是qstonesid从数组中检索列表并在调用过程之前检查数据库。


要从您那里获取qstonesid值列表,$StoneArr可以使用array_column.


$ids = array_column($StoneArr, 'qstonesid');

接下来检索$ids数据库中存在的列表并构建另一个列表。


我不确定您使用的是什么数据库扩展,但我认为是这样的。请参阅下面的工作示例链接,以获取PDO带有准备好的语句的演示。


$rs = query('SELECT qstonesid FROM tbl_stickering WHERE qstonesid IN(' . implode(',', $ids) . ')');

$exists = array_column($rs, 'qstonesid');

ifqstonesid是一个字符串值数组,您可以使用引号将每个值括起来。


'"' . implode('","', $ids) . ') . '"';

最后,在您的foreach循环in_array中,用于检查结果$exists数组是否存在,如果是,则$Stone['qstonesid']用于continue继续进行下一次迭代。


工作示例:https ://3v4l.org/eJXu5

foreach ($StoneArr as $Stone) {

    if (in_array($Stone['qstonesid'], $exists)) {

        echo $Stone['qstonesid'] . ' Already Exists.';

        continue;

    }


    //...

}

完整示例:

  $stones = $_POST['stones'];

  $StoneArr = json_decode($stones, true);


  //retrieve listing of submitted qstonesid values

  $StoneArrIds = array_column($StoneArr, 'qstonesid');


  //retrieve listing of existing qstonesid

  /**

   * modify to suit your database extension

   * !! Subject to SQL Injection !!

   * !! HIGHLY RECOMMEND USING PREPARED STATEMENTS !!

   */

  $rs = query('SELECT qstonesid 

FROM tbl_stickering 

WHERE client_name = "' . $_REQUEST['clientname'] . '" 

AND qstonesid IN("' . implode('","', $StoneArrIds) . '")');

  $exists = array_column($rs, 'qstonesid');


  $updstmt = '';

  foreach ($StoneArr as $Stone) {

    //qstonesid already exists, display a message and skip insertion

    if (in_array($Stone['qstonesid'], $exists)) {

        echo $Stone['qstonesid'] . ' already exist';

        continue;

    }


    $currentdate= !empty($Stone['currentdate'] ) ? $Stone['currentdate'] : '0000-00-00 00:00:00';

    $qstonesid = $Stone['qstonesid'];

    $clientname = $_REQUEST['clientname'];

    $empid = $_REQUEST['empid'];

    $updstmt .= 'CALL sp_stickering('.'"'.$currentdate.'"'.',

                                          '.'"'.$clientname.'"'.',

                                          '.'"'.$qstonesid.'"'.',

                                          '.'"'.$empid.'"'.'

    );';

  }


  if ($updstmt) {

      $res = query($updstmt);

      if (strlen($res) > 0) {

          echo $res;

      } else {

          echo 'Records added successfully...';

      }

  }


查看完整回答
反对 回复 2022-06-17
  • 1 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信