Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 防止存储过程中的表中出现多个条目的问题_Php_Mysql_Stored Procedures - Fatal编程技术网

Php 防止存储过程中的表中出现多个条目的问题

Php 防止存储过程中的表中出现多个条目的问题,php,mysql,stored-procedures,Php,Mysql,Stored Procedures,我调用了一个存储过程,用于使用PHP页面向数据库中插入一些细节。仅当表中没有类似的数据输入时,才应输入数据。我试图通过一起发出100个请求(使用测试工具)来测试它。但执行后,同一行出现4次 以下是我正在使用的存储过程: DELIMITER $$ USE `mydb`$$ DROP PROCEDURE IF EXISTS `AddCreditCard`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `AddCreditCard`(IN scard

我调用了一个存储过程,用于使用PHP页面向数据库中插入一些细节。仅当表中没有类似的数据输入时,才应输入数据。我试图通过一起发出100个请求(使用测试工具)来测试它。但执行后,同一行出现4次

以下是我正在使用的存储过程:

DELIMITER $$

USE `mydb`$$

DROP PROCEDURE IF EXISTS `AddCreditCard`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `AddCreditCard`(IN scardname VARCHAR(200),scardnumber VARCHAR(200),scardedate VARCHAR(200),scardcvv VARCHAR(200),scountry VARCHAR(200),sdeviceid TEXT,scard_type VARCHAR(200),OUT rflag INT)
BEGIN
    DECLARE user_id INT DEFAULT -1;
    DECLARE card_count INT DEFAULT -1;
    START TRANSACTION;
    SET rflag=0;
    SELECT udd_user_id_fk INTO user_id FROM user_device_details WHERE udd_device_id=sdeviceid;
    IF user_id<>0 THEN
        SELECT COUNT(uccd_entry_id) INTO card_count FROM user_credit_card_details WHERE uccd_card_number=scardnumber AND uccd_user_id_fk=user_id;
        IF card_count=0 THEN

            INSERT INTO user_credit_card_details(uccd_user_id_fk,uccd_card_name,uccd_card_number,uccd_card_expiry_date,uccd_card_cvv,uccd_country,uccd_card_type)VALUES(user_id,scardname,scardnumber,scardedate,scardcvv,scountry,scard_type);
            SET rflag=1;
        ELSE
            SET rflag=414;
        END IF;
    ELSE
        SET rflag=0;
    END IF;
    COMMIT; 
 END$$

DELIMITER ;
分隔符$$
使用“mydb”`$$
删除程序(如果存在)`AddCreditCard`$$
CREATE DEFINER=`root`@`localhost`PROCEDURE`AddCreditCard`(在scardname VARCHAR(200)、scardnumber VARCHAR(200)、scardedate VARCHAR(200)、scardcv VARCHAR(200)、scontry VARCHAR(200)、sdeviceid TEXT、scard_type VARCHAR(200)、OUT rflag INT中)
开始
声明user_id INT DEFAULT-1;
声明卡片计数INT默认值为-1;
启动交易;
设置rflag=0;
从用户设备详细信息中选择udd_用户id_fk进入用户id,其中udd_设备id=sdeviceid;
如果用户ID为0,则
从用户信用卡详细信息中选择计数(uccd\u条目\u id),其中uccd\u卡号=scardnumber,uccd\u用户id\u fk=用户id;
如果卡片计数=0,则
在用户信用卡详细信息(uccd_用户id_fk、uccd_卡名称、uccd_卡编号、uccd_卡到期日、uccd_卡cvv、uccd_国家、uccd_卡类型)中插入值(用户id、scardname、scardnumber、SCARDATE、scardcvv、SCONTRY、scard_类型);
设置rflag=1;
其他的
设置rflag=414;
如果结束;
其他的
设置rflag=0;
如果结束;
犯罪
结束$$
定界符;

我期望的结果是,首先它应该返回'1',对于之后的所有请求,它应该返回'414'。请向我建议此问题的解决方案。

如果在
If
之后和
然后
之前有多行,则需要将它们包含在
开始…结束
块中。

是否绝对有必要使用存储过程来实现此目的?在我看来,使用唯一的索引(uccd_卡号、uccd_用户id)和外键约束来确保用户行的存在可以很容易地解决这个问题。