php - 如何在 PHP PDO 中执行算术运算?

标签 php mysql pdo

这个问题有点简单(可能有点傻),但我会给你一个例子。
在我正在从事的项目中,我创建了一些函数(类方法),它们将为我执行一些基本的 SQL 操作。我需要做的就是提供表名、列和值等信息作为参数,剩下的事情就会由它完成。

函数结构基本上是这样的:

public function update_order($order_id, $order_value) {    
    $example_sth = $pdo->prepare("UPDATE example SET example_order = :order_value WHERE example_id = :order_id");
    $example_sth->bindParam(":order_id", $order_id);  
    $example_sth->bindParam(":order_value", $order_value);  
    $example_sth->execute();

    $data = $example_sth->fetch();
    return $data;
}

也就是说,现在假设我想执行这样的查询:

UPDATE example SET example_order = example_order + 1;

由于我使用PDO执行SQL操作,无论如何我可以在PDO的bindParam()函数中传递“example_order + 1”部分,或者唯一的解决方案是完全删除PDO变量并直接编写算术运算在查询中?

预先感谢您的帮助。

更新

为了简单起见,我没有在问题中包含附加信息。由于提出了一些困惑,我将在这里为那些试图理解我的意图的人提供这些内容。

我正在做的项目是一个类似RPG的网站,用户有属性点,元素有特效等等。
所有这些用户属性和项目效果都是由管理员创建或操纵的。

由于这些项目的效果在它们的作用上有很大的不同(它可以简单地为用户提供更多的属性点,但它也可以执行更复杂的操作,例如创建或删除整个配置文件),这是我唯一的解决方案就是将这些效果转化为SQL操作。
为了避免安全漏洞,我当然不允许管理员用户创建一个项目来为自己保存这些 SQL 操作,所以我决定做的是保存简单的 JSON 命令,例如:

{"update":[
    {"columns":"order_id, order_value",
    "values":"16281738, 16"}
]}

管理员用户可以通过一个简单的控制面板选择他们想要项目效果执行的操作,并且 JSON 将根据该结果自动生成。

当普通用户执行效果时,所有这些 JSON 命令都必须传递给负责 SQL 操作的类方法(我上面提到的那些)。

现在有人问我:为什么我必须保存算术运算?

答案是:

如果这些项目效果之一是专门为用户创建的,我知道我可以在创建项目效果之前自己简单地执行计算,因此 JSON 命令已经包含最终结果(例如,“”column” :“life_ponts”、“值(value)”、“77”)。
但由于这些操作/项目效果并不是专门针对用户的,因此它们必须是主观的(即,基于当前正在执行它们的用户进行工作)。
因此,我现在唯一的解决方案是不保存最终结果(因为在这种情况下这是不可能的),而是保存必须在这些属性点上完成的算术运算。
因此,当我保存 ""column": "life_points", "value": "life_points + 1""时,我想做的是从当前执行命令的用户获取 life_points,并增加它增加 1。

我知道这听起来很令人困惑,甚至可能是错误的,所以我完全愿意接受更好的建议。 抱歉造成误解,希望大家能帮帮我。
问候!

最佳答案

绑定(bind)是为字段设计的,而不是名称。您正在寻找的是可以更改的字段白名单。

如果你想更进一步,我建议这样做:

{
    "update": [
        {
            "column": "order_id",
            "type": "relative|absolute",
            "value": 16281738
        }
    ]
}

这是发生的事情:

  1. 您可以设置每列的操作,而不是一组操作。您应该使用白名单!
  2. 添加了一个新字段 -“类型”。它只能采用两个值:relativeabsolute,它们指定要执行的操作类型。如果它有任何其他值(value),那么它就是一个风险,您应该丢弃或抛出异常。
  3. 该值为整数/ float 。当您json_decode时,您应该将其转换为int/float或检查if (is_numeric())。这很重要,因为您可以安全地将 int/float 替换为 sql 查询,而无需担心注入(inject)风险。

最后您说有时您需要复杂的操作 - 使用类型字段来指定它。但是,如果您不需要其他值,请考虑使用 bool 值

关于php - 如何在 PHP PDO 中执行算术运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40893472/

相关文章:

javascript - pentaho mysql 日期时间 javascript 比较

php - mysql_real_escape_string 的 PDO 等效项是什么?

php - 使用 PHP MySQL 创建议程 View - 按年份和月份划分获取的 MySQL 行

php - 由于卖家的网站,PayPal 无法处理此交易

mysql - 在一个巨大的表中更改mysql字段名称

Mysql:用一种表结构扩展另一种表结构

php - 我无法显示查询结果是否为空

PHP 提交和处理表单的最佳且安全的方式

php - Laravel 将变量放入@lang()

PHP-MySQLi 连接随机失败,出现 "Cannot assign requested address"