Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
30 / 45 / 19
Регистрация: 18.07.2018
Сообщений: 578
1
MySQL

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

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


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

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

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2018, 00:04
Ответы с готовыми решениями:

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

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

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

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

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы Fullstack-разработчиков на PHP‌
9
3230 / 2776 / 1395
Регистрация: 15.01.2014
Сообщений: 6,089
18.11.2018, 00:45 2
Цитата Сообщение от Сынок Посмотреть сообщение
Может я чего-то не знаю
Похоже на то.
Цитата Сообщение от Сынок Посмотреть сообщение
неужели нет способа
Способ есть и называется он "именованные параметры" (плейсхолдеры).
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
30 / 45 / 19
Регистрация: 18.07.2018
Сообщений: 578
18.11.2018, 01:13  [ТС] 3
Цитата Сообщение от Lazy_Den Посмотреть сообщение
не помешает почитать про методы bindParam() и bindValue()
мне это не нужно, бинд массива параметров происходит автоматически у меня

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

Lazy_Den,

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

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

спасибо
0
502 bad gateway
Эксперт PHP
4500 / 3661 / 1538
Регистрация: 24.04.2014
Сообщений: 10,783
18.11.2018, 01:18 4
Цитата Сообщение от Lazy_Den Посмотреть сообщение
Способ есть и называется он "именованные параметры" (плейсхолдеры).
Вы должны подбирать уникальные имена псевдопеременных для каждого значения, которое необходимо передавать в запрос при вызове PDOStatement::execute(). Нельзя использовать одну псевдопеременную в запросе более одного раза, кроме варианта, когда включен режим эмуляции.
https://secure.php.net/manual/ru/pdo.prepare.php
0
30 / 45 / 19
Регистрация: 18.07.2018
Сообщений: 578
18.11.2018, 01:27  [ТС] 5
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;
    }
я так понимаю при мощи него я могу что-то одно использовать: либо именованные либо неименованные

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

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

спасибо
0
3230 / 2776 / 1395
Регистрация: 15.01.2014
Сообщений: 6,089
18.11.2018, 01:30 6
Цитата Сообщение от Jewbacabra Посмотреть сообщение
кроме варианта, когда включен режим эмуляции
Согласен, этот момент важен.
0
502 bad gateway
Эксперт PHP
4500 / 3661 / 1538
Регистрация: 24.04.2014
Сообщений: 10,783
18.11.2018, 01:35 7
Лучший ответ Сообщение было отмечено Сынок как решение

Решение

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

Решение

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

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

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

Добавлено через 34 секунды
Jewbacabra, Lazy_Den, порешали - благодарю
0
3230 / 2776 / 1395
Регистрация: 15.01.2014
Сообщений: 6,089
18.11.2018, 02:12 10
Цитата Сообщение от Сынок Посмотреть сообщение
а если их 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2018, 02:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

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

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

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


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

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

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