2012-09-25 26 views
1

<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"; 
} 

沒有區別,不是被當它的工作速度更快等。 :(

+0

我很想看到錯誤處理(也許給出的提示已經有什麼不對);-),而不僅僅是「echo sucessfull」 – Najzero

+0

_locks up_是什麼意思?做前20次更改讓它到數據庫並停止執行呢?它會拋出錯誤嗎?你是否沉默了某些錯誤或通知?你的db_handle是否會拋出異常? –

+0

你跟蹤執行時間嗎?數據庫是否有高負載和鎖定問題? –

回答

0

的根本原因,我遇到的問題是不是由於泄漏預處理語句,由保羅·狄克遜的建議,雖然他提供預防,從發生絕好的建議。

此腳本通過AJAX使用GET方法調用。在param1和param2中的數組達到一定長度後,腳本破裂了。發生這種情況是因爲URL超出了最大長度限制,而不是因爲PHP腳本本身。

一旦我從我的AJAX中的GET方法切換到PST方法,我遇到的問題立即消失。

1

我的猜測是,你泄漏準備語句。您的錯誤日誌可能有線索。

當你正在使用預處理語句,爲什麼不外循環做好準備,並與裏面的參數執行它們循環?我假設你在這裏使用mysqli,在這種情況下,你需要使用bind_param

然後,你將只有每個創建2準備好的語句!

//example prepare 
$assignUser= $this->db_handle->prepare(
    "UPDATE accounts ". 
    "SET assigned_user_id=? ". 
    "WHERE id=?"); 


while (...) 
{ 
    //example bind + execute 
    $assignUser->bind_param("ii", $newAssigned[$recurse], $value); 
    $assignUser->execute(); 


} 
+0

綁定這些參數並沒有什麼區別(見編輯#2),除了速度更快的時候。另外,我使用的是PDO,而不是mysqli。 – jdstankosky

相關問題