<EDIT>
功能停止,如果第一參數(一個陣列)具有20-25鍵
的問題涉及通過GET傳遞數組和擊球在某些AJAX代碼的URL長度限制。我通過切換到POST方法解決了這個問題。
</EDIT>
我有我使用在工作中批次類重新分配在SugarCRM的數據庫線索。
一切完美的作品在班裏除了這一功能:
function reassign($leads = null, $newAssigned = null, $oldAssigned = null)
{
// How many professionals to assign to?
$roundrobin = count($newAssigned) - 1;
$recurse = 0;
if (!isset($leads)) {
die("You must select the accounts to reassign!");
}
if (!isset($newAssigned)) {
die("You must select a Professional!");
}
if (!isset($oldAssigned)) {
die("Something broke in the Assigning process. Check javascript.");
}
try {
foreach ($leads as $key => $value) {
$sql_update = "UPDATE accounts SET assigned_user_id = '".$newAssigned[$recurse]."' WHERE id = '".$value."'";
$assignment = $this->db_handle->prepare($sql_update);
$assignment->execute();
unset($assignment);
$sql_statement = "INSERT INTO accounts_audit
(id,
parent_id,
date_created,
created_by,
field_name,
data_type,
before_value_string,
after_value_string)
VALUES (uuid(),
'".$value."',
now(),
'".$_SESSION['session_user_id']."',
'assigned_user_id',
'relate',
'".$oldAssigned[$key]."',
'".$newAssigned[$recurse]."')";
$audit_statement = $this->db_handle->prepare($sql_statement);
$audit_statement->execute();
unset($audit_statement);
if ($recurse < $roundrobin) {
$recurse++;
} else {
$recurse = 0;
}
}
catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
echo "Successful!\n";
}
此功能允許用戶從產生的列表檢查過任何數量的線索,而這些線索重新分配到任意數量的平等地列入列表中,並將這些更改記錄在表中以用於審計目的。
我遇到的問題是,如果用戶選擇20-25頭左右的任何地方,此功能將會佔用並掛起。任何少於20,它永遠不會掛起。這是一個問題,因爲用戶必須能夠重新分配數百個或可能數千個線索。
任何想法,爲什麼它會鎖定(它鎖定的導致數量不同,通常爲20-25)像這樣?當這個變化不足20個時,這個變化就會立即發生。
編輯:
已更新代碼以顯示語句關閉。行爲仍然沒有變化。當選擇導致其斷開的導聯數量時,不會進行更改。它不會執行第一個19-20,然後停下來,不做任何更改,也不會在審計表中添加任何內容。小於臨界點,並且所有更改都已完成並記錄在審覈表中。
我使用PDO連接到數據庫:
try {
$this->db_handle = new PDO("mysql:host=$this->dbHost;dbname=$this->dbDatabase", $this->dbUsername, $this->dbPassword);
$this->db_handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
而且我沒有得到任何錯誤那裏。我也沒有在任何代碼的日誌中得到任何錯誤。我感到很困惑。
編輯#2:
按照建議,在這裏與綁定參數一樣...
function reassign($leads = null, $newAssigned = null, $oldAssigned = null)
{
// How many professionals to assign to?
$roundrobin = count($newAssigned) - 1;
$recurse = 0;
$sql_assign = "UPDATE accounts SET assigned_user_id = :new_user_id WHERE id = :account_id";
$sql_audit = "INSERT INTO accounts_audit
(id,
parent_id,
date_created,
created_by,
field_name,
data_type,
before_value_string,
after_value_string)
VALUES (uuid(),
:parent_id,
now(),
:created_by,
'assigned_user_id',
'relate',
:old_assigned_user,
:new_assigned_user)";
$assignment = $this->db_handle->prepare($sql_assign);
$audit = $this->db_handle->prepare($sql_audit);
if (!isset($leads)) {
die("You must select the accounts to reassign!");
}
if (!isset($newAssigned)) {
die("You must select a Professional!");
}
if (!isset($oldAssigned)) {
die("Something broke in the Assigning process. Check javascript.");
}
try {
foreach ($leads as $key => $value) {
$assign_params = array(':new_user_id' => $newAssigned[$recurse], ':account_id' => $value);
$assignment->execute($assign_params);
$audit_params = array(':parent_id' => $value, ':created_by' => $_SESSION['session_user_id'], ':old_assigned_user' => $oldAssigned[$key], ':new_assigned_user' => $newAssigned[$recurse]);
$audit->execute($audit_params);
if ($recurse < $roundrobin) {
$recurse++;
} else {
$recurse = 0;
}
}
catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
echo "Successful!\n";
}
沒有區別,不是被當它的工作速度更快等。 :(
我很想看到錯誤處理(也許給出的提示已經有什麼不對);-),而不僅僅是「echo sucessfull」 – Najzero
_locks up_是什麼意思?做前20次更改讓它到數據庫並停止執行呢?它會拋出錯誤嗎?你是否沉默了某些錯誤或通知?你的db_handle是否會拋出異常? –
你跟蹤執行時間嗎?數據庫是否有高負載和鎖定問題? –