Правильный способ организации MySQL-запросов в коде?

62
5

Мне нужны идеи, чтобы сделать мой код немного более чистым для довольно простого приложения с простой базой данных. У меня есть следующая идея, но она работает не очень хорошо. Это то, что я делаю:


У меня есть много запросов на странице (занимает много места, а исходный код выглядит беспорядочно. Я хотел бы иметь индекс из них в другом PHP файле, который я мог бы вызвать через include.


Кроме того, я столкнулся с проблемой. У меня есть запрос, который выглядит так на внешней php-странице.


Queries.php:


$RegisterQuery = sprintf("INSERT INTO `testdb`.`users` (
`user_id`,
`username`,
`password`,
`First Name`,
`Last Name`,
`email`)
VALUES (
NULL,
'%s',
'%s',
'%s',
'%s',
'%s'
);",
mysql_real_escape_string($username),
mysql_real_escape_string($password),
mysql_real_escape_string($first_name),
mysql_real_escape_string($last_name),
mysql_real_escape_string($email));

Проблема заключается в том, что даже когда я не запрашиваю $RegisterQuery с mysql_query(), он генерирует кучу предупреждений MySQL об использовании mysql_real_escape_string() и о том, как он не может подключиться. Я не понимаю, как это делается, когда я даже не запрашиваю базу данных!


И снова я мог легко игнорировать предупреждения...


Я просто не уверен, что я делаю это правильно, и в этом случае я в основном хочу спросить, есть ли лучший способ сделать это или я должен просто игнорировать предупреждения?


Ваше мнение очень ценится! Спасибо заранее.

спросил(а) 2021-01-19T15:48:35+03:00 2 месяца, 3 недели назад
1
Решение
87

Я бы предложил использовать параметризованные запросы (через, например, mysqli или PDO).

Вам не нужно избегать строк, если они являются параметрами запроса. Это делает код более понятным, а также упрощает запись защищенного кода, так как гораздо менее вероятно, что вы оставите уязвимость SQL-инъекций, если будете последовательно использовать параметризованные запросы.

ответил(а) 2021-01-19T15:48:35+03:00 2 месяца, 3 недели назад
75

Для функции mysql_real_escape_string требуется подключение к базе данных. От php.net:


Перед использованием mysql_real_escape_string() требуется соединение MySQL, иначе возникает ошибка уровня E_WARNING и возвращается FALSE. Если link_identifier не определен, используется последнее соединение MySQL.

Если соединение с базой данных не существует, оно будет возвращать значение false, поэтому не выполняется экранирование, а возвращаемое значение не соответствует ожидаемому.

ответил(а) 2021-01-19T15:48:35+03:00 2 месяца, 3 недели назад
62

Думаю, вам нужно переосмыслить свое решение. Хотя вы можете подумать, что это "грязный", чтобы иметь эти запросы в исходном коде, будущий сторонник этого кода собирается вытащить свои волосы, когда ему приходится переключаться на другой файл каждый раз, когда он хочет изучить логику базы данных на конкретная точка.


Что касается ваших ошибок с mysql_real_escape_string, функция использует сервер MySQL, потому что ей необходимо избежать строки относительно набора символов активного соединения БД.

ответил(а) 2021-01-19T15:48:35+03:00 2 месяца, 3 недели назад
44

mysql_real_escape_string выполняет вызов сервера базы данных.


Вместо вызова mysql_real_escape_string при создании запроса вызовите его непосредственно перед выполнением запроса.


Однако в идеале вы должны использовать параметризованные запросы.

ответил(а) 2021-01-19T15:48:35+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема