該方法用於選擇User和TargetUser之間的動作數量,例如,就在兩個用戶之間。該方法的結果值取決於GetTotalOfPossibleActions()
返回值,該值是動態的(每個用戶都有自己的編號)。將值計算移至SQL層的PHP層是否更好?
問題:將值計算移動到SQL層以外的SQL更好嗎?
public function GetAction() {
// ...
$MaxActionCount = $this->GetTotalOfPossibleActions();
return registry::getInstance()->get('DB')->select(
'SELECT
`Action`
, `HA`.`Id` AS `ActionId`
, IF(`Count` IS NULL
, IF('.$MaxActionCount.' % 2
, IF(`HA`.`Id` = 1
, CEIL('.$MaxActionCount.'/2)
, FLOOR('.$MaxActionCount.'/2))
, '.$MaxActionCount.'/2)
, GREATEST(IF('.$MaxActionCount.' % 2
, IF(`HA`.`Id` = 1
, CEIL('.$MaxActionCount.'/2) - CONVERT(`H`.`Count`, SIGNED)
, FLOOR('.$MaxActionCount.'/2) - CONVERT(`H`.`Count`, SIGNED))
, '.$MaxActionCount.'/2 - `H`.`Count`), 0)
) AS `CountLeft`
FROM `Help` AS `H`
RIGHT JOIN `HelpAction` AS `HA`
ON `H`.`ActionId` = `HA`.`Id`
AND `UserId` = '.$this->UserId.'
AND `TargetUserId` = '.$this->TargetUserId.'
AND `CreatedDate` = CURDATE()'));
}
的方式你只是砰變量到SQL重新評估是非常令人擔憂的。至少應該使用佔位符來避免SQL注入漏洞或更糟的情況。 – tadman
由於$ MaxActionCount是內部值,SQL注入在這裏是不可能的。 –
@羅曼這甚至不是重點。如果您不使用參數化查詢,則數據庫引擎無法重新使用您的查詢。每次你用它打到數據庫時,它都必須被完全解析。將其轉換爲存儲過程並將值作爲參數發送。與從這裏到那裏轉移一些簡單的數學運算相比,這將節省更多的時間。 – Tomalak