PHP да SQL соровларининг истифодасини оптимизациялаш
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);
?>