Запросы массовой вставки в один - PullRequest
0 голосов
/ 29 марта 2012

Я написал это сообщение, чтобы отправить новое личное сообщение пользователю, однако я пытаюсь выяснить, как я могу немного повторить это, потому что мне сказали, что я не должен делать запрос внутрицикл, потому что он может накапливать до сотен запросов и вместо этого выполнять один запрос за раз.Я использую класс базы данных CodeIgniter и, более конкретно, его класс Active Record.

function sendMessage($recipients, $subject, $message, $sender, $bcc = array())
{
    // Check args
    if(!is_array($recipients)) { throw new Exception('Non-array $recipients provided to sendMessage()'); }
    if(!is_string($subject)) { throw new Exception('Non-string $subject provided to sendMessage()'); }
    if(!is_string($message)) { throw new Exception('Non-string $message provided to sendMessage()'); }
    if(!is_numeric($sender)) { throw new Exception('Non-numeric $userID provided to sendMessage()'); }
    if(!is_array($bcc)) { throw new Exception('Non-array $bcc provided to sendMessage()'); }

    $this->db->set('subject', $subject); 
    $this->db->set('senderID', $sender); 
    $this->db->set('message', $message); 
    $this->db->insert('usersPersonalMessages');
    if ($this->db->affected_rows() == 1)
    {
        $insertID = $this->db->insert_id();
        foreach ($recipients as $recipientID)
        {
            $this->db->set('userID', $recipientID); 
            $this->db->set('usersPersonalMessagesID', $insertID); 
            $this->db->insert('usersPersonalMessagesRecipients');
            if ($this->db->affected_rows() == count($recipients)) 
            {
                continue;
            }
        }

        if (isset($bcc) && (!empty($bcc)))
        {
            foreach ($bcc AS $bccID)
            {
                $this->db->set('userID', $bccID); 
                $this->db->set('usersPersonalMessagesID', $insertID); 
                $this->db->set('type', 2); 
                $this->db->insert('usersPersonalMessagesRecipients'); 
            }
            if ($this->db->affected_rows() == count($bcc)) 
            {
                continue;
            }                
        }
        continue;
    }  
    return TRUE;
}

РЕДАКТИРОВАТЬ: Любые дополнительные идеи, потому что у меня уже есть массив с именем $ополучателей.

1 Ответ

2 голосов
/ 29 марта 2012

Ты не хочешь этого делать.Пожалуйста, попробуйте с пакетной вставкой. Это вставит запрос сразу, поэтому взаимодействие с БД выполняется только один раз

Начиная с документа codeigniter

$data = array(
   array(
      'title' => 'My title' ,
      'name' => 'My Name' ,
      'date' => 'My date'
   ),
   array(
      'title' => 'Another title' ,
      'name' => 'Another Name' ,
      'date' => 'Another date'
   )
);

$this->db->insert_batch('mytable', $data);

// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')

См. Ссылку ниже http://codeigniter.com/user_guide/database/active_record.html#insert

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...