2014-03-12 6 views
0

방금 ​​설치 관리자 인 xampp-win32-1.8.3-2-VC11-installer를 사용하여 XAMPP를 다시 설치했습니다. 아래 문제는 여전히 존재합니다. 루틴을 저장하고 phpMyadmin SQL 콘솔에서 호출했습니다.왜이 mysql 루틴은 XAMPP의 phpmyadmin SQL 콘솔에서 항상 false를 반환합니까?

Environemnt : - : 만 레코드를 삽입하려고 5.6.14 다음과 같이 MySQL의 커뮤니티 서버 (GPL), 아파치/2.4.7 (Win32에서)에는 OpenSSL/1.0.1e의 PHP는/5.5.6

고장입니다 이전에 존재하지 않는 경우. 레코드가 삽입되면 해당 레코드가 반환되도록 요청하고 그렇지 않으면 false를 반환합니다. 아래의 다음 저장 프로 시저에서는 새 레코드가 삽입 되더라도 항상 잘못된 반환을 얻습니다. ELSE 문이 무시되는 것과 같습니다. 왜 이것이 발생하며 어떻게 수정할 수 있습니까?

DROP PROCEDURE IF EXISTS `session_initiation`// 

CREATE PROCEDURE `session_initiation`(
    IN _user_id  bigint(20), 
    IN _device_id bigint(20), 
    IN _token  varchar(255) 
) 
BEGIN 
    IF NOT EXISTS 
    (
     SELECT (1) from active_session where token = _token 
    ) 
    THEN 
     INSERT INTO active_session (user_id, device_id, token, datetime_create, datetime_expiry) VALUES (_user_id, _device_id, _token, NOW(), NOW() + INTERVAL 1 DAY); 
     SELECT * from active_session where token = _token; 
    ELSE 
     SELECT FALSE; 
    END IF; 
END// 

레코드가 존재하지 않을 경우 레코드가 삽입되고 동일한 레코드가 반환 될 것으로 예상됩니다. 대신 레코드가 삽입되고 다음이 반환됩니다.

FALSE 
_____ 
    0 

내 문제를 해결하는 데 도움이되는 사람을 잘 이해하십시오. 필자는 phpMyadmin SQL 콘솔의 SQL 탭에서 직접 실행하고 있습니다. 데모 에디션으로

call session_initiation(1,1,'abc123') //inserts and returns false = 0 
call session_initiation(1,1,'123abc') //inserts and returns false = 0 
call session_initiation(1,1,'abc123') //returns false = 0, does not reinsert the record. 

@wchiquito

에 의해 내가 제공하는 솔루션은 SQL Fiddle에서 올바른 : 여기

는 절차에 일부 호출합니다. 기본 필드를 포함하도록 약간의 수정을했는데 auto_incremented입니다.

DROP TABLE IF EXISTS `active_session`; 
CREATE TABLE IF NOT EXISTS `active_session` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `user_id` bigint(20) NOT NULL, 
    `device_id` bigint(20) NOT NULL, 
    `token` varchar(255) DEFAULT NULL, 
    `datetime_create` datetime DEFAULT NULL, 
    `datetime_expiry` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`session_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 
+0

MySQL 명령 줄에서 저장 프로 시저를 실행할 수 있습니까? 그 목적은 phpMyAdmin으로 문제를 배제하는 것입니다. – wchiquito

+0

xampp 컨트롤러에서 제공하는 쉘을 사용하여 실행했는데 쿼리가 올바른 결과를 생성합니다. phpmyadmin 쪽에서는 그렇지 않습니다. – mcv

+1

문제는 phpAdmin에 있고 저장 프로 시저에없는 것 같습니다. – wchiquito

답변

1

변경 :

... 
IF NOT EXISTS (SELECT (1) from active_session where token = _token) THEN 
... 

의 : 여기

테이블 세부 사항입니다

... 
IF (SELECT (1) from active_session where token = _token) IS NOT NULL THEN 
... 

UPDATE

테스트를 생성 한 후 SQL Fiddle 문제는 재현 할 수 없습니다. 코드가 예상대로 작동합니다. 저장 프로 시저가 문제가되지 않습니다.

+0

나는 여러 가지 방법으로 시도했지만 아무도 올바르게 작동하지 않는 것 같습니다. 필자는 phpMyAdmin을 업그레이드했고 이제는 저장 프로 시저를 실행할 때 출력이 표시되지 않습니다. 솔루션을 위해 phpMyAdmin SQL 콘솔에 의존하지 않으려 고합니다. get_country_list의 가장 간단한 프로 시저조차 올바르게 표시되지 않습니다. – mcv

+0

@ user2672744 : 답변이 업데이트되었습니다. – wchiquito

+0

감사합니다. 나는 다음 번에 SQL fiddle을 사용하는 것을 기억해야 할 것이다. – mcv

관련 문제