【问题标题】:Injecting an SQL to Controller in codeignitor在codeigniter中将SQL注入控制器
【发布时间】:2019-04-03 21:17:07
【问题描述】:

我正在尝试使用 DATE_FORMAT 方法注入 SQL,但它给了我解析错误。但是查询在 phpmyadmin 中运行良好。您可以在下面找到我的代码,这是我的控制器

public function index() {
  $sql = "SELECT DATE_FORMAT('added_date', "%M") AS Month, SUM(total) FROM tbl_order GROUP BY DATE_FORMAT('added_date', "%M")";
  $query = $this->db->query($sql);
  $orderData= $query->result_array();
  $data["orderData"] = $orderData;
  var_dump($data);die;
  $this->load->view('admindashboard/index.php',$data);
}

我也附上了错误信息

【问题讨论】:

  • 什么是added_date 它是来自tbl_order 表的列吗?
  • 尽可能将错误粘贴为纯文本。这有助于其他有类似问题的人找到此问题和任何相关的解决方案。

标签: php mysql sql codeigniter controller


【解决方案1】:

我认为您可以尝试使用'%M' 而不是"%M",因为它会将字符串拆分为"

$sql = "SELECT DATE_FORMAT(added_date, '%M') AS Month, 
SUM(total) 
FROM tbl_order 
GROUP BY DATE_FORMAT(added_date, '%M')";

【讨论】:

  • 很高兴为您提供帮助:)
  • 如果您使用双引号字符串,您需要在其中使用单引号分隔双引号,例如"...\"quoted\"...",以便 PHP 了解您的意图。
【解决方案2】:

我建议对整个字符串使用单引号,并在其中使用双引号。我认为它会解决错误。

$sql = 'SELECT DATE_FORMAT("added_date", "%M") AS Month, 
SUM(total) FROM tbl_order 
GROUP BY DATE_FORMAT("added_date", "%M")';

【讨论】:

  • 不,我还是遇到了同样的错误。但 D-shah 的建议非常有效。谢谢
  • 您的欢迎和抱歉,但很高兴您的错误解决了 :)
【解决方案3】:

如果added_date 是一列,您必须特别注意所使用的引号。在 MySQL 中,列用反引号分隔,但只有在它们与任何 reserved keywords 冲突时才需要这样做。

另一个问题是使用双引号来定义字符串和在字符串内。如果你这样做了,你必须避开内在的,像这样:

 $query = $this->db->query("SELECT DATE_FORMAT(added_date, \"%M\") AS Month, SUM(total) FROM tbl_order GROUP BY Month");

如果您有一个语法高亮文本编辑器,这在当今非常重要,您会看到字符串高亮如何在原始代码中被视为结束引号的地方立即停止。这是一个语法错误警告。

另一个解决方法是使用两种不同的引号。 MySQL 的默认模式允许字符串值使用双引号或单引号:

 $query = $this->db->query('SELECT DATE_FORMAT(added_date, "%M") AS Month, SUM(total) FROM tbl_order GROUP BY Month');

在实践中,通常最好使用单引号字符串进行查询,因为可以防止意外 SQL 注入:$-type 变量在单引号模式下插值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2016-11-16
    • 2016-01-26
    相关资源
    最近更新 更多