Оптимизација употребе SQL упита у PHP
Извршавање SQL упита ка бази података је веома спора операција. Зато треба тежити да се минимизира број упита ка бази.
Најчешћа грешка је извршавање множества SQL упита у петљи, при томе, да постоје алтернативни упити који омогућавају да се жељено изврши једном командом.
Погледајмо на примеру.
Нека нам је дат низ са id записима
у бази података и потребно је да обришемо записе
са тим id.
Не размишљајући дуго, може се написати оваква "дивна" конструкција:
<?php
$ids = [1, 2, 3, 4, 5]; // низ за брисање
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Проблем овог кода је у томе што се у петљи извршава
множество упита. Замислите да
у низу буде 100 елемената - извршиће се
100 упита ка бази!
Посебна замка описане задаче је у томе што при развоју сајта база података је мала и упити се извршавају веома брзо. Међутим, како сајт ради на хостингу, база ће расти, упити ће се извршавати све спорије, и може доћи до тога да ће се, због извршавања стотине упита у петљи, сајт учитавати преко минута!
Уложивши врло мало напора, може се урадити тако да се изврши само један упит, овако:
<?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)");
?>
Оптимизујте доњи код:
<?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);
?>