2013-05-27 3 views
0

나는 이것을 여러 번 검토했으며 누군가 내가 누락 된 것을 밝힐 수있는 이유가 내 준비된 진술임을 밝힐 수없는 이유를 찾을 수 없다.sql 준비된 mysqli 문에서 IF 문

준비된 문을 초기화 한 후 $query에서 var_dump을 직접 수행하면 false를 반환합니다.

$query = $link->prepare("IF (EXISTS(SELECT * FROM banned WHERE ipAddr=? OR uid=?)) THEN UPDATE banned SET isBanned='1', ipAddr=?, uid=?, bannedAt=NOW(), reason=? WHERE ipAddr=? OR uid=? ELSE INSERT INTO banned (isBanned, ipAddr, uid, bannedAt, reason) VALUES('1', ?, ?, NOW(), ?) END IF"); 
$query->bind_param("sisissisis", $details['IP'], $details['uid'], $details['IP'], $details['uid'], $details['reason'], $details['IP'], $details['uid'], $details['IP'], $details['uid'], $details['reason']); 

테이블 구조는

banned 
------ 
id, uid, ipAddr, bannedAt, reason, isBanned 

참고 :이 후 같은 결과를 얻을 수있는 가장 좋은 방법이 아닌 경우 제안을 제공하시기 바랍니다

답변

1

IF 문이 MySQL의에서 준비된 명령문에서 지원되지 않습니다 : 여기에

는 문서입니다. 당신이

  1. INSERT INTO ... ON DUPLICATE KEY UPDATE 또는 REPLACE를 사용해보십시오 몇 가지 옵션이 이럴 지원 문의 전체 목록과 더 SQL Syntax for Prepared Statements

    를 참조하십시오. 올바른 UNIQUE 색인 (색인)이 있어야합니다. 그들이

    여기 banned 테이블에 정의 된

  2. 랩 당신은 저장 프로 시저가

    DELIMITER $$ 
    CREATE PROCEDURE sp_add_banned(IN aIP VARCHAR(15), IN aId INT, aReason VARCHAR(100)) 
    BEGIN 
        IF (EXISTS(SELECT * FROM banned WHERE ipAddr=aIP OR uid=aId)) THEN 
         UPDATE banned 
         SET isBanned='1', ipAddr=aIP, uid=aId, bannedAt=NOW(), reason=aReason 
         WHERE ipAddr=aIP OR uid=aId; 
        ELSE 
         INSERT INTO banned (isBanned, ipAddr, uid, bannedAt, reason) 
         VALUES('1', aIP, aId, NOW(), aReason); 
        END IF; 
    END$$ 
    DELIMITER ; 
    

    같이 IN 매개 변수에 대한 데이터 유형을 조정 보일 수있는 저장 프로 시저

에 코드 SQLFiddle 데모입니다.

그리고 당신의 PHP 부분은

$query = $link->prepare('CALL sp_add_banned(?, ?, ?)'); 
$query->bind_param('sis', $details['IP'], $details['uid'], $details['reason']); 
+0

많은 청소기 aswell 모양을 당신을 감사합니다 :) – Ciaran

1

MySQL의

IF가 존재

구문은 저장 프로 시저에서만 작동합니다.

유효성 검사 및 삽입 또는 업데이트를 위해 저장 프로 시저를 만든 다음 코드에서 호출 할 수 있습니다.

참고로

: mySql If Syntax

그리고 SELECT 쿼리에 대한 기능, 그것은 다른 구문이 'IF'당신이 사용하는 경우. 여기에 Link