Php запрос с кавычками

Как правильно писать mysql запрос?

В интернете, в примерах, в различных учебниках можно найти незначительно отличающийся синтаксис mysql запроса. А именно кавычки ‘ ` или их отсутствие.

Пример кода из php файла в кодировке utf-8 без bom

$result=$mysqli->query("SELECT `id` FROM `user_settings` where `user_id`=$user_id") or die (mysql_error());

Методом научного тыка выяснено, что можно писать и с кавычками `user_settings` и без user_settings.
И так `user_id`=$user_id и так `user_id`=’$user_id’. Но это не точно (может связь с кодировкой?).
(Если что про двойные-одинарные кавычки в php всё знаю)

Скажите, пожалуйста, а как правильно писать mysql запрос и зачем нужны эти кавычки?

be_a_dancer

Кавычки экранируют символы.
`обратные кавычки` используются тогда, когда тебе необходимо экранировать название столбца, если оно совпадает с зарезервированным ключевым словом.
‘Одинарные кавычки’ следует использовать, когда ты пишешь даты и строки.
«Двойные кавычки» следует использовать для написания непосредственного запроса.

"SELECT `name`, `email`, `registered_at` FROM users WHERE registered_at BETWEEN '23-12-2018' AND '26-12-2018'"

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

logpol32

То есть в общем и целом можно прийти к такому выводу:
1) Всегда использовать `обратные кавычки` для названий объектов БД — баз, таблиц, столбцов.
Ведь проблемы с зарезервированными словами никому не нужны. Хотя называть таблицы или что-то ещё зарезервированными словами я, разумеется, не буду.
+Повышение безопасности от возможных sql инъекций (хотя вопрос безопасности отдельная тема) и нужно всегда осуществлять фильтрацию данных.

2) Всегда использовать ‘одинарные кавычки’ для значений объектов БД, например значений столбца. Ведь в переменной может быть строка.
Я прав?

//$user_id='123 1223 444'; "SELECT `id` FROM `user_settings` where `user_id`='$user_id'"

Источник

Экранирование кавычек в php, javascript и sql

Экранирование кавычек в php, javascript и sql

Здравствуйте, уважаемые читатели блога LifeExample, сегодня я бы хотел раскрыть тему экранирования кавычек в php, javascript и sql, рассказать что это такое и зачем нужно, а также привести несколько полезных примеров показывающих необходимость экранирования.

Что такое экранирование кавычек

Чтобы дать определение этому понятию, для начала приведу небольшой пример объявления строки.

Практически в любом языке программирования мы используем следующий принцип объявления строковой переменной:

Все, что содержится между кавычек — понимается интерпретатором как строка.

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

Читайте также:  Text field in java swing

то произойдет ошибка, поскольку вместо одной строки интерпретатор увидит две:

а между ними неизвестный ему оператор – lifeexample.ru .

Чтобы такого не происходило необходимо экранировать кавычки. В javascript, например, это будет выглядеть таким образом:

После данного практического примера можно дать определение понятию экранирования кавычек.

Экранирование кавычек – это действие, совершаемое над строковой переменной в ходе работы скрипта. Действие это позволяет использовать кавычки в строке. Частным но довольно распространенным способом экранирования является подстановка обратного слеша \ перед внутренними кавычками.

Php экранирование кавычек

В php экранировать кавычки можно несколькими способами, первый из них аналогичен рассматриваемому выше.

Например, мы имеем строку с авторской и прямой речью, которая содержит кавычки:

«Как же вы поживаете?» – спросила Екатерина Ивановна. «Ничего, живем понемножечку», – ответил Старцев (Чехов)

Чтобы вывести ее на страницу, в PHP следует делать одним из следующих способов.

Экранирование обратным слешем:

echo » \» Как же вы поживаете? \» – спросила Екатерина Ивановна. \» Ничего, живем понемножечку \» , – ответил Старцев (Чехов)» ;

Экранирование одинарными кавычками

echo ‘»Как же вы поживаете?» – спросила Екатерина Ивановна. «Ничего, живем понемножечку», – ответил Старцев (Чехов)’ ;

В случае, когда внутренних кавычек в строке много проще при объявлении строки использовать одинарные кавычки, а внутри нее двойные. Либо, наоборот, в зависимости от наличия в тексте тех или иных кавычек.

Зачем может понадобиться экранирование кавычек в PHP

Помимо разобранного примера с выводом строк, экранирование кавычек и других спец символов зачастую необходимо при работе с БД.

Чтобы не допустить, различного рода проблем при работе с базой данных, перед сохранением данных в таблицы можно использовать функцию addslashes

$item = «Zak’s and Derick’s Laptop» ;
$escaped_item = mysql_real_escape_string ( $item ) ; \\Escaped string : Zak\ ‘s and Derick\’s Laptop
?>

Обе эти функции являются стандартными в php и экранируют спецсимволы строк. Когда и какую использовать, зависит от конкретных задач. Например addslashes лучше использовать для сериализованной строки при записи ее в базу, а mysql_real_escape_string для всех пользовательских данных пришедших с формы на сайте.

В небольших web-приложениях, можно не использовать ручное экранирование addslashes или mysql_real_escape_string если включить «Магические кавычки» — magic_quotes_gpc

Зачастую магические кавычки включены по умолчанию на сервере, это можно узнать из информацией полученной при выполнении функции

javascript экранирование кавычек

Очень часто, особенно в javascript приходится работать со строками, содержащими HTML разметку.

В javascript экранирование кавычек происходит аналогичным образом, либо обратным слешем, либо использованием разного типа кавычек.
Пример с обратным слешем:

Пример с внутренними кавычками:

Когда строка с HTML разметкой слишком длинная и требует переноса строки, снова появляется необходимость экранирования, в этом случае уже не кавычек, а символа переноса строки

Если в данном примере не использовать обратный слешь перед переносом строки, то скрипт работать не будет.

Довольно редко, но можно столкнуться с задачей передать HTML разметку в сериализованной строке формата JSON. Если строка содержит символы переноса, то формат JSON будет нарушен.

Читайте также:  Java get class constants

Чтобы избежать этих проблем нужно прогнать текст с переносом строк через функцию JSON.stringify()

JSON.stringify() – доступна только после подключения библиотеки jquery.

Sql экранирование кавычек

В sql экранирование кавычек помимо разобранных нами в php и js способов — обратного слеша и внутренних кавычек, имеет еще одно решение.

Для экранирования кавычки в sql нужно их дублировать.

Убрать экранирование кавычек

Убрать экранирование кавычек в php можно стандартной функцией stripslashes();

В javascript не существует аналога stripslashes, но ведь мы всегда можем воспользоваться регулярным выражением, которое поможет нам убрать экранирование кавычек в javascript

В данной статье я постарался раскрыть тему экранирования кавычек в php, js, mysql и показать в каких случаях необходимо применять экранирование. Надеюсь, статья оказалась полезной. Подписывайтесь на рассылку, ставьте лайки, добавляйтесь в друзья 😉

Читайте также похожие статьи:

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Источник

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

Добрый вечер всем. Я только начинаю изучать PHP и читаю стати по по запросам к базе данных. И в зависимости от источника примеры пишут по разному . Например так :
$query = ‘SELECT * FROM `USERS`’;
Или так:

$result = mysql_query("SELECT last_name FROM first_table WHERE name='$name'",$db);

Прошу помочь разобраться в вопросах :
1) Как безопаснее и правильней писать имя таблицы и базы с кавычками или без кавычек . Если с кавычками то с двойными или одинарными.
2) $name нужно писать с кавычками или без кавычек?
Я так понимаю, что если написать не правильно, то сильно возрастает угроза sql аипки

sptm

Безопаснее и правильнее использовать 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();

mikiveyn

Большое спасибо за интерес к моему вопросу. Я так понимаю знаком вопроса указывается где должна быть переменная. А сама переменная указана в строке
$stmt->execute([$name])
А как указать две и более переменные ?

sptm

Дима, да, все верно. Если переменных две или больше, просто передавайте в execute() массив со всеми этими переменными, как-то так:

$stmt = $pdo->prepare("SELECT last_name FROM first_table WHERE name=? AND age=?"); $stmt->execute([$name, $age]);

mikiveyn

Ещё раз спасибо за ответ. У меня последний уточняющий вопрос. В ваших примерах таблицы указаны без кавычек. Если я их укажу с кавычками это будет ошибкой?

sptm

Дима, заключать имя таблицы в кавычки не имеет никакого смысла. Если хочется все сделать правильно, заключайте имена таблицы в обратные апострофы ( ` ) — это, как правильно замечено в одном из ответов, позволит использовать многие зарезервированные слова в качестве имен таблиц. Но в целом, имя таблицы без апострофов — не ошибка.

Читайте также:  Содержит ли строка символ javascript

И еще: не забывайте отмечать правильные ответы на ваши вопросы решением 🙂

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`;

mikiveyn

Спасибо за интерес к моему вопросу. А использование этих апострофов не увеличивает шанс sql инъекции ?

Дима, нет, ни кавычки, ни апострофы вообще никакого отношения не имеют к sql инъекциям. Инъекция потенциально возникает, когда вы непроверенные данные (полученные от пользователя, например) подставляете в запрос. Применительно к наименованиям таблиц и колонок эта ситуация встречается редко — обычно таблицы и колонки выбирает программист.

ipatiev

galaxy, не нужно вообще вводить лишние понятия, такие как «непроверенные данные» или «данные от пользователя». Источник происхождения данных не имеет никакого значения.
поэтому надо просто написать, «Инъекция потенциально возникает, когда вы данные подставляете в запрос.» И дальше сделать простой, как две копейки вывод: не подставлять данные в запрос, а отправлять их отдельно, как показано в ответе Сослан Алдатов

1) Как безопаснее и правильней писать имя таблицы и базы с кавычками или без кавычек . Если с кавычками то с двойными или одинарными.

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

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

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

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

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

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

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

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

Источник

Оцените статью