如何解决在PHP和MySQLi的准备好的语句中两次使用相同的值
如何初始化用户定义的变量,并在通过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,$user_id);
$update->execute();
$update->close();
}
像我现在这样做意味着什么,这是一个可靠的解决方案吗?它正在我的本地计算机上运行,我担心在其他计算机/环境上的兼容性。
解决方法
如果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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。