Вопросы новичка о важном

Буду благодарен за ответы на возникшие вопросы:

1) код можно писать в объектно-ориентированном стиле и процедурном стиле. В первом много стрелочек. Второй (имхо) более понятен. Но первый иногда удобнее использовать (короче).
---1.1) Откуда вообще два стиля взялось?
---1.2) Какой из них предпочтительнее (если вообще этот вопрос уместен в данном случае)?
---1.3) Отличаются ли стили по скорости компиляции и выполнения кода?
---1.4) Допускается ли смешивание стилей (исходя из производительности)? Т.е. не будет ли код, написанный в одном стиле выполняться быстрее, чем код, написанный в смешанном?
2) При объявлении переменной под неё резервируется память.
---2.1) Допустим, я объявляю переменную $a=""; Она будет занимать сколько-то памяти. Сколько?
---2.2) Затем в эту переменную я заношу, например, 1мб текста. Объём памяти расширится под эти данные. А что происходит дальше, если:
------2.2.1) Я запишу в эту же переменную, например, число 0 или опять укажу $a="";. Память, которую занимал 1 мб текста, "сожмётя" или, один раз раширившись до определённого уровня, она не "ужимается"?
------2.2.2) Я удаляю эту переменную командой unset($a); Что просходит с памятью, которую занимала эта переменная?
------2.2.3) Выполнение php закончится или команда exit(); Что происходит с памятью в этом случае ($a=данные на 1мб)?
3) Базы данных mysql и расширение mysqli. Допустим, выполняем код php, где в первой строчкой установили соединение с базой данных.
---3.1) Выполняем запрос к базе данных. Лично я текст запроса заношу в отдельную переменную. Далее выполняю запрос к базе. И извлекаю данные (если это, например, запрос на выборку).
PHP:
$query = "Текст запроса";
$result = $connection->query($query);
if (!$result) {die($connection->error); $connection->close(); exit();};
$myrow = mysqli_fetch_array($result);
Так вот. В какой момент:
------3.1.1) уже можно закрывать соединение с базой данных? Допустим выполняется только один запрос и всё.
------3.1.2) нужно закрывать соединение с базой данных?
---3.2) Что происходит с соединение с базой данных, если его не закрыть и:
------3.2.1) php будет полностью выполнен
------3.2.2) прекратить выполнение php командой exit();
------3.2.3) в другом php файле открыть ещё одно соединение с базой данных?
---------3.2.3.1) Влияют ли как-то в данном случае на ситуацию команды require_once и require при подключении файла соединения с базой данных?
---------3.2.3.1) А если не используется единый файл подключения к базе данных, и код подключения каждый раз пишется по новой, что будет с незакрытым соединением и открытием ещё одного? И ещё?
---3.3) Что происходит с памятью под переменные, если эту память не освободили?
---3.4) При работе с базами данных есть команда mysqli_free_result(); В чём её отличие от unset();?
---3.5) Какова правильная логика написания запросов на удаление\добавление данных при обилии этих данных.
------3.5.1) Первый случай. Есть массив, содержащий ИД всех тех записей, которые нужно удалить. Как наиболее правильно и рационально удалить все эти записи?
---------3.5.1.1) Получается, что единственное, что остаётся, это удалять по одной записи, перебирая в цикле по одному ИД из массива?
------3.5.2) Второй случай. Есть таблица с уже забитыми в неё данными. Запросом нужно извлечь все эти данные и записать в другую таблицу, присвоив каждой записи исходной таблицы один ИД. Получается что нужно получить все записи из первой таблицы и перебирая по одной вставлять в новую таблицу, присваивая каждой ИД (речь идёт не об AI)?
---3.6) Мультизапросы. Часто бывают ситуации, когда нужно добавить полученные данные по частям в разные таблицы базы данных. Самое простое - это форма, где указываются ФИО, папортные данные, адреса, телефоны, какие-то предпочтения, примечания. И все эти данные после получения нужно записать в разные таблицы. Как тут лучше быть?
------3.6.1) Использовать обычные запросы на каждую таблицу?
PHP:
$query="Текст запроса";
$connection->query("LOCK TABLES Имя_таблицы Write");
$result=$connection->query($query);
if (!$result) {die($connection->error); $connection->close(); exit();};
$connection->query("UNLOCK TABLES Имя_таблицы Write");
------3.6.2) Или мультизапросы?
---------3.6.2.1) И лучше ли их использовать? В плане скорости выполнения скрипта, обработки запросов этих базой данных?
---------3.6.2.1) Если ли у кого-нибудь опыт использования этих запросов?
---3.7) Приведённый в пункте 3.6.1 код содержит команды LOCK TABLES и UNLOCK TABLES. В частности команда UNLOCK TABLES - когда её нужно использовать? В смысле, сразу после $result=$connection->query($query); или проверки успешности выполнения запроса?
4) Меня также интересуют вопросы касательно производительности и скорости выполнения php. Конкретных вопросов у меня тут нет, но хотелось бы услышать какие-то наставления по этому поводу от опытных программистов.
5) Вопрос такой же, как и №4 выше, но касательно работы с базами данных mysql. Что скажете?
6) Любые другие советы и т.п. по вопросам, которые я мог и пропустить, но которые явно важны и актуальны.

