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

fixxxer

К.О.
Партнер клуба
Для единичного запроса в транзакции смысла нет.
Транзакции нужны, грубо говоря, когда ты делаешь несколько связанных запросов, таких, что выполнение только части их приведет к неконсистентному состоянию.

И всегда создавай таблицы с типом InnoDB (если у тебя свежий mysql, то так будет по умолчанию). MyISAM - это бесполезная фигня (на самом деле иногда полезна, но пока лучше считать так).
 

fixxxer

К.О.
Партнер клуба

fixxxer

К.О.
Партнер клуба
Да, если тебя действительно интересует, как происходит управление памятью в php, как на "физическом" уровне все устроено, можешь почитать, если осилишь, тут: https://nikic.github.io/ - там где PHP's Source Code for PHP Developers.

Но вообще об этом особо задумываться не надо, не на ассемблере пишешь - php так и устроен, чтобы в 99% случаев ты об этом вообще не задумывался.
 
можешь почитать, если осилишь
Спасибо)

ты об этом вообще не задумывался.
Тоже правда)

Кстати, мои сегодняшние открытия, поиски и т.п. вот меня к чему привели.
Ну, во-первых, вот вы, например, на домашнем\рабочем компьютере явно же используете apach и т.п. Можно руками всё настраивать. Или сборку поставить, типа xampp или denver.
Так вот, чем вы пользуетесь? И используете MySQL или MariaBD. Ну или ещё что-то...
 

Фанат

oncle terrible
Команда форума
мы давно уже сборками не пользуемся.
Но тебе удобнее будет со сборкой.

мария или мускул - абсолютно без разницы.

но опять же, это все не те вопросы. они просто от балды.
учись задавать вопросы не из пальца высосанные, а идущие от практики, от конкретных проблем.
 
то все не те вопросы
ну, например на конкретный вопрос так ответа и не было (тут).
Максимум что сейчас могу изменить, так это использовать для записи каждой строчки использовать подготавливаемые запросы. Что-то тоже неплохо, конечно. В остальном коде местами тоже нужно будет переделать под это.
Там, кстати, все проще.
Спасибо. Попробую разобраться.
 

fixxxer

К.О.
Партнер клуба
$query="INSERT INTO clients (id_clients, surname, name, middle_name, gender, birth_year) VALUES (DEFAULT, '$surname' ...
А если моя фамилия Д'Артаньян, что будет? ;)
Правильно, фигня будет, некорректный запрос. В частности, SQL injections - это эксплуатация того, что программа некорректно собирает запросы.
Чтобы при ручном составлении запроса все было корректно, данные надо форматировать в соответствии с синтаксисом sql. Для форматирования строк, например, есть PDO::quote() и mysqli_real_escape_string (отличаются тем, что PDO сам окружит строку одинарными кавычками, а mysqli - нет).
И чтобы написать корректно, получается куча приседаний.

А prepared statements как раз и нужны для того, чтобы "разметить" запрос плейсхолдерами для данных, и отдельно в базу передать "шаблон" запроса, отдельно - данные. (я тут умышленно упрощаю, в ряде случаев это работает иначе).
 
А если моя фамилия Д'Артаньян, что будет?
Вот же блин)) Ага, про это я не подумал... Ну, можено же будет просто написать функцию, которая будет возвращать пропущенные таким способом данные
PHP:
function fix($var) {
$var = $connection->real_escape_string($var);
return $var;
}
А при получении переменных пропускать через эту функцию
$id_clients=fix($_POST['id_clients']);
Или нет?
отличаются тем, что PDO сам окружит строку одинарными кавычками, а mysqli - нет
Да, про это уже прочитал...
Про раздельную отсылку тоже сегодня читал. Но, например, если один запрос только и т.п. - смысла использовать нет.
 

fixxxer

К.О.
Партнер клуба
Смысл использовать есть. Как раз в том, что с prepared statements никакая обработка данных, типа твоей fix(), не нужна
 
Ладно. За сегодня у меня слишком много информации)) Надо всё обдумать, взвесить, ещё раз изучить.

Раньше просто сделал базу данных на Access для лаборатории, но, как оказалось, это была не самая лучшая идея))) Жуть жуткая.
Теперь вот (а та пусть горит синим пламенем) работаю потихоньку над новой. Решил делать с MySQL и php. А клиентская часть - html + css + jQuery с ajax. И по сети доступ.
Трясусь так над правильностью и производительностью, т.к. с Access было много гемора. И сейчас есть. Поэтому делать всё стараюсь грамотно и спокойно.
Хотя, может я и зря заморачиваюсь. Никаких 100.000 записей в таблицы в день или месяц у нас в лаборатории нет За год в таблице с заказанными генами для генотипирования около 35.000 записей. В остальных основных меньше намного - примерно раз в 10-9. Но тут крайне важна стабильность работы. И сохранность данных. Ну и ещё много чего. Сам я сотрудник этой лаборатории.
 

AnrDaemon

Продвинутый новичок
Раньше просто сделал базу данных на Access для лаборатории, но, как оказалось, это была не самая лучшая идея))) Жуть жуткая.
Мой первый проект на PHP с БД использовал именно Access через ODBC.
До сих пор работает, не ломается, каши не просит.
Только иногда приходится загрузить БД в акцесс и сделать упаковку, чтобы не сильно распухала.

Трясусь так над правильностью и производительностью
Не трясись. Всё равно всё сделаешь неправильно (см. выше), так что просто делай. Для начала, чтобы хотя бы просто работало.
Это не значит, что надо просто забить на всё, или менять подходы по два раза на дню, переписывая весь проект.
Как только ты понял, что именно ты делаешь неправильно, ты уже не будешь так делать в следующем проекте.
 

AnrDaemon

Продвинутый новичок
Но так получится два запроса к серверу. Точнее две отправки...
Ну и что?…
У вас, я смотрю, синдром преждевременной оптимизации наблюдается.
То же самое с лочкой таблиц.
Да, у вас 4 запроса, ДАЛЬШЕ ЧТО?… Что будет с БД, если вы выполните только один из них?
Всегда задавайте себе вопрос "ну а дальше-то что?" Очень много нервов и телодвижений сэкономите.
 

Фанат

oncle terrible
Команда форума
Но так получится два запроса к серверу. Точнее две отправки...
Вот как раз в случае с PDO - не будет.
Впрочем, на PDO свет клином не сошелся. можно использовать любые другие библиотеки, если они позволяют добавлять переменные в запрос не напрямую и упрощают код.
Можешь использовать safemysql.
причем переход на нее может быть плавным - сразу после коннекта к mysqli можешь создать инстанс safemysql и передать в нее $mysqli.
и дальше можешь использовать ее наряду со старым кодом, постепенно переписывая его

PHP:
$connection = ...
$db = new SafeMySQL(['mysqli' => $connection]);
и теперь запрос на удаление с массивом будет простым и безопасным:

PHP:
 $id_orders=[1,2,3,4,5,6,7,8,9,10,11,12,14,15]
$db->query("DELETE FROM orders WHERE id_orders in(?a)", $id_orders);
 
Сверху