поэтому я просто задавался вопросом, является ли это хорошей практикой или нет, или почему-то этот тип кода влияет на скорость и функциональность системы?
$foo = "bar"; $stmt = $db->prepare('SELECT * FROM table WHERE bar=?'); $stmt->bind_param('s',$foo); $stmt->execute(); $result = $stmt->get_result(); while($row = $result->fetch_assoc()){ $val1 = $row['val1']; $val2 = $row['val2']; echo "<section>"; $stmt2 = $db->prepare('SELECT * FROM table2 WHERE bar=?'); $stmt2->bind_param('s',$foo); $stmt2->execute(); $result2 = $stmt2->get_result(); while($row = $result2->fetch_assoc()){ $val1 = $row['val1']; $val2 = $row['val2']; } $stmt->close(); echo "</section>"; } $stmt->close();
первый оператор может генерировать 50 или более данных, а это значит, что будет создано еще 50 или более stmt, это плохо? спасибо за ответы.
Каждый раз, когда вы готовите заявление, он требует вызова MySQL, что дорого. Если это одно и то же утверждение, это не нужно и пустая трата времени.
Вам также нужно связать параметры только один раз. bind_param
связывает параметры со ссылкой на переменную. Таким образом, цикл должен только обновить значение переменной и execute
вызов.
В вашем коде кажется, что повторение внутреннего запроса каждый раз через цикл не нужно. Это не зависит от чего-либо, полученного из внешнего запроса, поэтому он будет возвращать одинаковый набор результатов каждый раз. Вы должны сделать это один раз, сохранить результаты в массиве, а затем просто прокручивать массив каждый раз, чтобы избежать ненужного использования базы данных.
Если это был просто искусственный пример, и у вас действительно есть зависимость между данными, возвращаемыми из внешнего запроса и параметрами во внутренний запрос, вы, вероятно, должны делать их как один запрос, содержащий JOIN
между двумя таблицами.
Это принято считать плохой практикой.
Вы делаете код более трудным для чтения и более сложным, чем это должно быть: увеличение возможности для внедрения ошибок в будущем и для других лучше понять, нуждаются ли они позже в поддержке вашего кода.
Как указано выше, вы должны использовать JOIN.