Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在MySQL中使用Declare_Php_Mysql_Blogs_Forum - Fatal编程技术网

Php 在MySQL中使用Declare

Php 在MySQL中使用Declare,php,mysql,blogs,forum,Php,Mysql,Blogs,Forum,我已经建立了一个论坛或博客,如果你愿意为我的网页组合与PHP和MySQL。我对PHP很在行,但MySQL对我来说一直是个问题,因为在此之前我从来没有理由使用MySQL或任何数据库,而不是MySQL错误消息是我见过的最糟糕的错误消息。这是我试图用于向论坛/博客添加新帖子的查询 START TRANSACTION; DECLARE postKey int; INSERT INTO posts(post_subject, post_content, post_date, post_by) SEL

我已经建立了一个论坛或博客,如果你愿意为我的网页组合与PHP和MySQL。我对PHP很在行,但MySQL对我来说一直是个问题,因为在此之前我从来没有理由使用MySQL或任何数据库,而不是MySQL错误消息是我见过的最糟糕的错误消息。这是我试图用于向论坛/博客添加新帖子的查询

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_数据。接下来的三个插入是到tag_id和post_id的连接表中<代码>准备失败:(1064)您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在“DECLARE postKey int”附近使用的正确语法;在第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;

过去几天我一直生病,所以我没有做太多的编码,但我花时间从我的电脑上了解了更多的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个“存储过程”和一个已完成的返工事务

用于将新行添加到Post表的存储过程

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
tags表包含预定义值,我不希望用户添加新标记。用户可以为一篇文章选择多个标记,但因此需要连接表。这是为连接表添加行的存储过程

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条件
语句后添加错误处理。 我在PHP中使用的SQL语句现在分为三部分

set AUTOCOMMIT = 0;
START TRANSACTION;
CALL addPost(?,?,?, @post_id);
这将开始事务并在内存中为Post表创建行

CALL addPostTag(?, @post_id);
我为用户选择的每个标记运行此sql。我尝试将
@post\u id
存储为别名,但在过程调用中使用它时,我一直将其作为错误。如果没有返回错误,我将使用此命令提交所有内容

COMMIT;

我发布这个答案是因为我在提出这个问题时没有找到任何解决方案。希望它能帮助到别人,再次感谢Fred-ii的帮助。

过去几天我一直生病,所以我没有做太多的编码,但我花时间从我的电脑上了解更多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个“存储过程”和一个已完成的返工事务

用于将新行添加到Post表的存储过程

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
tags表包含预定义值,我不希望用户添加新标记。用户可以为一篇文章选择多个标记,但因此需要连接表。这是为连接表添加行的存储过程

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条件
语句后添加错误处理。 我在PHP中使用的SQL语句现在分为三部分

set AUTOCOMMIT = 0;
START TRANSACTION;
CALL addPost(?,?,?, @post_id);
这将开始事务并在内存中为Post表创建行

CALL addPostTag(?, @post_id);
我为用户选择的每个标记运行此sql。我尝试将
@post\u id
存储为别名,但在过程调用中使用它时,我一直将其作为错误。如果没有返回错误,我将使用此命令提交所有内容

COMMIT;

我之所以发布这个答案,是因为我在提出这个问题时没有找到任何解决方案。希望它能帮助别人,再次感谢Fred-ii的帮助。

请查看mysql.com网站上的这个问答和相关链接——非常感谢。我只是意识到declare关键字还有很多。我觉得这只是一个keyword过去常常在事务中声明变量,但我太离谱了,而且还有很多。我一直错误地看待sql,认为它更像dos,而不是一种编程语言。欢迎Geoff。在mysql.com网站上查看此问答和相关链接——非常感谢。我刚刚意识到,dec还有很多lare关键字。我原以为它只是一个用于在事务中声明变量的关键字,但我太离谱了,而且还有很多。我一直错误地看待sql,认为它更像dos,而不是编程语言。欢迎Geoff。