Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для skapunker
-30 / 25 / 12
Регистрация: 13.12.2013
Сообщений: 1,465

Будет ли создан запрос к базе данных в данном случае?

17.06.2023, 11:08. Показов 1686. Ответов 30

Студворк — интернет-сервис помощи студентам
Всем привет! Есть класс, у класса есть 2 метода. Вот они.

PHP
1
2
3
4
5
6
7
8
9
10
11
    private function dbInit($db)
    {
        $link = mysqli_connect($db['host'], $db['user'], $db['password'], $db['db_name']);
        mysqli_query($link, "SET NAMES utf8");
        return $link;
    }
 
    public function sanitizeMySQL($db, $string)
    {
        return Database::dbInit($db)->real_escape_string($string);
    }
При вызове метода sanitizeMySQL будет ли выполнен запрос к базе данных?

или я вообще дичь сделал? тогда подскажите как сделать попроще.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.06.2023, 11:08
Ответы с готовыми решениями:

Организация поиска по всей базе данных ( в данном случае 2 таблицы )
Здравствуйте, можете подсказать, где я ошибаюсь и как заставить отображать нужные данные в таблице? ( Если что-то нужно будет скинуть в...

Как отправить post запрос в данном случае?
Всем привет! Отправляю post запрос через ajax params = 'ip=1.1.1.1' request.send(params); Обработчик на PHP if...

Можно ли в данном случае сделать лаконичней ? Сбор данных WMI
Приходится собирать данные о машине. Я использую WMI. Приходится выводить их на консоль. И также в файл. Вопрос, можно ли сделать (на...

30
 Аватар для sad67man
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
21.06.2023, 19:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от skapunker Посмотреть сообщение
а че PHP сам не может сообразить, что если уже есть дескриптор соединения и нет смысла второй раз подключаться?
PHP не может соображать или догадываться что вы хотите - слегка туповат, может только исполнять ваши инструкции.

mysqli_connect
mysqli_connect — Устанавливает новое соединение с сервером MySQL
Можно подключаться и к разным базам данных одновременно.

Цитата Сообщение от skapunker Посмотреть сообщение
я вообще не понимаю зачем real_escape_string нужно подключение чтобы "очистить" запрос
mysqli_real_escape_string
Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения
А зачем вам чистить запрос, если вы не собираетесь подключаться к базе данных?
0
 Аватар для skapunker
-30 / 25 / 12
Регистрация: 13.12.2013
Сообщений: 1,465
21.06.2023, 19:46  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
А зачем вам чистить запрос
я его сначала чищу, а потом выполняю запрос.

PHP
1
2
3
4
5
6
7
8
    // любой запрос
    public function queryDB($db, $query)
    {
        $link = Database::dbInit($db);
        $data = mysqli_query($link, $query);
        mysqli_close($link);
        return $data;
    }
то есть работает так, например

PHP
1
2
3
$database = new Database();
$referrer = $database->sanitizeMySQL($db, $referrer);
$database->queryDB($db, "SELECT * FROM  {$db_tables['referrers']} WHERE referrer = '$referrer'");
мне вот тоже в последнее время кажется что я дичь сделал
0
89 / 74 / 24
Регистрация: 16.05.2023
Сообщений: 268
21.06.2023, 20:14
Если глянуть исходники расширения mysqli

https://github.com/php/php-src... ion.c#L924

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// https://github.com/php/php-src/blob/fae42c8bd832174a17a804d0da0bfd624fd071e4/ext/mysqlnd/mysqlnd_libmysql_compat.h#L49
// #define mysql_escape_string(a,b,c)       mysqlnd_escape_string((a), (b), (c))
/* {{{ mysqlnd_conn_data::escape_string */
static zend_ulong
MYSQLND_METHOD(mysqlnd_conn_data, escape_string)(MYSQLND_CONN_DATA * const conn, char * newstr, const char * escapestr, size_t escapestr_len)
{
    zend_ulong ret = FAIL;
    DBG_ENTER("mysqlnd_conn_data::escape_string");
    DBG_INF_FMT("conn=%" PRIu64, conn->thread_id);
 
    DBG_INF_FMT("server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status));
    if (UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status) & SERVER_STATUS_NO_BACKSLASH_ESCAPES) {
        ret = mysqlnd_cset_escape_quotes(conn->charset, newstr, escapestr, escapestr_len);
    } else {
        ret = mysqlnd_cset_escape_slashes(conn->charset, newstr, escapestr, escapestr_len);
    }
    DBG_RETURN(ret);
}
/* }}} */
То мы видим для чего нужно соединение с бд. А так же видим реализации функций mysqlnd_cset_escape_quotes и mysqlnd_cset_escape_slashes

Делаем вывод что, соединение с БД не так уж и нужно

Кликните здесь для просмотра всего текста
C
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/* {{{ mysqlnd_cset_escape_quotes */
PHPAPI zend_ulong mysqlnd_cset_escape_quotes(const MYSQLND_CHARSET * const cset, char * newstr,
                                             const char * escapestr, const size_t escapestr_len)
{
    const char  *newstr_s = newstr;
    const char  *newstr_e = newstr + 2 * escapestr_len;
    const char  *end = escapestr + escapestr_len;
    bool    escape_overflow = FALSE;
 
    DBG_ENTER("mysqlnd_cset_escape_quotes");
 
    for (;escapestr < end; escapestr++) {
        unsigned int len = 0;
        /* check unicode characters */
 
        if (cset->char_maxlen > 1 && (len = cset->mb_valid(escapestr, end))) {
 
            /* check possible overflow */
            if ((newstr + len) > newstr_e) {
                escape_overflow = TRUE;
                break;
            }
            /* copy mb char without escaping it */
            while (len--) {
                *newstr++ = *escapestr++;
            }
            escapestr--;
            continue;
        }
        if (*escapestr == '\'') {
            if (newstr + 2 > newstr_e) {
                escape_overflow = TRUE;
                break;
            }
            *newstr++ = '\'';
            *newstr++ = '\'';
        } else {
            if (newstr + 1 > newstr_e) {
                escape_overflow = TRUE;
                break;
            }
            *newstr++ = *escapestr;
        }
    }
    *newstr = '\0';
 
    if (escape_overflow) {
        DBG_RETURN((zend_ulong)~0);
    }
    DBG_RETURN((zend_ulong)(newstr - newstr_s));
}
C
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* {{{ mysqlnd_cset_escape_slashes */
PHPAPI zend_ulong mysqlnd_cset_escape_slashes(const MYSQLND_CHARSET * const cset, char *newstr,
                                              const char * escapestr, const size_t escapestr_len)
{
    const char  *newstr_s = newstr;
    const char  *newstr_e = newstr + 2 * escapestr_len;
    const char  *end = escapestr + escapestr_len;
    bool    escape_overflow = FALSE;
 
    DBG_ENTER("mysqlnd_cset_escape_slashes");
    DBG_INF_FMT("charset=%s", cset->name);
 
    for (;escapestr < end; escapestr++) {
        char esc = '\0';
        unsigned int len = 0;
 
        /* check unicode characters */
        if (cset->char_maxlen > 1 && (len = cset->mb_valid(escapestr, end))) {
            /* check possible overflow */
            if ((newstr + len) > newstr_e) {
                escape_overflow = TRUE;
                break;
            }
            /* copy mb char without escaping it */
            while (len--) {
                *newstr++ = *escapestr++;
            }
            escapestr--;
            continue;
        }
        if (cset->char_maxlen > 1 && cset->mb_charlen(*escapestr) > 1) {
            esc = *escapestr;
        } else {
            switch (*escapestr) {
                case 0:
                    esc = '0';
                    break;
                case '\n':
                    esc = 'n';
                    break;
                case '\r':
                    esc = 'r';
                    break;
                case '\\':
                case '\'':
                case '"':
                    esc = *escapestr;
                    break;
                case '\032':
                    esc = 'Z';
                    break;
            }
        }
        if (esc) {
            if (newstr + 2 > newstr_e) {
                escape_overflow = TRUE;
                break;
            }
            /* copy escaped character */
            *newstr++ = '\\';
            *newstr++ = esc;
        } else {
            if (newstr + 1 > newstr_e) {
                escape_overflow = TRUE;
                break;
            }
            /* copy non escaped character */
            *newstr++ = *escapestr;
        }
    }
    *newstr = '\0';
 
    if (escape_overflow) {
        DBG_RETURN((zend_ulong)~0);
    }
    DBG_RETURN((zend_ulong)(newstr - newstr_s));
}
/* }}} */


Добавлено через 47 секунд
Разумеется можно забить большой и толстый (мб и маленький) стручок, и использовать функцию из первого ответа моего

https://www.cyberforum.ru/post16945339.html
0
 Аватар для skapunker
-30 / 25 / 12
Регистрация: 13.12.2013
Сообщений: 1,465
21.06.2023, 20:18  [ТС]
Цитата Сообщение от Hmms Посмотреть сообщение
и использовать функцию из первого ответа моего
это да, но эта функция не безопасна, как раз вычитал где то что не надо пытаться заменять вручную бекслешами или что там
0
89 / 74 / 24
Регистрация: 16.05.2023
Сообщений: 268
21.06.2023, 20:25
Цитата Сообщение от skapunker Посмотреть сообщение
но эта функция не безопасна
Моя функция, полностью безопасна. И заменяет "бэкслеши"

Добавлено через 4 минуты
А может быть уже не надо себе голову ломать ? И возьмёте готовое решение, где за вас уже всё делают, как вы того и хотите

https://medoo.in/api/select

PHP
1
2
3
4
5
6
$data = $database->select("account", [
    "user_name",
    "email"
], [
    "user_id[>]" => 100
]);
Добавлено через 45 секунд
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
$database->update("account", [
    "type" => "user",
 
    // All age plus one.
    "age[+]" => 1,
 
    // All levels subtract 5.
    "level[-]" => 5,
 
    // All scores multiplied by 2.
    "score[*]" => 2,
 
    // Array value
    "lang" => ["en", "fr", "jp", "cn"],
 
    // Array value encoded as JSON.
    "lang [JSON]" => ["en", "fr", "jp", "cn"],
 
    // Boolean value.
    "is_locked" => true,
 
    // Object value.
    "object_data" => $object_data,
 
    // Large Objects (LOBs).
    "image" => $fp
], [
    "user_id[<]" => 1000
]);
0
 Аватар для skapunker
-30 / 25 / 12
Регистрация: 13.12.2013
Сообщений: 1,465
21.06.2023, 20:26  [ТС]
Цитата Сообщение от Hmms Посмотреть сообщение
И возьмёте готовое решение
об этом надо было раньше думать
0
89 / 74 / 24
Регистрация: 16.05.2023
Сообщений: 268
21.06.2023, 20:29
Цитата Сообщение от skapunker Посмотреть сообщение
об этом надо было раньше думать
Я почему то более чем уверен, что там переписать всё, займёт не более 2 часов

Добавлено через 2 минуты
Решение для новичков подходит более чем, простой и лёгкий синтаксис. Не нужно знать sql запросов.

PHP
1
2
3
4
5
    $database->insert("account", [
        "user_name" => "foo",
        "email" => "foo@bar.com",
        "age" => 25
    ]);
0
 Аватар для skapunker
-30 / 25 / 12
Регистрация: 13.12.2013
Сообщений: 1,465
23.06.2023, 22:24  [ТС]
Цитата Сообщение от Hmms Посмотреть сообщение
Нет, я привёл в пример правильный класс.
скажите, а вы этот класс где взяли?
0
89 / 74 / 24
Регистрация: 16.05.2023
Сообщений: 268
23.06.2023, 22:33
Цитата Сообщение от skapunker Посмотреть сообщение
скажите, а вы этот класс где взяли?
За 2 минуты накидал сам, базовый класс который должен уметь накидать любой зелёный новичок, с закрытыми глазами по пьяни, в 4 утра часа ночи, будучи полностью наглухо обкуренным
0
 Аватар для skapunker
-30 / 25 / 12
Регистрация: 13.12.2013
Сообщений: 1,465
16.08.2023, 16:02  [ТС]
сейчас выяснилось, что подготовка запроса тоже делает запрос
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
18.08.2023, 16:53
Цитата Сообщение от skapunker Посмотреть сообщение
тогда подскажите как сделать попроще.
Ну mysqli дает 2 возможности безипасного использования параметров, escape функция и подготовленные запросы
https://www.php.net/manual/en/... ements.php

Выбирайте, что удобнее. Проще - это уже задача обертки для базы - посмотрите, как работают либы баз данных, тип eloquent ларавеля
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.08.2023, 16:53

Заменить в базе данных ссылки для нового сайта (сайт был создан в директории с названием wp)
Здравствуйте, в написании сайтов новичок, но работа требует. По примеру из интернета установил OpenServer, установил Wordpress и сделал...

Entity framework - пропадают изменения в базе данных в случае сбоя программы
Уважаемые Гуру! В WPF проекте используется entity framework (база данных mysql). Операторы производят изменения в базе данных, выполняя...

отправка формы только в случае, если значения поля ещё нету в базе данных
Помогите пожалуйста решить такую задачу: Есть форма, в ней три поля (id; name; type) и кнопка &quot;save&quot;. значение id должно...

Будет ли работать на 1 базе данных
Здравствуйте. У нашей мед.организации сейчас сайт просто на html+css и немного простенького php. Для улучшения дизайна и...

Запрос к базе данных через форму и вывод данных на страничке
Всем привет. Очень нужна ваша помощь, вы моя последняя надежда. У меня стоит одна форма и ввожу имя человека который проходит тест, потом...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru