Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Tolick
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 144
#1

Обычные mysql запросы

27.11.2017, 19:34. Просмотров 856. Ответов 19
Метки нет (Все метки)

Есть ли различия между этими двумя запросами?
SQL
1
2
mysql_query('SELECT * FROM table WHERE id="'.$id.'"');
mysql_query("SELECT * FROM table WHERE id='$id'");
Если есть, то какой лучше и почему?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2017, 19:34
Ответы с готовыми решениями:

MySQL запросы
Начинаю изучать PHP + MySQL. Как уменьшить нагрузку на БД? Я думаю что надо...

Запросы mysql
Решил создать запрос, но на выходе получил ошибку #1064 CREATE...

Mysql запросы.
Добрый день, я с PHP и Mysql работаю не очень долго, возникла проблема....

Множественные запросы в MySQL
Нужно изменить значение поля в базе данных, для этого написана процедура....

$_GET и запросы Mysql
Добрый день! Мне нужна помощь по такому вопросу: Я создаю сайт турагенства(не...

19
Phantom-84
239 / 198 / 58
Регистрация: 15.09.2017
Сообщений: 949
27.11.2017, 19:58 #2
Ну выведите строку запроса и посмотрите

Для SQL одинарные кавычки являются родными, Для MySQL - разницы нет.

С другой стороны в PHP строки в одинарных кавычках обрабатываются быстрее, но в них нельзя использовать имена переменных, поэтому в первом случае используется объединение строк. А двойные кавычки MySQL, чтобы не экранировать одинарные.

Добавлено через 4 минуты
Я чаще использую первый вариант, но это абсолютно ничего не значит. У нас ведущие программисты предпочитают его, поэтому я вынужден подстраиваться.
0
Tolick
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 144
27.11.2017, 20:12  [ТС] #3
Спасибо за исчерпывающий ответ. Но вот еще вопрос, читал везде что абсолютная безопасность от SQL иньекций это PDO (Подготовленые запросы), но я вот не пойму, если я например в этом же запросе
SQL
1
mysql_query('SELECT * FROM table WHERE id="'.$id.'"');
переменную $id сначала проведу через свои функции что бы экранировать кавычки и убрать всякий бред, а только потом запущу запрос, то это то же самое что подготовленые запросы PDO ?
0
Phantom-84
239 / 198 / 58
Регистрация: 15.09.2017
Сообщений: 949
27.11.2017, 20:25 #4
Да. Подготовленные запросы примерно так и работают плюс там можно один раз указать шаблон запроса, а потом многократно его выполнять с разными фактическими данными, но это тоже легко реализуется.

Добавлено через 4 минуты
PDO и подготовленные запросы - это не одно и то же. Подготовленные запросы есть, например, в mysqli.
0
Tolick
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 144
27.11.2017, 20:30  [ТС] #5
Понял, а если делать такую проверку, типо если в переменной $id будет слово "INSERT" или "SELECT" то выбить ошибку, или экранирование кавычек будет достаточно?

Добавлено через 1 минуту
Я просто не пойму зачем использовать и учить это PDO если есть в php функции которые экранируют теги и кавычки
0
Phantom-84
239 / 198 / 58
Регистрация: 15.09.2017
Сообщений: 949
27.11.2017, 20:54 #6
В INSERT/SELECT нет ничего такого, вы лучше имена обрамляйте (`table`), главное не дать возможности "вылезти" за пределы значения. Да, кавычки и просто некорректные значения, например у чисел.

В PDO можно подключать разные драйверы БД. Если вы сомневаетесь, что ваш код будет использоваться только для MySQL, используйте PDO.

Добавлено через 7 минут
Еще есть нульбайты и прочие спецсимволы с кодами меньше 0x20.

Добавлено через 1 минуту
http://php.net/manual/ru/function.mysql-real-escape-string.php
0
Tolick
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 144
27.11.2017, 20:56  [ТС] #7
Цитата Сообщение от Phantom-84 Посмотреть сообщение
вы лучше имена обрамляйте (`table`)
Это как?
0
Jewbacabra
Эксперт PHP
3374 / 2812 / 1268
Регистрация: 24.04.2014
Сообщений: 8,525
27.11.2017, 23:05 #8
Цитата Сообщение от Tolick Посмотреть сообщение
Если есть, то какой лучше и почему?
Лучше третий
PHP
1
mysql_query("SELECT * FROM table WHERE id=$id");
Читается лучше, и нет ненужных кавычек вокруг числового значения
Цитата Сообщение от Phantom-84 Посмотреть сообщение
С другой стороны в PHP строки в одинарных кавычках обрабатываются быстрее
Это миф. Разница есть, но крайне незначительна. Под спойлером бенчмарк и результаты
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
 * @Revs(1000)
 * @Iterations(10)
 * @Sleep(10)
 */
class StringBench
{
    private $randStr;
 
    public function __construct()
    {
        $this->randStr = md5(mt_rand());
    }
 
    public function benchSingleQuotes()
    {
        $this->singleQuotes();
    }
 
    public function benchDoubleQuotes()
    {
        $this->doubleQuotes();
    }
 
    private function singleQuotes()
    {
        return 'SELECT * FROM table WHERE id="'.$this->randStr.'"';
    }
 
    private function doubleQuotes()
    {
        return "SELECT * FROM table WHERE id='{$this->randStr}'";
    }
}
Код
/srv # ./vendor/bin/phpbench run StringBench.php --report=aggregate
PhpBench 0.13.0. Running benchmarks.
Using configuration file: /srv/phpbench.json

\StringBench

    benchSingleQuotes             I9 P0 	[μ Mo]/r: 1.599 1.595 (μs) 	[μSD μRSD]/r: 0.043μs 2.69%
    benchDoubleQuotes             I9 P0 	[μ Mo]/r: 1.628 1.604 (μs) 	[μSD μRSD]/r: 0.052μs 3.18%

2 subjects, 20 iterations, 2,000 revs, 0 rejects
(best [mean mode] worst) = 1.537 [1.614 1.599] 1.683 (μs)
⅀T: 32.271μs μSD/r 0.047μs μRSD/r: 2.934%
suite: 133c9777e24d649019720752ca5e0d11e62b1d0c, date: 2017-11-27, stime: 19:56:08
+-------------+-------------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+--------+
| benchmark   | subject           | groups | params | revs | its | mem_peak | best    | mean    | mode    | worst   | stdev   | rstdev | diff   |
+-------------+-------------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+--------+
| StringBench | benchSingleQuotes |        | []     | 1000 | 10  | 833,552b | 1.537μs | 1.599μs | 1.595μs | 1.683μs | 0.043μs | 2.69%  | 0.00%  |
| StringBench | benchDoubleQuotes |        | []     | 1000 | 10  | 833,552b | 1.558μs | 1.628μs | 1.604μs | 1.716μs | 0.052μs | 3.18%  | +1.77% |
+-------------+-------------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+--------+
На некоторых запусках вариант с двойными кавычками был быстрее, но такие ситуации возникали реже, поэтому привожу результат где одинарные быстрее
0
Tolick
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 144
28.11.2017, 02:02  [ТС] #9
Понятно, а нужны ли экранировать в mysql запросе точку с запятой? и если нужно то есть такая функция? а то htmlspecialchars я только теги и кавычки экранировал
0
Jodah
Эксперт PHP
2706 / 2378 / 1013
Регистрация: 01.08.2012
Сообщений: 8,405
28.11.2017, 02:19 #10
Tolick, экранировать нужно функцией mysql(i)_real_escape_string. htmlspecialchars для этого не подходит.

Цитата Сообщение от Tolick Посмотреть сообщение
зачем использовать и учить это PDO
У PDO свои плюсы. Помимо подготовленных запросов - "режимы" получения данных, подробней тут. FETCH_COLUMN, FETCH_KEY_PAIR, FETCH_GROUP экономят кучу времени.
0
Tolick
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 144
28.11.2017, 02:35  [ТС] #11
Спасибо понял, последний вот вопрос еще, я вот на своём сайте сделал тупо проверку в индексном файле в get, post запросах и адресной строке на символы: < > ' " ; и вдруг что я просто прикращаю работу скрипта, нужно ли в этом случае боятся SQL иньекций и XXS атак? Сайт интернет магазин и там нигде не нужны эти символы поэтому я их тупо блокирую и всё, нормальный ли такой подход?

Добавлено через 1 минуту
По сути в SQL запрос никогда не должны попасть кавычки теги и точка с запятой. Ну и конечно делаю эту проверку для форм.
0
Jodah
Эксперт PHP
2706 / 2378 / 1013
Регистрация: 01.08.2012
Сообщений: 8,405
28.11.2017, 02:44 #12
Цитата Сообщение от Tolick Посмотреть сообщение
нормальный ли такой подход?
Нет, это бессмысленно. Есть задача, есть стандартные инструменты. Пользуйтесь ими и не усложняйте себе жизнь.

Цитата Сообщение от Tolick Посмотреть сообщение
интернет магазин и там нигде не нужны эти символы
Сегодня не нужны, завтра понадобятся. Менеджер захочет использовать кавычки в названии товара или заполнять описания в виде HTML.
0
Tolick
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 144
28.11.2017, 02:47  [ТС] #13
Вас понял, но это мой интернет магазин и я точно не захочу эти символы, и почему усложняю, одна функция которая автоматически проверяет пост, гет запросы, для форм я эту функцию просто включаю в нужном месте. Так просто удобнее чем постояно экранировать в запросах везде.
0
Jodah
Эксперт PHP
2706 / 2378 / 1013
Регистрация: 01.08.2012
Сообщений: 8,405
28.11.2017, 10:42 #14
Цитата Сообщение от Tolick Посмотреть сообщение
и я точно не захочу эти символы
Вполне можете захотеть через месяц/год и систему придётся менять.

Цитата Сообщение от Tolick Посмотреть сообщение
Так просто удобнее чем постояно экранировать в запросах везде
Вопрос удобства решается сторонними библиотеками, например этой (далеко не лучшая): http://phpfaq.ru/pdo/pdo_wrapper

Пример запроса с подстановкой значений:
PHP
1
$stmt = DB::run("UPDATE pdowrapper SET name=? WHERE id=?", [$new, $id]);
И не нужно ничего вручную экранировать.
0
Phantom-84
239 / 198 / 58
Регистрация: 15.09.2017
Сообщений: 949
28.11.2017, 12:31 #15
Лучший ответ Сообщение было отмечено Tolick как решение

Решение

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Лучше третий
Это не то же самое, что первые два. Не вводите людей в заблуждение.

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Читается лучше
Это с какой стороны смотреть. В первом случае переменные лучше выделены.

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Это миф. Разница есть, но крайне незначительна.
Про степень более быстрой работы я ничего не писал. К тому же тест не объективен. Объединение строк негативно влияет на показатели первого способа. Вывод - особой разницы между способами нет, что я и пытался донести в моем первом посте. Но вы, видимо, не поняли.

Добавлено через 7 минут
Цитата Сообщение от Tolick Посмотреть сообщение
По сути в SQL запрос никогда не должны попасть кавычки теги и точка с запятой.
Вы путаете горькое с соленым. Даже <script></script> - вполне себе нормальное содержимое для строк, используемых в запросах.

Цитата Сообщение от Tolick Посмотреть сообщение
Ну и конечно делаю эту проверку для форм.
Т.е. вы категорический противник хранения тегов в БД

Добавлено через 20 минут
Кавычки - это особый случай. В чистом контенте они могут представляться в виде мнемоник (&quot; и т.п.), хотя конкретно для кавычек это не обязательно (допускается даже для знака больше не использовать мнемонику). Если в чистом контенте они не представляются в виде мнемоник или используются в тегах (для обрамления значений атрибутов), тогда их нужно экранировать для значений MySQL в запросах, если сами значения обрамляются такими же кавычками. И все это без учета экранирования в строках PHP при их записи. Т.е. в худшем случае может понадобиться даже двойное экранирование.

Добавлено через 10 минут
Кавычки в обязательном порядке нужно превращать в мнемоники только для того "чистого контента", который целиком является значением атрибута (content, value и т.п.). И то возможны варианты с использованием другого типа кавычек для обрамления значений атрибутов, но на это полагаться слишком смело, поэтому см. выше.
0
Jewbacabra
Эксперт PHP
3374 / 2812 / 1268
Регистрация: 24.04.2014
Сообщений: 8,525
28.11.2017, 21:39 #16
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Это не то же самое, что первые два. Не вводите людей в заблуждение.
В каком месте я ввожу людей в заблуждение?
Цитата Сообщение от Phantom-84 Посмотреть сообщение
В первом случае переменные лучше выделены.
В обоих случаях цвет подставляемой переменной отличен от цвета строки. Но в первом варианте присутствует визуальный шум в виде лишних кавычек и точек
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Про степень более быстрой работы я ничего не писал.
Цитата Сообщение от Phantom-84 Посмотреть сообщение
С другой стороны в PHP строки в одинарных кавычках обрабатываются быстрее
...
Цитата Сообщение от Phantom-84 Посмотреть сообщение
К тому же тест не объективен. Объединение строк негативно влияет на показатели первого способа.
Рассматривается конкретная ситуация, и сравниваются два конкретных ее решения. Что тут не объективно?
0
Tolick
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 144
29.11.2017, 00:41  [ТС] #17
Просто понимаете я пока учусь и моя задача просто сделать защиту от иньекций и тегов в mysql запросах, в следущем сайте сделаю как надо, всего по чучуть как говорится) Главное что сейчас бред этот вообще не проходит у меня на сайте, и это пока то что мне нужно

Добавлено через 1 минуту
Всем спасибо
0
Phantom-84
239 / 198 / 58
Регистрация: 15.09.2017
Сообщений: 949
29.11.2017, 01:06 #18
Цитата Сообщение от Jewbacabra Посмотреть сообщение
В каком месте я ввожу людей в заблуждение?
В том самом. Называя неполный аналог представленных способов лучшим.

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Но в первом варианте присутствует визуальный шум в виде лишних кавычек и точек
Этот шум является одним из средств выделения.

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Рассматривается конкретная ситуация, и сравниваются два конкретных ее решения. Что тут не объективно?
Если у вас в тесте сравнивается образование строк с запросами, какого черта вы мне предъявляете претензии по поводу фразы "С другой стороны в PHP строки в одинарных кавычках обрабатываются быстрее"? Сравнивайте чистые строки без объединений, вставок переменных и т.п.
0
Jodah
Эксперт PHP
2706 / 2378 / 1013
Регистрация: 01.08.2012
Сообщений: 8,405
29.11.2017, 01:10 #19
Цитата Сообщение от Tolick Посмотреть сообщение
я пока учусь
Так учитесь делать правильно. Нет ничего более постоянного, чем временное.
1
Jewbacabra
Эксперт PHP
3374 / 2812 / 1268
Регистрация: 24.04.2014
Сообщений: 8,525
29.11.2017, 09:53 #20
Цитата Сообщение от Phantom-84 Посмотреть сообщение
В том самом. Называя неполный аналог представленных способов лучшим.
Конкрентно в чем я ввожу людей в заблуждение?
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Этот шум является одним из средств выделения.
. Собеседника когда лучше слышно - в тишине или на строке в разгар работ?
Цитата Сообщение от Phantom-84 Посмотреть сообщение
Сравнивайте чистые строки без объединений, вставок переменных и т.п.
По такой же логике "чистые строки" не эквивалентны по функциональности. В данном случае рассматривалось именно формирование итоговой строки.
0
29.11.2017, 09:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2017, 09:53

В PHP сделать запросы к таблице в БД mysql
База данных - Автозаправочные станции! название полей в таблице: название АЗС,...

В PHP-коде не выполняются mysql-запросы DELETE и UPDATE
Доброго времени суток, собирая своего &quot;франкенштейна&quot; по кусочкам, наткнулся...

Можно ли во время цикла WHILE делать новые запросы к MySQL?
Добрый день! Вопрос, наверное, простой для тех, кто разбирается в MySQL... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru