在 PHP 和 MySQLi 的预准备语句中两次使用相同的值
Using the same value twice in a prepared statement with PHP and MySQLi
如何启动用户定义的变量并在 PHP/MySQLi 连接上准备的单个 MySQL 语句中使用它两次?
我有一个带有购物车的应用程序,用户可以在其中为他们的帐户添加信用,并且数据库中有两个字段包含此值:credit_balance 和 credit_available。我将信用分为两个字段,因为用户可以预留(南非的一个术语,用于支付定金以确保以后购买的物品)一个项目,并且在未决期间,资金被预留用于预留 - by 并且不能在别处使用。
所以,当用户向他们的帐户添加信用时,我想更新这两个字段,这就是我想出的:
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();
}
像我这样操作有什么意义,这是一个可靠的解决方案吗?它在我的本地机器上运行,我担心在不同 machine/environment.
上的兼容性
如果 mysqli 支持命名参数,这会很容易 - 但不幸的是它不支持。你可以考虑换成 PDO,它实现了这个特性。
从 SQL 的角度来看:用户变量在 MySQL 中很棘手,并计划弃用。我认为最安全的方法是 select
子查询中的参数,然后将其与目标 table:
连接起来
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
如何启动用户定义的变量并在 PHP/MySQLi 连接上准备的单个 MySQL 语句中使用它两次?
我有一个带有购物车的应用程序,用户可以在其中为他们的帐户添加信用,并且数据库中有两个字段包含此值:credit_balance 和 credit_available。我将信用分为两个字段,因为用户可以预留(南非的一个术语,用于支付定金以确保以后购买的物品)一个项目,并且在未决期间,资金被预留用于预留 - by 并且不能在别处使用。
所以,当用户向他们的帐户添加信用时,我想更新这两个字段,这就是我想出的:
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();
}
像我这样操作有什么意义,这是一个可靠的解决方案吗?它在我的本地机器上运行,我担心在不同 machine/environment.
上的兼容性如果 mysqli 支持命名参数,这会很容易 - 但不幸的是它不支持。你可以考虑换成 PDO,它实现了这个特性。
从 SQL 的角度来看:用户变量在 MySQL 中很棘手,并计划弃用。我认为最安全的方法是 select
子查询中的参数,然后将其与目标 table:
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