每次点击后赋值不同PHP值:修改Cookie后SQL查询结果未更新如何解决
问题核心原因
- PHP属于服务端语言,相关代码仅会在页面首次加载/刷新请求服务端时执行,你通过JS修改浏览器本地Cookie的操作,并没有触发页面重新向服务端发起请求,PHP不会重新执行SQL查询,因此前端渲染的结果不会更新。
- 你设置Cookie的代码存在格式问题:
gautasId =中间的空格会导致最终生成的Cookie键名自带前导空格,PHP中$_COOKIE['gautasId']无法匹配到该Cookie,只能匹配到$_COOKIE[' gautasId'],也会导致取值异常。 - 如果设置Cookie的页面路径和PHP查询页面路径不一致,默认Cookie仅在当前路径下生效,也会导致PHP读取不到正确的Cookie值。
- 直接将Cookie值拼接进SQL语句,存在严重的SQL注入漏洞,极易被攻击拖库。
解决方法
方案1:修改Cookie后刷新页面(实现成本最低)
修改JS的setValue方法,修复Cookie格式、添加全局生效路径,修改完成后主动刷新页面触发PHP重新执行查询:
function setValue(id) { // 去掉键值中间的空格,添加path=/保证全站路径都能读取到该Cookie document.cookie = "gautasId=" + id + "; path=/"; // 刷新页面触发服务端重新渲染 location.reload(); }
方案2:AJAX异步更新(无刷新,用户体验更好)
如果不想刷新页面,可以在修改Cookie后,发起AJAX请求到后端接口拉取最新的查询结果,然后通过JS动态替换页面表格内容即可。
安全修复建议
务必将SQL拼接改为预处理语句,避免SQL注入风险:
if(isset($_COOKIE['gautasId'])) { // 预处理SQL $stmt = $conn->prepare("SELECT sa.id, sa.aprasymas, sa.poreikiai, sa.miestas, s.statusas FROM svajoniu_aprasymas sa join svajoniu_statusai s on s.id = sa.statusas where sa.senolio_id = ?"); // 绑定参数,i代表参数为整数类型 $stmt->bind_param("i", $_COOKIE['gautasId']); $stmt->execute(); $wishes = $stmt->get_result(); }
内容的提问来源于stack exchange,提问作者user122222
相关产品推荐
相关产品推荐

