Задать вопрос
mikiveyn
@mikiveyn

При sql запросе писать с кавычками или без?

Добрый вечер всем. Я только начинаю изучать PHP и читаю стати по по запросам к базе данных. И в зависимости от источника примеры пишут по разному . Например так :
$query = 'SELECT * FROM `USERS`';
Или так:
$result = mysql_query("SELECT last_name FROM first_table WHERE name='$name'",$db);

Прошу помочь разобраться в вопросах :
1) Как безопаснее и правильней писать имя таблицы и базы с кавычками или без кавычек . Если с кавычками то с двойными или одинарными.
2) $name нужно писать с кавычками или без кавычек?
Я так понимаю, что если написать не правильно, то сильно возрастает угроза sql аипки
  • Вопрос задан
  • 1525 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
sptm
@sptm
software developer / DevOps engineer
Безопаснее и правильнее использовать PDO или MySQLi вместо устаревших mysql_ - функций.
Ну, и с обоими вариантами нужно использовать подготовленные запросы вместо того, чтобы писать их вручную.

Получится что-то вроде этого:
$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt)

$stmt = $pdo->prepare("SELECT last_name FROM first_table WHERE name=?");
$stmt->execute([$name]);
$last_name = $stmt->fetchColumn();
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@galaxy
1) Как безопаснее и правильней писать имя таблицы и базы с кавычками или без кавычек . Если с кавычками то с двойными или одинарными.

Это не кавычки, а обратные апострофы (backticks).
Правильнее - в апострофах. Без них нельзя использовать многие зарезервированные слова в именах таблиц/колонок/пр., а также ограничен набор символов. С апострофоми можно делать так:
SELECT * FROM `select` WHERE `select`.id > 100;
SELECT * FROM `a b`;
CREATE TABLE `a``b` (`c"d` INT);
select * from tablename group by `group`;
Ответ написан
@Akina
Сетевой и системный админ, SQL-программист.
1) Как безопаснее и правильней писать имя таблицы и базы с кавычками или без кавычек . Если с кавычками то с двойными или одинарными.


В MySQL используется три разных типа кавычек.

1. Прямая кавычка '

Используется для обрамления литералов, требующих такого обрамления, а именно: строковые, даты-времени, JSON, компоненты имени учётной записи и пр. Подробнее см. Literal Values и Specifying Account Names

2. Обратная кавычка `

Используется для обрамления имён объектов (БД, таблиц, полей, имён функций/процедур и пр.).

Если имя объекта не содержит нелегитимных символов (подробнее см. Schema Object Names), не является служебным или зарезервированным словом (см. Keywords and Reserved Words), использование обратной кавычки опционально, иначе обязательно.

3. Двойная кавычка "

Используется для обрамления строковых компонентов (имя, значение) для типа данных JSON (внутри строкового литерала с JSON-значением, ограниченного одинарными кавычками). Допускается использование вместо одинарной кавычки для обрамления литералов.

При включённом ANSI_QUOTES в SQL Mode указанные использования отменяются, и двойная кавычка используется для обрамления имён объектов (т.е. дублирует использование обратной кавычки).

ИТОГО с точки зрения безопасности:

- имена объектов ВСЕГДА обрамлять ТОЛЬКО обратной кавычкой
- литералы, требующие обрамления - обрамлять ТОЛЬКО одинарной кавычкой
- двойную кавычку использовать ТОЛЬКО как символ в составе литерала (строкового, JSON)
Ответ написан
ZykaMyzyka
@ZykaMyzyka
1) безопаснее с кавычками - так говорит препод по бд (почему не спрашивал, преподает уже больше 10 лет)
2) писать с кавычками - вы же сравниваете атрибут таблицы с определенными именами, а не другим атрибутом
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы