Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 17

PDO+INSERT+POSTGRESQL+ array columns

12.07.2017, 11:05. Показов 2018. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как сделать Insert в PDO+INSERT+POSTGRESQL+ array columns??? просто пример.
PHP
1
2
3
4
5
6
7
8
9
10
$query = $db->prepare('INSERT INTO aw_bi_dev (duration_in_minutes, project_id, task_id, task_name, time_entry_type,user_comment,user_id) VALUES ({":duration_in_minutes"},  {":project_id"}, {":task_id"}, :task_name, {":time_entry_type"}, :user_comment,{":user_id"})');
    
    $query->bindValue(':duration_in_minutes', $value->duration_in_minutes,PDO::PARAM_INT); 
    $query->bindValue(':project_id', $value->project_id);
    $query->bindValue(':task_id', $value->task_id);
    $query->bindValue(':task_name', $value->task_name);
    $query->bindValue(':time_entry_type', $value->time_entry_type);
    $query->bindValue(':user_comment', $value->user_comment);
    $query->bindValue(':user_id', $value->user_id);
    $inserted =$query->execute()
Выбивает ошибку
SQLSTATE[HY093]: Invalid parameter number: :duration_in_minutes
Явно что-то не так с bindValue,что там должно быть?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.07.2017, 11:05
Ответы с готовыми решениями:

Pdo, postgresql, lastinsertid
Здравствуйте, В документации pdo написано: Но у меня в postgre 9.6 $pdo->lastInsertId() без указания имени...

