Laravel控制器内函数间传递$id3变量的问题求助
问题分析与解决方案
首先看你代码里的核心问题:
index函数中,return view(...)语句之后的所有代码完全不会执行,因为return会直接终止函数运行,所以session设置和$id3的计算等于白写。
下面给你两种可行的变量传递方案,同时修复代码里的其他问题:
方案一:通过路由参数传递
- 先修复
index函数的执行顺序,先计算$id3再返回视图:
public function index(Request $request, Groupecampagne $id_campagne, Groupe $groupes) { $groupes = Groupe::all(); // all()已返回完整集合,无需额外get('groupes.*') $groupecampagnes = Groupecampagne::join('campagnes', 'campagnes.id_campagne', '=', 'campagne_groupe.id_campagne') ->get(['campagne_groupe.*', 'campagnes.id_campagne']); $segs = DB::table('segements')->select('nom_segment', 'id_segment')->get(); $cpgrps = DB::table('campagne_groupe') ->select('statut_publication') ->groupBy('statut_publication') ->get(); // 先计算$id3 $id2 = $request->fullUrl(); $id3 = substr($id2, 38, 3); return view('groupecampagnes.index', compact('groupecampagnes', 'segs', 'cpgrps', 'id_campagne', 'groupes', 'id3')) ->with('i', (request()->input('page', 1) - 1) * 5); }
- 配置路由让
recup接收id3参数:
// web.php Route::post('/recup/{id3}', [YourController::class, 'recup']);
- 在视图中提交请求时带上参数(比如表单):
<form action="{{ url('/recup/' . $id3) }}" method="POST"> @csrf <!-- 其他表单字段 --> <button type="submit">提交</button> </form>
- 修改
recup函数,必须修复SQL注入风险:
public function recup(Request $request, $id3) { $valeur = $request->input('id_segment'); // 使用参数绑定避免SQL注入 DB::insert('INSERT INTO segment_groupe (id_groupe, id_segment) SELECT groupes.id_groupe, segements.id_segment FROM groupes JOIN segment_groupe JOIN segements ON groupes.id_groupe = segment_groupe.id_groupe AND segment_groupe.id_segment = segements.id_segment WHERE segment_groupe.id_segment = ?', [$valeur]); DB::insert('INSERT INTO campagne_groupe (id_groupe, id_campagne) SELECT segment_groupe.id_groupe, ? FROM segment_groupe JOIN campagne_groupe JOIN campagnes ON segment_groupe.id_groupe = campagne_groupe.id_groupe AND campagne_groupe.id_campagne = campagnes.id_campagne WHERE segment_groupe.id_segment = ?', [$id3, $valeur]); }
方案二:通过Session传递(不暴露URL参数)
如果不想在URL里显示id3,可以用Session存储:
- 在
index函数中把$id3存入Session:
// index函数中计算出$id3后添加 session(['campagne_id' => $id3]);
- 修改
recup函数直接从Session取值:
public function recup(Request $request) { $valeur = $request->input('id_segment'); $id3 = session('campagne_id'); // 同样使用参数绑定写SQL DB::insert('INSERT INTO segment_groupe (id_groupe, id_segment) SELECT groupes.id_groupe, segements.id_segment FROM groupes JOIN segment_groupe JOIN segements ON groupes.id_groupe = segment_groupe.id_groupe AND segment_groupe.id_segment = segements.id_segment WHERE segment_groupe.id_segment = ?', [$valeur]); DB::insert('INSERT INTO campagne_groupe (id_groupe, id_campagne) SELECT segment_groupe.id_groupe, ? FROM segment_groupe JOIN campagne_groupe JOIN campagnes ON segment_groupe.id_groupe = campagne_groupe.id_groupe AND campagne_groupe.id_campagne = campagnes.id_campagne WHERE segment_groupe.id_segment = ?', [$id3, $valeur]); }
- 路由无需参数:
Route::post('/recup', [YourController::class, 'recup']);
额外提醒
- 直接拼接变量到SQL语句存在严重SQL注入风险,必须用参数绑定(如上代码中的
?和对应参数数组),或者用Eloquent模型操作,更安全也符合Laravel最佳实践。 substr($id2, 38, 3)从URL截取ID的方式极不可靠,URL结构稍有变化就会出错,建议直接从路由参数获取id_campagne,比如如果index路由是/groupecampagnes/{id_campagne},直接用方法参数里的$id_campagne->id即可,不用截取URL。
内容的提问来源于stack exchange,提问作者Yolande-Llc
相关产品推荐
相关产品推荐

