为了账号安全,请及时绑定邮箱和手机立即绑定

在 PHP 和 MySQLi 的准备语句中使用相同的值两次

在 PHP 和 MySQLi 的准备语句中使用相同的值两次

PHP
繁星淼淼 2023-12-15 10:38:46
如何启动用户定义的变量并在 PHP/MySQLi 连接上准备的单个 MySQL 语句中使用它两次?我有一个带有购物车的应用程序,用户可以在其中向其帐户添加信用,并且数据库中有两个字段携带此值:credit_balance 和credit_available。我将信用分为两个字段,因为用户可以预付(南非术语,表示支付押金以确保以后购买物品)一个物品,并且在待处理期间,资金会留出用于预付。由并且不能在其他地方使用。因此,当用户向其帐户添加信用时,我想更新这两个字段,这就是我想到的:if($update = $mysqli->prepare("UPDATE user SET credit_balance = credit_balance + @new_credit, credit_available = credit_available + @new_credit WHERE user_id = ? AND @new_credit = ?") {  $update->bind_param("ii", $user_id, $deposit);  $update->execute();  $update->close();}代替:if($update = $mysqli->prepare("UPDATE user SET credit_balance = credit_balance + ?, credit_available = credit_available + ? WHERE user_id = ?") {  $update->bind_param("iii", $deposit, $deposit, $user_id);  $update->execute();  $update->close();}像我这样做会有什么影响,这是一个可靠的解决方案吗?它正在我的本地计算机上运行,我担心不同计算机/环境上的兼容性。
查看完整描述

1 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

如果 mysqli 支持命名参数,这会很容易 - 但不幸的是它不支持。您可以考虑更改为 PDO,它实现了此功能。


从 SQL 角度来看:用户变量在 MySQL 中很棘手,并且计划弃用。我认为最安全的方法是select子查询中的参数,然后将其与目标表连接:


UPDATE user u

INNER JOIN (SELECT ? user_id, ? new_credit) p

    ON p.user_id = u.user_id

SET 

    u.credit_balance   = u.credit_balance   + p.new_credit, 

    u.credit_available = u.credit_available + p.new_credit


查看完整回答
反对 回复 2023-12-15
  • 1 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信