从php文件运行命令时出现SQL错误

时间:2018-05-05 17:43:18

标签: php mysql

如果不存在,我需要在尝试添加列之前检查列是否存在。 以下是此帖中的信息: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完成,有没有办法围绕它?

1 个答案:

答案 0 :(得分:1)

DELIMITERbuiltin 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中使用存储过程。