Форум программистов, компьютерный форум, киберфорум
Наши страницы

PHP: базы данных

Войти
Регистрация
Восстановить пароль
 
 
Tolick
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 140
#1

Обычные mysql запросы - PHP БД/MySQL

27.11.2017, 19:34. Просмотров 336. Ответов 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 Обычные mysql запросы (PHP БД):

Запросы mysql - PHP БД
Решил создать запрос, но на выходе получил ошибку #1064 CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_chFlag2`(IN `modef` BOOLEAN,...

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

MySQL запросы - PHP БД
Начинаю изучать PHP + MySQL. Как уменьшить нагрузку на БД? Я думаю что надо убрать не нужны запросы. Правильно? mysql_query("UPDATE...

$_GET и запросы Mysql - PHP БД
Добрый день! Мне нужна помощь по такому вопросу: Я создаю сайт турагенства(не профессионально, просто учусь на понравившемся примере), у...

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

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

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

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

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

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

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

Добавлено через 1 минуту
Я просто не пойму зачем использовать и учить это PDO если есть в php функции которые экранируют теги и кавычки
0
Phantom-84
86 / 85 / 22
Регистрация: 15.09.2017
Сообщений: 434
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
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 140
27.11.2017, 20:56  [ТС] #7
Цитата Сообщение от Phantom-84 Посмотреть сообщение
вы лучше имена обрамляйте (`table`)
Это как?
0
Jewbacabra
Эксперт PHP
3018 / 2605 / 968
Регистрация: 24.04.2014
Сообщений: 7,969
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
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 140
28.11.2017, 02:02  [ТС] #9
Понятно, а нужны ли экранировать в mysql запросе точку с запятой? и если нужно то есть такая функция? а то htmlspecialchars я только теги и кавычки экранировал
0
Jodah
Эксперт PHP
2696 / 2368 / 845
Регистрация: 01.08.2012
Сообщений: 8,385
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
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 140
28.11.2017, 02:35  [ТС] #11
Спасибо понял, последний вот вопрос еще, я вот на своём сайте сделал тупо проверку в индексном файле в get, post запросах и адресной строке на символы: < > ' " ; и вдруг что я просто прикращаю работу скрипта, нужно ли в этом случае боятся SQL иньекций и XXS атак? Сайт интернет магазин и там нигде не нужны эти символы поэтому я их тупо блокирую и всё, нормальный ли такой подход?

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

Цитата Сообщение от Tolick Посмотреть сообщение
интернет магазин и там нигде не нужны эти символы
Сегодня не нужны, завтра понадобятся. Менеджер захочет использовать кавычки в названии товара или заполнять описания в виде HTML.
0
Tolick
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 140
28.11.2017, 02:47  [ТС] #13
Вас понял, но это мой интернет магазин и я точно не захочу эти символы, и почему усложняю, одна функция которая автоматически проверяет пост, гет запросы, для форм я эту функцию просто включаю в нужном месте. Так просто удобнее чем постояно экранировать в запросах везде.
0
Jodah
Эксперт PHP
2696 / 2368 / 845
Регистрация: 01.08.2012
Сообщений: 8,385
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
86 / 85 / 22
Регистрация: 15.09.2017
Сообщений: 434
28.11.2017, 12:31 #15
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Лучше третий
Это не то же самое, что первые два. Не вводите людей в заблуждение.

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

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

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

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

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

Добавлено через 10 минут
Кавычки в обязательном порядке нужно превращать в мнемоники только для того "чистого контента", который целиком является значением атрибута (content, value и т.п.). И то возможны варианты с использованием другого типа кавычек для обрамления значений атрибутов, но на это полагаться слишком смело, поэтому см. выше.
0
28.11.2017, 12:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2017, 12:31
Привет! Вот еще темы с ответами:

Можно ли во время цикла WHILE делать новые запросы к MySQL? - PHP БД
Добрый день! Вопрос, наверное, простой для тех, кто разбирается в MySQL... Делаю следующее: 1. Подключаюсь к БД 2. Делаю...

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

После цикла вывода информации, не получается использовать другие запросы к MySQL - PHP БД
Почему после цикла вывода, я не могу дальше использовать какие-то запросы? Они не работают, почему так? $str = ''; $reg =...

Различить запросы MySQL - PHP
Как отличить запрос с ложным условием where и запрос, который выводит ноль строк, т.к в таблице просто нет данных? В обоих случаях...


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

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

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