【问题标题】:MYSQL CREATE EVENT with laravel DB::statementMYSQL CREATE EVENT 与 laravel DB::statement
【发布时间】:2019-06-06 20:23:35
【问题描述】:

这个问题与使用 PHP 变量绑定的 MySQL 查询的 Laravel DB::statement 函数处理有关,而不是在可能的重复 here 中找到的 PHP 的 PDO 绑定过程。 Laravel eloquent 在后端使用 PDO,但 DB::statement 函数的结构与您在 PDO 方法中的执行方式不同。

我试图让我的控制器的存储函数在将条目保存到数据库时创建一个 mysql 事件。提交表单时,Laravel 抛出错误

'SQLSTATE[HY093]: 无效的参数号:绑定变量的数量与令牌的数量不匹配(SQL:创建事件测试按计划每 5 分钟执行一次更新寻呼机设置升级级别 = 升级级别 + 1 WHERE id = :问题)'。

我正在尝试重新创建以下 MySQL 查询

CREATE EVENT test ON SCHEDULE EVERY 5 MINUTE DO UPDATE issues SET escalation_level = escalation_level + 1 WHERE id = 'Rd8409347-70bb-4e3e-b351-b49c10ce9a2a';

对我来说,查询中似乎有 1 个变量,然后数组传递了 1 个变量,所以我似乎无法让查询成功。下面是表单提交到的控制器。 感谢您的帮助。

IssueController.php

  public function store(Request $request)
{
    //Validate Input
    $request->validate([
       'company_id' => 'string|max:255',
       'message' => 'required|string|max:255' 
    ]);

    //Once the form input has passed validation add input to the database

    $issueData = new Issue();
    $issueData->id = "R" . Uuid::generate(4)->string;
    $issueData->company_id = $request->company_id;
    $issueData->first_name = Auth::user()->first_name;
    $issueData->last_name = Auth::user()->last_name;
    $issueData->user_id = Auth::user()->id;
    $issueData->message = $request->message;


    //Create MySQL event to increment escalation level
    //Event will be named equal to the new page 'R' ID
    //That has just been generated.

    DB::statement('CREATE EVENT test ON SCHEDULE EVERY 5 MINUTE DO UPDATE issues SET escalation_level = escalation_level + 1 WHERE id = :issue_id', array('issue_id' => $issueData->id));

    $issueData->save();

    return redirect('home')->with('status', ['Message sent successfully.', 
        'You can monitor the status of your message from Check Status section']);

}

【问题讨论】:

  • @Jay 似乎不是有效的副本。 OP 正在发布要绑定的值,并对此进行一些雄辩的推理。并不是说这个站点上没有特定于 laravel 的欺骗,但是一般的 PDO 并不适用于此。

标签: php mysql laravel-5.8


【解决方案1】:

我在 SO 帖子 here 的帮助下发现了这个问题。 Laravel 中的一些查询需要使用未准备的语句。我能够像这样使用 DB::unprepared 来解决问题:

        DB::unprepared('CREATE EVENT event_name ON SCHEDULE EVERY 5 MINUTE DO UPDATE issues SET escalation_level = escalation_level + 1 WHERE id = ' . '/'' . $issueData->id . '/'');

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 2019-04-03
    • 2012-02-19
    • 2017-05-03
    • 2011-08-20
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多