MySQL PHP游戏后插入触发错误
我正在使用PHP和MySQL创建一个简单的基于文本的RPG,在尝试使用AFTER-INSERT触发器时遇到了一个奇怪的错误 在我将一个新生物插入生物表后,我想使用触发器将一个新记录插入存储表,其中包含我添加的生物的战利品信息。具体地说,当我在《生物》中插入一条记录时,我希望它接受“gloot”并将其放入存储表中 生物表代码:MySQL PHP游戏后插入触发错误,php,mysql,triggers,Php,Mysql,Triggers,我正在使用PHP和MySQL创建一个简单的基于文本的RPG,在尝试使用AFTER-INSERT触发器时遇到了一个奇怪的错误 在我将一个新生物插入生物表后,我想使用触发器将一个新记录插入存储表,其中包含我添加的生物的战利品信息。具体地说,当我在《生物》中插入一条记录时,我希望它接受“gloot”并将其放入存储表中 生物表代码: CREATE TABLE IF NOT EXISTS `creatures` ( `id` int(3) NOT NULL AUTO_INCREMENT,
CREATE TABLE IF NOT EXISTS `creatures` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`name` varchar(21) NOT NULL,
`hpoints` mediumint(3) NOT NULL,
`maxhp` mediumint(3) NOT NULL,
`attack` mediumint(3) NOT NULL,
`defense` mediumint(3) NOT NULL,
`experience` int(3) NOT NULL,
`level` mediumint(3) NOT NULL,
`gloot` varchar(100) NOT NULL,
`gold` mediumint(3) NOT NULL,
`isloot` mediumint(3) NOT NULL,
PRIMARY KEY (`id`)
)
存储表的代码:
CREATE TABLE IF NOT EXISTS `store` (
`name` varchar(50) NOT NULL,
`stats` varchar(30) DEFAULT NULL,
`statadd` smallint(3) DEFAULT NULL,
`price` int(11) DEFAULT NULL,
`amount` smallint(5) DEFAULT NULL,
`randid` int(9) NOT NULL,
`type` varchar(30) DEFAULT NULL,
`location` varchar(100) DEFAULT NULL
)
最后,这里是触发代码
DELIMITER $$
DROP TRIGGER IF EXISTS itemToStore
CREATE TRIGGER itemToStore
AFTER INSERT ON `creatures`
FOR EACH ROW BEGIN
IF (New.gloot != “”) THEN
INSERT INTO `store` (`name`, `statadd`, `price`, `amount`, `randid`)
VALUES('New.gloot', '0', '0',’0’, ROUND( 100000000 * RAND( ) ));
END IF;
END;
$$
所以,我要说的是,如果gloot不是空的,那么将其插入存储表
触发器添加得很好,但在我插入到bioters表后引发的错误很奇怪。我得到:
MySQL说:#1054-未知专栏“我的朋友”
为了完整起见,我使用的insert语句如下:
INSERT INTO `legends`.`creatures` (
`id` ,
`name` ,
`hpoints` ,
`maxhp` ,
`attack` ,
`defense` ,
`experience` ,
`level` ,
`gloot` ,
`gold` ,
`isloot`
)
VALUES (
NULL , 'dragon', '200', '200', '10', '10', '1', '1', 'Dragon Bones', '250', '50'
)
啊,那太多了。谢谢你抽出时间 将引号
“
和”
替换为”
DELIMITER $$
DROP TRIGGER IF EXISTS itemToStore $$
CREATE TRIGGER itemToStore AFTER INSERT ON `creatures`
FOR EACH ROW BEGIN
IF (NEW.gloot <> '')
THEN
INSERT INTO `store` (`name`, `statadd`, `price`, `amount`, `randid`)
VALUES (NEW.gloot, '0', '0','0', ROUND( 100000000 * RAND( ) ));
END IF;
END;
$$
分隔符$$
如果存在itemToStore,则丢弃触发器$$
在“生物”上插入后创建触发器itemToStore`
每行开始
IF(NEW.gloot“”)
然后
插入'store'('name'、'statad'、'price'、'amount'、'randid`)
值(NEW.gloot、'0'、'0',四舍五入(100000000*RAND());
如果结束;
结束;
$$
您还忘了在
drop
命令之后添加$$
。尝试将引号“
和”
替换为”
,如果(New.gloot!=”)
看起来可疑,则应该是”
也可能是字符集问题。确保EVERYTHING,EVERYWHERE始终设置为UTF-8(或任何您喜欢的字符集)。很容易忘记默认字符集中的一个小元素,把一切都搞砸了;查看与您的MySQL服务器版本对应的手册,以了解可在以下位置使用的正确语法:“在插入后为每一行创建触发器项ToStore BEGIN IF”(如果“第2行是我现在在将有趣的引号更改为”
后删除反勾号(无论如何都不需要)后得到的结果)考虑到在堆栈交换中,反勾号被用来生成类似于代码的块,这可能会使您的消息更清晰。这很有魅力。一定是因为我最初是用Word编写触发器的。给了我一些有趣的引语之类的。刚刚测试过,看起来很棒,非常感谢您抽出时间!