Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
31 / 46 / 19
Регистрация: 18.07.2018
Сообщений: 578
MySQL

PDO - одно значение для нескольких параметров

18.11.2018, 00:04. Показов 3236. Ответов 9
Метки mysq, pdo (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Запрос содержит несколько параметров, которым присваивается одно и то же значение:

Code
1
$result = ... update table set column_1 = ?, column_2 = column_2 + ? where culumn_3 = ? limit 1, [$var, $var, $var]
Может я чего-то не знаю, то подскажите: неужели нет способа не указывать в массиве одно и то же значение несколько раз?

Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2018, 00:04
Ответы с готовыми решениями:

PDO::prepare для нескольких строк SQL
sql содержит несколько строк кода, можно их выполнить одним приемом, или нужно для каждой строки sql писать свой код pdo? мой код...

PDO, некорректная передача параметров из формы
Вот форма: <html> <head> <title>магазин iBook - Результаты поиска</title> </head> <body> <h1>магазин iBook -...

Отсутствует значение для одного или нескольких параметров
Доброго времени суток подскажите в чем ошибка DM.DataModule3.ADOQuery3.Close; DM.DataModule3.ADOQuery3.SQL.Clear; ...

9
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
18.11.2018, 00:45
Цитата Сообщение от Сынок Посмотреть сообщение
Может я чего-то не знаю
Похоже на то.
Цитата Сообщение от Сынок Посмотреть сообщение
неужели нет способа
Способ есть и называется он "именованные параметры" (плейсхолдеры).
PHP
1
2
$sth = $dbh->prepare("UPDATE `table` SET `column_1` = :myvar, `column_2` = `column_2` + :myvar WHERE `culumn_3` = :myvar LIMIT 1");
$sth->execute([':myvar' => 100500]);
Кроме прочего, не помешает почитать про методы bindParam() и bindValue()
0
31 / 46 / 19
Регистрация: 18.07.2018
Сообщений: 578
18.11.2018, 01:13  [ТС]
Цитата Сообщение от Lazy_Den Посмотреть сообщение
не помешает почитать про методы bindParam() и bindValue()
мне это не нужно, бинд массива параметров происходит автоматически у меня

Цитата Сообщение от Lazy_Den Посмотреть сообщение
Способ есть и называется он "именованные параметры" (плейсхолдеры)
это учёл, дописал в обёртку возможность использовать именованные параметры

Lazy_Den,

теперь осталось только узнать у Вас, вот если у меня 100 неименованных параметров и 10-ти из них нужно присвоить одно и то же значение, но они вразнобой идут в запросе, то как мне их добавить в массив при помощи имён вперемешку с неименованными?

или имя параметра не требует очерёдности по размещению в массиве?

спасибо
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.11.2018, 01:18
Цитата Сообщение от Lazy_Den Посмотреть сообщение
Способ есть и называется он "именованные параметры" (плейсхолдеры).
Вы должны подбирать уникальные имена псевдопеременных для каждого значения, которое необходимо передавать в запрос при вызове PDOStatement::execute(). Нельзя использовать одну псевдопеременную в запросе более одного раза, кроме варианта, когда включен режим эмуляции.
https://secure.php.net/manual/ru/pdo.prepare.php
0
31 / 46 / 19
Регистрация: 18.07.2018
Сообщений: 578
18.11.2018, 01:27  [ТС]
Jewbacabra,

Вы мне как-то помогали создать метод автобинда массива параметров

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static function run($sql, $params = [])
    {
        $query = self::connection()->prepare($sql);
        if (array_key_exists(0, $params)) {
            $i = 1;
            foreach ($params as $value) {
                $query->bindValue($i++, $value, self::type($value));
            }
        } else {
            foreach ($params as $key => $value) {
                $query->bindValue($key, $value, self::type($value));
            }
        }
        $query->execute();
        return $query;
    }
я так понимаю при мощи него я могу что-то одно использовать: либо именованные либо неименованные

а как мне выполнить такой запрос?

Code
1
::run('update users set a = ?, b = ?, c = c + ? where d = ?', [$var_1, $var_2, $var_1, $var_1]);
чтобы не писать 3 раза $var_1

спасибо
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
18.11.2018, 01:30
Цитата Сообщение от Jewbacabra Посмотреть сообщение
кроме варианта, когда включен режим эмуляции
Согласен, этот момент важен.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.11.2018, 01:35
Лучший ответ Сообщение было отмечено Сынок как решение

Решение

Цитата Сообщение от Сынок Посмотреть сообщение
чтобы не писать 3 раза $var_1
Не вижу проблемы, чтобы 3 раза использовать 1 параметр. А вообще из такой ситуации напрашивается вопрос правильно ли организовано хранение данных если требуется дублирование.
Конечно можно искать в запросе все параметры и совпадающие менять на уникальные, но как по мне проще и лучше их повторять
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
18.11.2018, 01:37
Лучший ответ Сообщение было отмечено Сынок как решение

Решение

Цитата Сообщение от Сынок Посмотреть сообщение
чтобы не писать 3 раза $var_1
А что вас смущает? Вы же эти значения пропишите один раз, а не будете в режиме онлайн подставлять вручную.
0
31 / 46 / 19
Регистрация: 18.07.2018
Сообщений: 578
18.11.2018, 01:43  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
3 раза
а если их 100, например это же какая змея из массива получится (или столбец на полстраницы)

Цитата Сообщение от Jewbacabra Посмотреть сообщение
проще и лучше их повторять
буду пока делать, как проще, может со временем доработаю

Добавлено через 50 секунд
Цитата Сообщение от Lazy_Den Посмотреть сообщение
не будете в режиме онлайн подставлять вручную
логично

Добавлено через 34 секунды
Jewbacabra, Lazy_Den, порешали - благодарю
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
18.11.2018, 02:12
Цитата Сообщение от Сынок Посмотреть сообщение
а если их 100, например
Сложно представить ситуацию, когда это нужно, но даже если нужно, то лучше один раз помучиться и спать спокойно. ))
Может вам пригодится один лайфхак, который я использую в некоторых специфических ситуациях. Действительно, бывают случаи, когда в запросе участвует много значений, при этом, строка запроса с не именованными параметрами, что предполагает четкий порядок в массиве. В таких случаях, я использую массив-маску, который помогает не только отсортировать значения, но и в случае отсутствия какого-либо, подставлять дефолтное значение.
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
// массив маска
$mask = [
    'a' => '',
    'b' => '',
    'c' => 'default value',
    'd' => '',
];
 
