此问题与具有PHP变量绑定的MySQL查询的Laravels DB :: statement函数处理有关,而不与在可能的重复here中发现的PHP的PDO绑定过程有关。 Laravel雄辩地在后端使用了PDO,但是DB :: statement函数的结构与您在PDO方法中的使用方法不同。
当条目保存到数据库时,我试图让控制器的存储功能创建一个mysql事件。提交表单后,Laravel抛出错误
'SQLSTATE [HY093]:无效的参数编号:绑定变量的数量与令牌的数量不匹配(SQL:在每5分钟执行一次更新寻呼机的计划上创建事件测试SET escalation_level = escalation_level + 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']);
}
答案 0 :(得分:0)
我在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 . '/'');