Надеюсь, что получу ответы на свои вопросы. Всем ответившим - огромное спасибо!
 

Фанат

oncle terrible
Команда форума
Уважаю такую любознательность.

1. Вопрос в данной формулировке не имеет смысла. ООП - это не "стиль", а способ мышления и построения программной архитектуры. его ничем заменить нельзя, но изучить очень сложно. Пока можешь даже не пытаться.
На самом деле вопрос должен звучать так: "Для ничтожного количества модулей пхп доступны два стиля написания одних и тех же команд... и далее по тексту". Ответ:
Взялось это оттого, что кому-то сильно было делать нечего. Смешивать можно, но нежелательно. Использовать лучше ООП-стиль, потому что короче и надо сразу привыкать к хорошему.
 

Фанат

oncle terrible
Команда форума
3.1 Код в вопросе смешной. die($connection->error); $connection->close(); exit(); - подумай над ним хорошенько и сам догадайся, почему это смешно.
3.1.1) Когда соединение не нужно.
3.1.2) Никогда. За исключением очень редких случаев, которые тебе в ближайшее время точно не встретятся.
3.2.1) оно закроется
3.2.2) оно закроется
3.2.3) в другом php файле откроется соединение с базой данных
3.2.3.1) нет
3.2.3.1) см 3.2.1
 

Фанат

oncle terrible
Команда форума
Перед прочтением дальнейшего сначала читаем http://phpfaq.ru/na_tanke

---3.3) она остается занятой до окончания работы скрипта.
---3.4) в данном случае практической разницы нет.
 

Фанат

oncle terrible
Команда форума
3.5.1) в mysql есть оператор in(). второй вариант - prepared statements.
3.5.2) в mysql есть оператор SELECT ... INSERT. Но скорее всего это не нужно, а задача такая возникла от неграмотности.
 

Фанат

oncle terrible
Команда форума
4) просто забудь об этом вопросе. Ничего умного все равно не узнаешь, а код себе испортишь.
5) индексы и EXPLAIN
6) Нельзя объять необъятное. Тем более что твои представления о важности вопросов весьма далеки от реальности. практически ни один из заданных тобой не имеет ни малейшего практического значения.
 

Фанат

oncle terrible
Команда форума
3.7) в данном случае значения не имеет. при завершении пхп скрипта закроется и соединение с БД, и лок снимется.
 

Фанат

oncle terrible
Команда форума
Ещё по поводу mysqli.
1) За die c ошибкой надо отрубать руки. Забудь о существовании такой конструкции.
2) проверять каждый запрос на успешность не нужно. Надо в самом начале выставить режим выборса исключений.
3) mysqli напрямую нельзя использовать. Надо что-то другое, например PDO.
 

Фанат

oncle terrible
Команда форума
2.1) немного
2.2.1) объем памяти, занятый пхп-скриптом, не изменится. Однако другие переменные в скрипте смогут использовать этот объем повторно.
2.2.2) то же самое
2.2.3) Вся память освободится
 
3.1 Код в вопросе смешной. die($connection->error); $connection->close(); exit(); - подумай над ним хорошенько и сам догадайся, почему это смешно.
Возможно потому что die это тот же самый exit. И, наверное, можно написать всё это как: die($connection->error->close()). Или нельзя стразу так? upd. Учитывая дальнейшие ваши ответы (ответы на пункты 3.2.1-3.2.2) можно смело писать die($connection->error);
---3.3) она остается занятой до окончания работы скрипта.
---3.4) в данном случае практической разницы нет.
Иными словами, после завершения выполнения php вся занятая под переменные память освобождается автоматически? Ну да, получается что так.
3.5.1) в mysql есть оператор in()
Т.е получится как-то так? Например, есть массив $id_orders , содержащий ИД, по которым нужно удалить из базы.
PHP:
$id_orders=[1,2,3,4,5,6,7,8,9,10,11,12,14,15]
$query = "DELETE FROM orders WHERE id_orders in('$id_orders')";
$result = $connection->query($query); //Выполняем запрос и заносим в переменную результат запроса
if (!$result) {die($connection->error);};
второй вариант - prepared statements.
А это интересный вариант. Нужно будет изучить.
3.5.2) в mysql есть оператор SELECT ... INSERT. Но скорее всего это не нужно, а задача такая возникла от неграмотности.
Это действительно пример из задачи, которую я решил следующим способом (может и нелепым). Сначала описание задачи:
На странице имеется три кнопки, при нажатии на одну из которых следует записать для выбранного предварительно обращения и выбранного до этого клиента (У клиента есть обращения, у обращений есть заказы)... следует записать набор стандартных заказов (в моём случае генов для генотипирования; да-да, я генетик).
Таблица orders (заказы) имеет поля:
orders.id_orders, - AI
orders.id_handlings, - ИД выбранного обращения
orders.id_gens, -ИД гена, который заказан для генотипирования
orders.id_gens_groups, - ИД группы, к которой относится заказанный ген
orders.id_genotypes, - ИД генотипа (результата исследования)
orders.id_staff, - ИД Сотрудника, который провёл анализ
orders.consider_cost - бесплатно\платно
В подготовленной отдельно таблице button_gens для каждой кнопки уже записаны id_gens и id_gens_groups, которые я буду вставлять в таблицу orders
button_gens.id_button_gens, - AI
button_gens.id_button_names, - ИД кнопки
button_gens.id_gens,
button_gens.id_gens_groups
Таким образом я выбираю из таблицы button_gens все button_gens.id_gens и button_gens.id_gens_groups для определённой кнопки и записываю каждую полученную мною строку (запись) в таблицу orders, НО не просто записываю, а записывая ещё и для каждой этой записи .id_handlings - ИД выбранного обращения.
Как это реализовать иначе я не знаю.
3.6.1) да
3.6.2) нет
3.6.2.1) нет
3.6.2.1) да
И чем же так плохи мультизапросы? У вас, вижу, сложилось плохое о них впечатление.
5) индексы и EXPLAIN
EXPLAIN - интересно. Изучу. Попробую.
А насчёт индексов не понял...
практически ни один из заданных тобой не имеет ни малейшего практического значения.
А что имеет? Что действительно важно знать и на что обращать внимание и т.п.?
1) За die c ошибкой надо отрубать руки. Забудь о существовании такой конструкции.
Так а как правильно будет?
2) проверять каждый запрос на успешность не нужно. Надо в самом начале выставить режим выборса исключений.
Можно пример какой-то?
3) mysqli напрямую нельзя использовать. Надо что-то другое, например PDO.
Почему нельзя напрямую использовать? О_О
 

Фанат

oncle terrible
Команда форума
Т.е получится как-то так? Например, есть массив $id_orders , содержащий ИД, по которым нужно удалить из базы.
Ну, идея верная, реализацию тебе придется пару раз подправить, чтобы исправить очевидные ошибки.
Сначала описание задачи:
Общая идея баз данных такая: в подавляющем большинстве случаев данные лежат всегда на одном месте и никуда не двигаются. Если надо поменять им статус, то это делается посредством специального поля.
Вторая общая идея баз данных заключается в том, что бд должна хранить только атомарные данные - никаких ид через запятую. И никакого дублирования. то есть, если ид уже где-то перечислены, то никуда копировать их не надо ,надо только ставить ссылку. учше этот вопрос задать отдельно
 

Фанат

oncle terrible
Команда форума
И чем же так плохи мультизапросы? У вас, вижу, сложилось плохое о них впечатление.
нет, не плохое. Просто это сложнее чем обычные запросы по очереди, при том что нет ни малейшего повода менять одно на другое.

по поводу mysqli - там фишка в том, что надо всегда использовать подготовленные выражения
а они mysqli ОЧЕНЬ неудобны в использовании.
поэжтому лучше сразу переходиьт на PDO.
Ну или какую-нибудь другую библиотеку
 

Фанат

oncle terrible
Команда форума
переходиьт на PDO
Насколько я понимаю, вы говорите вот об этом - http://php.net/manual/ru/ref.pdo-mysql.php
Но как я понял (отсюда) расширение PDO уже внедрено в php (я использую xampp с PHP 7.0.1)
Apache 2.4.18, MariaDB 10.1.9, PHP 7.0.1, phpMyAdmin 4.5.1, OpenSSL 1.0.1, XAMPP Control Panel 3.2.1, Webalizer 2.23-04, Mercury Mail Transport System 4.63, FileZilla FTP Server 0.9.41, Tomcat 7.0.56 (with mod_proxy_ajp as connector), Strawberry Perl 7.0.56 Portable

Т.е. по сути это аналог mysqli?
Почитал документацию. Ничего такая вещь. Надо изучать. Особенно понравилось про транзакции.
Эх, столько кода перефигачивать... Но это и хорошо, наверное, потому что я хочу делать всё правильно. Тем не менее - почему так уж плох mysqli по сравнению с PDO
по поводу mysqli - там фишка в том, что надо всегда использовать подготовленные выражения
Почему это так важно?
 
проверять каждый запрос на успешность не нужно. Надо в самом начале выставить режим выброса исключений.
А можете привести пример? Например:

PHP:
$query="INSERT INTO clients (id_clients, surname, name, middle_name, gender, birth_year) VALUES (DEFAULT, '$surname', '$name', '$middle_name', '$gender', '$birth_year')";
$connection->query("LOCK TABLES clients Write");
$result=$connection->query($query);
if (!$result) {die($connection->error);};
$connection->query("UNLOCK TABLES clients Write");
 

Фанат

oncle terrible
Команда форума
Для начала разберись, нужно ли тебе лочить таблицу
 
Сверху