2017-02-17 6 views
1

PHP와 MySQL로 웹 포트폴리오를 만들면 포럼이나 블로그를 만들었습니다. 나는 PHP에 꽤 괜찮은 편이지만 MySQL은 항상 나를 위해 문제가되어왔다. 왜냐하면 내가 전에 MySQL이나 다른 데이터베이스를 사용할 이유가 없기 때문이다. MySQL 오류 메시지는 내가 본 오류가 최악이다. 이것은 포럼/블로그에 새로운 글을 추가 할 때 사용하려고하는 쿼리입니다.MySQL에서 Declare 사용하기

START TRANSACTION; 

DECLARE postKey int; 

INSERT INTO posts(post_subject, post_content, post_date, post_by) 
SELECT ?, ?, NOW(), user_id FROM users WHERE user_name = ? LIMIT 1; 

SET postKey = LAST_INSERT_ID(); 

INSERT INTO juct_tags_posts(post_key, tag_key) 
SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1; 
INSERT INTO juct_tags_posts(post_key, tag_key) 
SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1; 
INSERT INTO juct_tags_posts(post_key, tag_key) 
SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1; 

COMMIT; 

첫 번째 삽입은 post_data입니다. 다음 세 개의 삽입은 tag_id와 post_id의 접합 테이블에 대한 것입니다. 문제는 이것입니다. Prepare failed: (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 'DECLARE postKey int;INSERT INTO posts(post_subject, post_content, post_date, pos' at line 1 나는이 문제의 원인을 잘 모른다. 또한, 쿼리가 준비되어있을 때 도움이된다면 다음과 같은 문자열로 설정하십시오.

START TRANSACTION;DECLARE postKey int;INSERT INTO posts(post_subject, post_content, post_date, post_by) SELECT ?, ?, NOW(), user_id FROM users WHERE user_name = ? LIMIT 1;SET postKey = LAST_INSERT_ID();INSERT INTO juct_tags_posts(post_key, tag_key) SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1;INSERT INTO juct_tags_posts(post_key, tag_key) SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1;INSERT INTO juct_tags_posts(post_key, tag_key) SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1;COMMIT; 
+0

이 Q & A를 참조하십시오. http://stackoverflow.com/q/9974325/1415724 및 관련 링크는 mysql.com 웹 사이트 https://dev.mysql.com/doc/refman/5.7/en/commit.html에서 확인할 수 있습니다. - https://dev.mysql.com/doc/refman/5.7/en/declare-handler.html –

+0

고맙습니다. declare 키워드에 더 많은 것을 알게되었습니다. 비록 거래에서 변수를 선언하는 데 사용 된 키워드 일 뿐이지 만 나는 벗어나 더 많은 것을 알게되었습니다. 나는 sql을 모두 잘못보고 있으며 DOS와 비슷하게 보이고 프로그래밍 언어처럼 느껴진다. –

+0

제프를 환영합니다. –

답변

0

내가 많은 코딩을하고되지 않은 지난 몇 일 이렇게 아픈 적이 있지만 내가 해결이 문제를 더 MySQL을 알아 내 컴퓨터에서 시간을 보냈다 및 솔루션을 가로 질러왔다. 사용되는 주요 테이블은

Posts (post_id int(11), post_subject varchar(255), post_content text, post_date datetime, fk_post_by int(11)) 
Tags (tag_id int(11), tag_name varchar(255)) 
Junction_Posts_Tags(junc_id int(11), fk_post_id int(11), fk_tag_id int(11)) 

나의 새로운 솔루션이 '저장 프로 시저'와 완성 된 수정 된 트랜잭션을 사용합니다. 테이블을 게시 할 새 행을 추가

저장 프로 시저가

addPost(IN msg text, IN sub varchar(255), IN poster varchar(255), OUT post int) 
BEGIN 
INSERT INTO posts(post_content, post_subject, post_date, post_by) 
SELECT msg, sub, NOW(), user_id 
FROM users 
WHERE user_name = poster; 
SET post = LAST_INSERT_ID(); 
END 

태그 테이블은 미리 정의 된 값을 포함하고 나는 새로운 태그는 사용자가 추가 할 수 있도록 싶지 않아요. 사용자는 하나의 게시물에 대해 여러 태그를 선택할 수 있지만 접합 테이블이 필요합니다. 접합 테이블에 행을 추가하는 저장 프로시 듀어입니다.

addPostTag(IN tag varchar(255), IN post int) 
BEGIN 
INSERT INTO juct_tags_posts(post_key, tag_key) 
SELECT post_id, 
(SELECT tag_id 
FROM tags 
WHERE tag_name = tag) 
FROM posts 
WHERE post_id = post; 
END 

이 두 절차

난 아직도 내가 DECLARE action HANDLER condition 문을 일한 한 번 오류 처리를 추가 할,하지만 수행되지 않습니다. PHP에서 사용하는 SQL 문은 이제 세 부분으로 나뉩니다.

set AUTOCOMMIT = 0; 
START TRANSACTION; 
CALL addPost(?,?,?, @post_id); 

이렇게하면 트랜잭션이 시작되고 메모리의 Post 테이블에 대한 행이 만들어집니다. 다음은

사용자가 선택한 모든 태그에 대해이 sql을 실행합니다. 별칭으로 @post_id을 저장하려고 시도했지만 프로 시저 호출에서 사용할 때 오류가 계속 발생했습니다. 그럼 오류가 반환되지 않으면, 나는 이것으로 모든 것을 저지르고.

COMMIT; 

질문을 만들었을 때이 특정 시나리오에 대한 해결책을 찾지 못했기 때문에이 답변을 게시했습니다. 누군가 도움이 되었기를 바랍니다. Fred에게 다시 도움을 청합니다.