// входящий массив данных
$data = [
    'd' => 'D',
    'b' => 'B',
    'a' => 'A',
];
 
// Используем
$params = array_merge($mask, $data);
/*
Array
(
    [a] => A
    [b] => B
    [c] => default value
    [d] => D
)
*/
 
// подставляем в запрос
$sth->execute(array_values($params));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.11.2018, 02:12
Помогаю со студенческими работами здесь

Отсутствует значение для одного или нескольких параметров
cmd.CommandText = "INSERT INTO '" + table_name + "'('" + join(field_names, ", ") + "') " + "VALUES('" + join(field_values, ", ") +...

Отсутствует значение для одного из нескольких требуемых параметров
Me.Controls!.Value = CurrentProject.Connection.Execute("SELECT Заезды.data_zaezda FROM Заезды inner join Категории on ...

Отсутствует значение для одного или нескольких параметров
Имеется БД, подключённая через datagridview. В ней мне нужно в зависимости от значения D запросом выбрать ближайшие к этому D значения,...

Отсутствует значение для одного или нескольких требуемых параметров
Помогите, пожалуйста найти ошибку... Вот код который выполняет сохранение: id_kl := DataModule2.ADOQuery1.Fields.Fields.ASInteger; ...

Отсутствует значение для одного или нескольких требуемых параметров
Привет, есть 2 БД (a1,b1) надо из b1 загнать в a1 те записи которые отсутствуют в a1 составил запрос "SELECT * FROM b1 WHERE b2.ID...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru