Оптимизација употребе SQL упита у PHP

Извршавање SQL упита ка бази података је веома спора операција. Зато треба тежити да се минимизира број упита ка бази.

Најчешћа грешка је извршавање множества SQL упита у петљи, при томе, да постоје алтернативни упити који омогућавају да се жељено изврши једном командом.

Погледајмо на примеру.

Нека нам је дат низ са id записима у бази података и потребно је да обришемо записе са тим id.

Не размишљајући дуго, може се написати оваква "дивна" конструкција:

php<?php
  $ids = [1, 2, 3, 4, 5]; // низ за брисање
  
  foreach ($ids as $id) {
    mysqli_query($link, "DELETE FROM users WHERE id=$id");
  }
?>

Проблем овог кода је у томе што се у петљи извршава множество упита. Замислите да у низу буде 100 елемената - извршиће се 100 упита ка бази!

Посебна замка описане задаче је у томе што при развоју сајта база података је мала и упити се извршавају веома брзо. Међутим, како сајт ради на хостингу, база ће расти, упити ће се извршавати све спорије, и може доћи до тога да ће се, због извршавања стотине упита у петљи, сајт учитавати преко минута!

Уложивши врло мало напора, може се урадити тако да се изврши само један упит, овако:

php<?php
  $ids = [1, 2, 3, 4, 5];
  
  $str = implode(',', $ids); // добијамо стринг '1,2,3,4,5'
  mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Задание 1

Оптимизујте доњи код:

php<?php
  $arr = [1, 2, 2, 4, 5];
  $res = [];
  
  for ($i = 1; $i < count($arr); $i++) {
    $note = mysqli_query($link, "SELECT * FROM users WHERE id=$id");
    for ($data = []; $row = mysqli_fetch_assoc($note); $data[] = $row);
    
    $res[] = $data;
  }
  
  var_dump($res);
?>