2016-11-30 76 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查詢,而無需注入風險。

最後你說有時你需要複雜的操作 - 使用類型字段來指定它。但是,如果您不需要其他值,請考慮使用布爾值代替