2016-11-30 74 views
0

这个问题很简单(可能有点愚蠢),但我会给你一个例子。
在我正在开发的项目中,我创建了一些函数(类方法),它们将为我执行一些基本的SQL操作。我所需要做的就是提供信息,如表名,列和值作为参数,剩下的工作就完成了。如何在PHP PDO中执行算术运算?

功能结构基本上是这样的:

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变量并直接在查询中写入算术运算?

在此先感谢您的帮助。

UPDATE

有一个额外的信息,为了简单起见,我没有在这个问题包括。由于提出了一些混淆,我将在这里包括这些试图了解我所有这些意图的人。

我正在从事的项目是类似RPG的网站,用户拥有属性点,具有特殊效果的项目等等。
所有这些用户属性和项目效果都是由管理员创建或操纵的。由于这些物品效果在他们将要做的事情上有很大差异(它可以简单地给予用户更多的属性点,但它也可以执行更复杂的操作,例如创建或删除整个配置文件),唯一的解决方案是我来到是将这些效果转化为SQL操作。
为了避免安全漏洞,我当然不会允许创建项目的管理员用户自己保存这些SQL操作,所以我决定要保存简单的JSON命令,如:

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

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

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

现在正如我一直在问:为什么我必须保存算术运算?

答案是:

如果这些项目的后果之一就是专门创建一个用户,我知道我可以简单地通过自己创建的项目效果之前进行计算,所以JSON命令将已经包括最后结果(例如,“列”:“life_ponts”,“value”,“77”“)。
但是,由于这些操作/项目效果不是专门针对用户的,它们必须是主观的(即,基于正在执行它们的用户的工作)。
因此,我现在唯一解决的办法是不保存最终结果(因为这种情况不可能),而是保存必须在这些属性点上执行的算术运算。
因此,当我保存“”列“:”life_points“,”value“:”life_points + 1“”时,我想要做的是从执行命令的用户那里得到life_points,并且将其增加1.

我知道这听起来令人困惑,甚至可能是错误的,所以我完全开放以提供更好的建议。 不好意思,我希望你们能帮我一把。
此致!

+5

为什么您需要绑定它?绑定参数的目的是防止SQL注入,即用户在查询中注入SQL代码。如果你只想增加一个值,你可以执行你的查询。没有用户输入。 –

+0

是的,我知道,@AurelBílý。但是我创建的类方法应该作为与该表相关的所有UPDATE操作的标准,所以它应该接受所有类型的信息(包括用户输入或像问题中提到的简单算术运算)。当我要做一件事或另一件事情时,它会有很大的变化,所以我不想因为一个不合适的查询而改变方法。 –

+0

用户如何发送算术运算?输入是怎样的? 然后这个脚本总是更新相同的字段,或更新的字段取决于用户输入? – Dragos

回答

0

装订针对字段设计,其值为,而不是名称。你正在寻找的是一个可以改变的领域的白名单。

如果您想进一步利用这个,我建议做这样的事情:不是一组他们的

  1. 您可以设置每列的动作,:

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

    这里是发生了什么。你应该使用白名单

  2. 添加了一个新字段 - “类型”。它只能使用两个值:相对值绝对值它们指定预成型的动作类型。如果它有任何其他值,那么这是一个风险,你应该丢弃或抛出异常。
  3. 该值是一个整数/浮点数。当你json_decode你应该把它转换为int/float或者检查if (is_numeric())。这很重要,因为您可以安全地将int/float替换为sql查询,而无需注入风险。

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