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

在准备好的PHP和MySQLi语句中使用相同的值两次,php,mysql,sql,mysqli,sql-update,Php,Mysql,Sql,Mysqli,Sql Update,如何启动一个用户定义的变量,并在PHP/MySQLi连接上准备的一个MySQL语句中使用它两次 我有一个购物车应用程序,用户可以向其帐户添加信用,数据库中有两个字段携带此值:credit\u balance和credit\u available。我将信用分为两个字段,因为用户可以保留(南非术语,用于支付押金以保证日后购买的物品)一个项目,并且在该项目尚未完成时,资金被预留用于保留,不能用于其他地方 因此,当用户向其帐户添加信用时,我想更新这两个字段,这就是我想到的: if($update = $

如何启动一个用户定义的变量,并在PHP/MySQLi连接上准备的一个MySQL语句中使用它两次

我有一个购物车应用程序,用户可以向其帐户添加信用,数据库中有两个字段携带此值:credit\u balance和credit\u 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();
}

像我这样做意味着什么?这是一个可靠的解决方案吗?它在我的本地机器上工作,我担心在不同的机器/环境上的兼容性。

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

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

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

虽然看起来更整洁,但第二种方法更清晰(IMHO)。也不确定您的第一条语句是如何工作的,因为您的SQL中有
user\u id=1
。我认为第一条语句不起作用。mysql自上而下,因此ypu只能使用已声明的用户定义变量prior@NigelRen我在那里犯了一个错误。“1”的意思是“1”。无论如何,我已经查看了MySQL文档,我找不到任何说明第一种方法是否在某些版本的MySQL上不起作用的部分,这就是我关心的问题所在。我想我必须坚持使用第二种方法。@nbk我测试了第一种方法,它在我的本地机器上运行,也在运行MySQL 5.7.3的Amazon Linux AMI实例上运行。不,是否可以将同一命名参数与PDO一起重用并不取决于PDO::ATTR_EMULATE_PREPARES是否正确。这看起来更简洁。我会在回到我的工作站并提出建议后立即尝试。