Insert и PDO
Прописываю Insert запрос к БД, с использованием PDO: $reg_data = array( 'user' => $user, 'password' => $password, 'email'...

Неработает INSERT INTO в PDO
Такая нарисовалась ситуация, делаю INSERT запрос к БД, возвращает TRUE, но запись в БД не вставляется, уже проверил все переменные, их...

9
97 / 47 / 17
Регистрация: 25.04.2017
Сообщений: 471
12.07.2017, 18:45
1. В VALUES () пишите имена параметров без всяких обрамлений - VALUES (:name1, :name2, :name3).

2. bindValue() используется для передачи значений, для передачи переменных используется bindParam().

0
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 17
12.07.2017, 19:02  [ТС]
1. В VALUES () пишите имена параметров без всяких обрамлений - VALUES (:name1, :name2, :name3).
У меня PostgreSql столбцы массивы! без данных обрамлений, у меня будут ошибки синтаксиса, что их там не хватает.
2. bindValue() используется для передачи значений, для передачи переменных используется bindParam().
Значения переменные, какая разница? ты всегда туда передаешь значение переменной. в оф документаций такой же пример!
http://php.net/manual/ru/pdost... dvalue.php
К тому же с другими запросами у меня работает.
0
97 / 47 / 17
Регистрация: 25.04.2017
Сообщений: 471
12.07.2017, 19:07
Цитата Сообщение от deathlike Посмотреть сообщение
в оф документаций такой же пример!
почувствуйте разницу, слева мануал по bindValue() справа мануал по bindParam()
Миниатюры
PDO+INSERT+POSTGRESQL+ array columns   PDO+INSERT+POSTGRESQL+ array columns  
0
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 17
12.07.2017, 19:28  [ТС]
Вилы Выкидные,
я тебе даже больше напишу в чем разница между функциями, но мою проблему это не решает.
Связывает PHP переменную с именованным или неименованным параметром подготавливаемого SQL запроса. В отличие от PDOStatement::bindValue(), переменная привязывается по ссылке, и ее значение будет вычисляться во время вызова PDOStatement::execute().
0
97 / 47 / 17
Регистрация: 25.04.2017
Сообщений: 471
12.07.2017, 19:40
Цитата Сообщение от deathlike Посмотреть сообщение
я тебе даже больше напишу в чем разница между функциями
Не нуждаюсь, тем более зачем создавать тему, если Вы и так всё знаете сами

p.s. и я с Вами водяру не хлебал, чтобы на ты переписываться
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
12.07.2017, 21:04
Цитата Сообщение от deathlike Посмотреть сообщение
Invalid parameter number: :duration_in_minutes
Это из за указания имени параметра в кавычках - уберите их.
Цитата Сообщение от deathlike Посмотреть сообщение
что там должно быть?
Я мало знаком с PostgreSQL(а с массивами в нем не имел дела), но в классе PDO нет метода, позволяющего забиндить массив - только простые типы - строки/числа.
Да и в других "стандартных" модулях для работы с БД я подобного не видел...
Думаю вам придется собирать из массивов строки(например, используя PDO::quote+implode) и "руками" склеивать из них запрос.
0
97 / 47 / 17
Регистрация: 25.04.2017
Сообщений: 471
13.07.2017, 00:50
Цитата Сообщение от Max Dark Посмотреть сообщение
нет метода, позволяющего забиндить массив
набросал навскидку, гляньте будет ли работать?

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
35
36
37
38
39
40
41
42
43
<?php
 
error_reporting(-1);
 
try {
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo $e->getMessage();
}
 
function debug($arr)
{
    echo '<pre>' . print_r($arr, true) . '</pre>';
}
 
function assoc($sql, $item_value = [])
{
    global $pdo;
    $sql = $pdo->prepare($sql);
    debug($item_value);// смотрим, что в массиве
    foreach ($item_value as $item => $value) {
        if (is_bool($value)) {
            $type = PDO::PARAM_BOOL;// 5
        } elseif (is_int($value)) {
            $type = PDO::PARAM_INT;// 1
        } elseif (is_null($value)) {
            $type = PDO::PARAM_NULL;// 0
        } else {
            $type = PDO::PARAM_STR;// 2
        }
        $sql->bindValue($item, $value, $type);
        echo 'bindValue(' . $item . ', ' . $value . ', ' . $type .')<br>';// просто смотрим
    }
    $sql->execute();
    return $sql->fetch();
}
 
$var = 1;
 
$a = assoc('SELECT `name` FROM `test`.`test` WHERE `id` = :id AND `name` = :nm LIMIT 1', [':id' => $var,':nm' => 'aaa']);
 
echo '<br>' . $a['name'];
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
13.07.2017, 18:22
Цитата Сообщение от Вилы Выкидные Посмотреть сообщение
набросал навскидку, гляньте будет ли работать?
То, что вы набросали выполняет метод PDOStatement::execute(), с параметром в виде массива.
Сам код на первый взгляд рабочий, но делает не то, что требуется.
Самая близкая по смыслу задача - подстановка списка параметров в выражение IN().
На этапе написания запроса не известно, сколько будет параметров, а записать IN(:params_array) не получится, так как оно распознается как единое целое.
Поэтому и приходится генерировать запрос.
Код из справки
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
/* Выполнение подготовленного запроса с использованием массива для IN выражения */
$params = array(1, 21, 63, 171);
/* Создаем строку из знаков вопроса (?) в количестве равном количеству параметров */
$place_holders = implode(',', array_fill(0, count($params), '?'));
 
/*
    В этом примере подготавливается запрос с достаточным количеством неименованных
    псевдопеременных (?) для каждого значения из массива $params. Когда запрос будет
    выполняться, эти знаки вопроса будут заменены на элементы массива. Это не то же
    самое, что использовать PDOStatement::bindParam(), где привязка осуществлялась по
    ссылке на переменную. PDOStatement::execute() связывает параметры по значению.
*/
$sth = $dbh->prepare("SELECT id, name FROM contacts WHERE id IN ($place_holders)");
$sth->execute($params);
0
97 / 47 / 17
Регистрация: 25.04.2017
Сообщений: 471
14.07.2017, 13:39
Цитата Сообщение от Max Dark Посмотреть сообщение
так как оно распознается как единое целое.
принято
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.07.2017, 13:39
Помогаю со студенческими работами здесь

Не работает insert запрос (PDO)
Здравствуйте. Помогите, пожалуйста, разобраться, почему не работает функция, выполняющая insert запрос к БД: public function...

PHP, PDO, POST, INSERT
Есть несколько баз данных, для удобства редакторования, администратор отправляет данные через метод POST, однако не только данные, но и...

Добавление в БД >> массивы (array) / группа чекбоксов PDO
Всем привет! Есть чекбокс: &lt;label&gt;&lt;input name=&quot;delivery&quot; value=&quot;1&quot; type=&quot;checkbox&quot;&gt;one&lt;/label&gt; &lt;label&gt;&lt;input...

Не выполняется INSERT средствами PDO prepared statement
Собственно проблема не вставляются данные в бд когда передаю их через placeholder'ры когда передаю прямым запросом все нормально. P.S...

PDO INSERT Placeholder
Посмотрите пожалуйста..., где я ошибся? Данные не отправляются в базу $jokedate= trim($_POST); ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru