2014-09-13 2 views
1

다음 PHP 코드에서 트리거를 만들고 싶습니다.PHP 코드에서 트리거를 만들 때 구문 오류가 발생했습니다.

$sql = 'delimiter $$'; 
    $pdo->exec($sql); 
    $sql = 'create trigger avoid_empty_employee_insert before insert on `employee` 
      for each row begin 
      if name = "" then set name = null; end if; 
      end$$'; 
    $pdo->exec($sql); 
    $sql = 'delimiter ;'; 
    $pdo->exec($sql); 

MySQL에서 코드를 실행하면 트리거가 만들어집니다.

PHP는 다음과 같은 오류를 표시합니다.

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'delimiter $$' at line 1

어떻게 해결할 수 있습니까?

$sql = 'create trigger avoid_empty_employee_insert before insert on `employee` 
     for each row begin 
     if name = "" then set name = null; end if; END;'; 
    $pdo->exec($sql); 

답변

5

은 확실히 당신이 API를 통해 문을 실행하고있는 구분 기호를 변경하려고하지 않습니다. DELIMITERmysql client built-in command이며, MySQL 서버 측 파서에서는 인식되지 않습니다.

어쨌든 필요하지 않습니다. DELIMITER의 목적은 트리거 또는 저장 루틴의 본문에 나타날 수있는 세미콜론의 모호성을 제거하는 것입니다. API는 한 번에 하나의 명령문을 실행하기위한 것이기 때문에 애매 모호하지 않습니다. SQL 구문 분석기는 전체 문자열을 하나의 명령문으로 처리합니다.

마찬가지로, 작성 트리거 문은 $$으로 끝내지 마십시오. 문 종료자를 사용할 필요는 없지만 SQL 구문 분석기는 많은 사람들이 필요하지 않더라도 거기에 넣어주기 때문에 선택 문 종료 자로 ;을 사용할 수 있습니다. 당신이 열을 접두사하지 않는 경우에만 NEW.를 사용하여 삽입 트리거에 -

다음 문제는 당신이 트리거에 열 이름을 사용할 때, 당신은 NEW. 또는 OLD. 중 하나로 접두사해야 MySQL은 사용자가 tmpdir 또는 slow_query_log과 같은 시스템 변수를 설정한다고 가정합니다.

여전히 1193 오류가 발생하는 경우 name 열에 대한 참조를 모두 NEW.name으로 변경하는 것이 좋습니다.

PHP 5.4.24 및 MySQL 5.6을 사용하여 다음을 테스트했습니다.(20), 그리고 일 :

$sql = "create trigger avoid_empty_employee_insert before insert on `employee` 
     for each row begin 
      if NEW.name = '' then set NEW.name = null; end if; 
     end"; 
$pdo->exec($sql); 

이 있기 때문에 당신은 name의 열 이름을 구분하지 않아도은 MySQL이 단어를 예약하지. The set of reserved words is documented.

0

는 것을보십시오. DELIMITER 변경은 CLI에서 중요합니다.

PHP 코드에서 해당 행을 변경하는 것을 무시하십시오.

귀하의 코드는된다 :

$sql = 'create trigger `avoid_empty_employee_insert` before insert 
     on `employee` 
     for each row 
     begin 
      if `name` = "" then set `name` = null; end if; 
     end'; 
$pdo->exec($sql); 
+0

'SQLSTATE [HY000] : 일반 오류 : 1193 알 수없는 시스템 변수의 이름 '' – xralf

+0

당신이 당신의 직원 테이블에 이름을했다? –

+0

예 "name varchar (255) not null"... btw. 이 코드는 MySQL에서 작동합니다. – xralf

0

당신이 코드를 사용하여 트리거를 생성하기 때문에, 당신은 DELIMITER를 설정/리셋 할 필요가 있습니다

+0

만 'SQLSTATE [HY000] : 일반 오류 : 1193 알 수없는 시스템 변수'이름 '' – xralf

0

당신이 코드를 사용하여 트리거를 생성하기 때문에, 당신은 DELIMITER를 설정/리셋 할 필요가 있습니다.

PHP 코드에서 해당 행을 변경하는 것을 무시하십시오.

귀하의 코드는된다 :

$sql = 'create trigger avoid_empty_employee_insert before insert on `employee` 
      for each row begin 
      if NEW.`name` = "" then set NEW.`name` = null; end if; 
      end$$'; 
$pdo->exec($sql); 
+0

'SQLSTATE [HY000] : 일반 오류 : 1193 알 수없는 시스템 변수'이름 '' – xralf

+0

편집하십시오. – Peter

+0

무엇이 변경 되었습니까? – xralf

0

는 Mayby이 도움이 :

$sql = "delimiter //\n"; 
$pdo->exec($sql); 
$sql = "create trigger avoid_empty_employee_insert before insert on employee\n 
     for each row\n 
     begin\n 
     if new.name = '' then\n 
     set new.name = null;\n 
     end if;\n 
     end//\n"; 
$pdo->exec($sql); 
$sql = 'delimiter ;'; 
$pdo->exec($sql); 
관련 문제