2014-08-27 96 views
2

環境:阿帕奇/ 2.4.7(Win32的)的OpenSSL/1.0.1e PHP/5.5.6 服務器版本:5.6.14 - MySQL社區服務器(GPL) phpMyAdmin的:4.0.9爲什麼變量_count總是返回-1?

下面的程序返回即使在_count> 0時也總是-1,並且數據的更新完成。

DELIMITER // 

DROP PROCEDURE IF EXISTS `forgotten_password_update`// 

CREATE PROCEDURE `forgotten_password_update`(
IN _password longtext, 
IN _salt varchar(255), 
IN _parameter varchar(255), 
IN _id bigint(20) 
) 
BEGIN 
    DECLARE _count tinyint(1); 
    SELECT COUNT(*) into _count FROM forgot_password_reset WHERE parameter = _parameter AND user_id = _id AND is_reset = FALSE AND NOW() <= datetime_expiry; 
    IF _count > 0 THEN 
     UPDATE forgot_password_reset SET is_reset = TRUE, datetime_reset = NOW() WHERE _parameter = _parameter AND id = _id AND is_reset = FALSE; 
     UPDATE login SET password = _password, salt = _salt WHERE id = _id; 
    ELSE 
     SET _count = -1; 
    END IF; 
    SELECT _count as num_of_updated_records; 
END// 


DELIMITER END; 

我已經在phpMyAdmin中使用MySQL控制檯運行這個。如果_count> 0更新已成功完成並且_count返回-1。

如果_count < 0,更新不運行,並且_count返回-1。

我很困惑,爲什麼_count被設置爲-1?

CALL `forgotten_password_update`('PASSWORD_ONE','SALT1', 'test2', 2); 
CALL `forgotten_password_update`('Test1234','SALT2', 'test2', 2); 

下面是建立腳本來創建上述forgot_password_reset和登錄的表:

DROP TABLE IF EXISTS `login`; 
CREATE TABLE IF NOT EXISTS `login` (
    `login_id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `password` longtext, 
    `salt` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`login_id`), 
) 


DROP TABLE IF EXISTS `forgot_password_reset`; 
CREATE TABLE IF NOT EXISTS `forgot_password_reset` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `user_id` bigint(20) NOT NULL, 
    `parameter` varchar(255) NOT NULL, 
    `is_reset` boolean default false, 
    `datetime_reset` datetime default NULL, 
    `datetime_expiry` datetime default NULL, 
    PRIMARY KEY (`id`), 
    CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES login(`id`) 
) 

編輯:數據插入:

INSERT INTO `login` (login_id, password, salt) VALUES (2, 'temp_password', '0000'); 
INSERT INTO `forgot_password_reset` (user_id, parameter, datetime_expiry) VALUES (2, 'test2', NOW() + INTERVAL 1 DAY); 
+0

你能否提供一些樣本數據?我無法重現這個問題。另外請注意,當您提供名爲'forgotten_password_update'的過程的定義時,您的代碼片段會調用過程'forgotten_password_url_update'。你在測試正確的程序嗎? – RandomSeed 2014-08-27 15:21:06

+0

將在代碼插入後立即更新。忘記刪除其他_url! – mcv 2014-08-27 15:29:18

+0

已完成。請參閱最後一部分的數據插入。 – mcv 2014-08-27 15:41:25

回答

0

我此使用mysql命令測試行和問題是與phpMyAdmin控制檯。因爲答案在命令行窗口中正確返回,所以我正在關閉它。