【问题标题】:How to execute custom delimiter query with mysqli multiquery如何使用 mysqli 多查询执行自定义分隔符查询
【发布时间】:2014-04-11 06:18:15
【问题描述】:

我有以下 sql 脚本,我想用多查询执行它

DELIMITER $$
DROP FUNCTION IF EXISTS `getAttendanceHistoryDates`$$

CREATE FUNCTION getAttendanceHistoryDates(processDate date)
  RETURNS TEXT
  DETERMINISTIC
  LANGUAGE SQL
BEGIN

  DECLARE minDate date;
  DECLARE startYear int;
  DECLARE endYear int;
  DECLARE dateString TEXT;

  SET minDate = (SELECT MIN(date) FROM `ohrm_attendance_report`);
  SET startYear = YEAR(minDate);
  SET endYear = YEAR(processDate);

  SET  dateString = processDate;
  WHILE startYear  < endYear DO
     SET  dateString = CONCAT(dateString,'|',CONCAT(startYear, '-12-31'));
     SET  startYear = startYear + 1; 
  END WHILE;

  RETURN dateString;
END;
$$
DELIMITER ;

有没有办法做到这一点?如果我只是从脚本中删除 DELIMITER $$DELIMITER ; 并将 $$ 替换为 ; 并使用多查询执行,它会起作用吗?

【问题讨论】:

    标签: php mysql mysqli-multi-query


    【解决方案1】:

    不,不能通过 MySQL API。分号分隔符不可配置。这真的是在 MySQL 服务器端确定的。更多详情请见http://dev.mysql.com/doc/refman/5.6/en/c-api-multiple-queries.html

    mysql 命令行界面通过预先解析输入并通过分隔符分隔语句来支持DELIMITER。然后它单独执行每个语句。

    没有理由需要使用多查询。您应该将 DROP FUNCTIONCREATE FUNCTION 作为单独的查询运行。

    一般来说,使用多查询是个坏主意,因为它为bad SQL injection problems 创造了机会。

    【讨论】:

    • 最糟糕的是,mysqli 库本身可以导致 mysql-injections。如果没有准备好的语句,应该可以避免 SQL 注入,并且不应将注入归咎于 mysqli_multi。
    • @FakharAnwar,我不想让你失望,但是查询参数是避免SQL注入的最佳方案,查询参数需要使用prepare() & execute()。至于 mysqli_multi(),我坚持我在这个答案中的声明,即使用它没有任何好处,并且启用一种使用普通 API 无法实现的 SQL 注入的风险很小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2013-09-19
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多