Foreach inserir consulta da melhor maneira

4

Oi eu tenho esse código que funciona bem, mas eu acho que ele usa um monte de recursos do servidor, porque executar uma consulta ao banco de dados para cada ID de usuário armazenado em um grupo, existe alguma maneira de resolver este problema? Também como posso usar uma declaração preparada?

$event_start_date = date('d-m-Y', strtotime($new_start_date));
    $notification = "Nuovo evento <span class='text-warning'><strong>$event_title</strong></span> inizia il $event_start_date";
    $notification_status = "0";
    $notification_category= "events";


    $sql = "SELECT user_join_id FROM user_group_join WHERE group_join_id='$event_group'";

    $result= mysqli_query($conn,$sql);

    $datas= array();

    if(mysqli_num_rows($result) > 0){

        while($row=mysqli_fetch_array($result, MYSQLI_ASSOC)){

        $datas[]= $row;

        }

    }

    foreach($datas as $data) {

    $id_cliente = $data['user_join_id'];

    $event_notification = mysqli_prepare($conn, "INSERT INTO user_notifications (notification_sent_by, notification_sent_to, notification_message, notification_time, notification_status, notification_category, notification_category_id) VALUES(?,?,?,now(),?,?,?)");
    mysqli_stmt_bind_param($event_notification, 'iisisi', $userid, $id_cliente, $notification, $notification_status, $notification_category, $event_id);
    mysqli_stmt_execute($event_notification);
    mysqli_stmt_close($event_notification);

    }

Muito obrigado pela sua ajuda

    
por pippo 19.02.2017 / 10:27

1 resposta

0

Além disso, você prepara a instrução, usa-a e fecha todas as etapas do loop. Isso é muito esforço desperdiçado.

Prepare uma vez, use o loop e feche no final.

$event_notification = mysqli_prepare($conn, "INSERT INTO user_notifications (notification_sent_by, notification_sent_to, notification_message, notification_time, notification_status, notification_category, notification_category_id) VALUES(?,?,?,now(),?,?,?)");
foreach($datas as $data) {
    $id_cliente = $data['user_join_id'];
    mysqli_stmt_bind_param($event_notification, 'iisisi', $userid, $id_cliente, $notification, $notification_status, $notification_category, $event_id);
    mysqli_stmt_execute($event_notification);
}
mysqli_stmt_close($event_notification);

Espero que seja muito mais rápido.

Eu não sou especialista em mysqli e declarações preparadas, mas tenho certeza que você pode ligar todos os dados em uma grande variedade e fazer o interesse em um único hit.

Essa resposta SO sugere que, para mim, de qualquer maneira . Como você já criou o array grande, você deve ser capaz de usá-lo sem foreach para interrompê-lo. Isso pode ser ainda mais rápido ainda.

    
por Matthew Brown aka Lord Matt 04.10.2017 / 17:47

Tags