如果不存在,我需要在尝试添加列之前检查列是否存在。 以下是此帖中的信息:mysql ALTER TABLE if column not exists
我将以下内容添加到我的zen cart php文件
$db->Execute("DROP PROCEDURE IF EXISTS `gdpr_accept`;
DELIMITER //
CREATE PROCEDURE `gdpr_accept`()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
ALTER TABLE " . TABLE_CUSTOMERS . " ADD `gdpr_accept` TINYINT(1) NOT NULL DEFAULT '0' AFTER `COWOA_account`;
END //
DELIMITER ;
CALL `gdpr_accept`();
DROP PROCEDURE `gdpr_accept`;");
但是,我收到以下错误记录
[05-May-2018 19:37:02 Europe / Paris] PHP致命错误:1064:您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在DELIMITER附近使用正确的语法//
CREATE PROCEDURE gdpr_accept
()
开始
'在第2行::如果出现{DIP程序gdpr_accept
;
DELIMITER //
CREATE PROCEDURE gdpr_accept
()
开始
DECLARE CONTINUE HANDLER开始SQLEXCEPTION开始;
ALTER TABLE客户ADD gdpr_accept
TINYINT(1)NOT NULL DEFAULT' 0' COWOA_account
之后;
结束 //
DELIMITER;
CALL gdpr_accept
();
DROP PROCEDURE gdpr_accept
; ==> (如第72行所述)/Applications/MAMP/htdocs/gdpr/stOrm-PTO-fluSh/includes/init_includes/init_reconsent_popup_setup.php
然而,当我在phpMyAdmin中运行相同的命令后,确认我想要" DROP PROCEDURE IF EXISTS gdpr_accept
"它完美运行。
注意:如果我尝试拆分查询,它将在
失败$db->Execute("DELIMITER //");
出现此错误:1064您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以便在DELIMITER附近使用正确的语法//'在第1行
有没有理由说这个SQL命令不能通过php完成,有没有办法围绕它?
答案 0 :(得分:1)
DELIMITER
是builtin command in the mysql client,它不是MySQL服务器识别的语句。您无法使用PHP运行DELIMITER
语句。
但您不需要使用DELIMITER
。这只是为了帮助mysql客户端告诉你的CREATE PROCEDURE语句在哪里结束,因为一个过程通常包含分号字符,否则它将是不明确的,分号是过程体的一部分而不是过程定义的结尾。
您应该一次从PHP运行一个语句。然后它并不含糊。
$db->Execute("DROP PROCEDURE IF EXISTS `gdpr_accept`");
$db->Execute("CREATE PROCEDURE `gdpr_accept`()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
ALTER TABLE " . TABLE_CUSTOMERS . " ADD `gdpr_accept` TINYINT(1) NOT NULL DEFAULT '0' AFTER `COWOA_account`;
END");
$db->Execute("CALL `gdpr_accept`()");
$db->Execute("DROP PROCEDURE `gdpr_accept`;");
顺便说一下,你没有理由需要这个任务的程序,因为你完成后就完成了程序。直接运行ALTER TABLE会简单得多:
$db->Execute("ALTER TABLE " . TABLE_CUSTOMERS .
" ADD `gdpr_accept` TINYINT(1) NOT NULL DEFAULT '0' AFTER `COWOA_account`");
我看到很多关于Stack Overflow的问题来自那些似乎认为在MySQL中使用存储过程是个好主意的人。虽然存储过程在Oracle和Microsoft SQL Server中很常见,但它们比在MySQL中的价值更麻烦。我避免在MySQL中使用存储过程。