2017-02-17 6 views
1

PHPとMySQLを使って自分のWebポートフォリオを作成する場合は、フォーラムやブログを作成しています。私はPHPでうまくいくが、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です。次の3つの挿入は、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のWebサイト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)) 

私の新しいソリューションは、2「ストアドプロシージャ」と完成手直しトランザクションを使用しています。

テーブル

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 

を投稿するには、新しい行を追加するためのストアドプロシージャをタグテーブルには、事前に定義された値が含まれていると私は新しいタグがユーザーによって追加できるようにする必要はありません。ユーザーは1つのポストに複数のタグを選択できますが、ジャンクション・テーブルが必要です。これは、接合テーブルの行を追加するためのストアドプロシージャです。

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文は、3つの部分に分かれています。

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

これはトランザクションを開始し、メモリ内のポストテーブルの行を作成します。次は

ユーザーが選択したすべてのタグに対してこのsqlを実行します。私はエイリアスとして@post_idを格納しようとしましたが、プロシージャコールで使用するとエラーとして表示され続けました。その後、エラーが返されなければ、私はこれですべてをコミットします。

COMMIT; 

質問をしたときにこの特定のシナリオに対する解決策が見つかりませんでした。誰かを助けてくれることを願ってフレッドに感謝します。