Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
0 / 4 / 1
Регистрация: 20.05.2015
Сообщений: 450
1

Запрос INSERT INTO как построить запрос правильно?

27.12.2016, 23:26. Показов 8340. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Народ помогите пожалуйста сделать запрос правильно.
Имеется таблица users в ней имеется данные для регистрации и данные для профиля.
При регистрации все го лишь нужно указать логин, email, пароль, еще раз пароль и все,
делаю такой запрос:
PHP
1
2
3
4
5
6
7
8
9
10
11
$sql = 'INSERT INTO `users`
(`user_id`, `login`, `email`, `pass`, `salt`, `active_hex`, `status`, `role`, `date_reg`,
    `name`, `surname`, `birthday`, `sex`, `country`, `city`, `avatar`)
VALUES (:user_id, :login, :email, :pass, :salt, :active_hex, 0, 3, NOW(),
    :name, :surname, :birthday, :sex, :country, :city, :avatar)';
                $stmt = $pdo->prepare($sql);
                $stmt->bindValue(':login', $_POST['login'], PDO::PARAM_STR);
                $stmt->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
                $stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
                $stmt->bindValue(':salt', $salt, PDO::PARAM_STR);
                $stmt->execute();
Выкидывает вот такую ошибку:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1' in

Еще делал запрос на регистрацию вот так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                $sql = 'INSERT INTO `users`
                VALUES(
                "",
                :login,
                :email,
                :pass,
                :salt,
                :active_hex,
                0,
                3,
                NOW()
                )';
                $stmt = $pdo->prepare($sql);
                $stmt->bindValue(':login', $_POST['login'], PDO::PARAM_STR);
                $stmt->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
                $stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
                $stmt->bindValue(':salt', $salt, PDO::PARAM_STR);
                $stmt->execute();
Все ровно та же ошибка...
Нужно ли все поля указывать которые есть в таблице или нет?
Как правильно выглядеть данный запрос, что бы пропустить те поля которые заполняются позже, и то по желанию?
Может кто встречался с такой проблемой, или уже разобрался дайте совет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2016, 23:26
Ответы с готовыми решениями:

Как правильно построить запрос на выборку значений
Добрый день. Есть поле total_cost в нем хранится цена товара и поле new_cost в нем храниться цена...

Как в sql запрос вставить еще один запрос правильно?
Есть длинный запрос, в котором можете даже не разбираться если не хотите, но выдает он следующее:...

Как правильно выполнить запрос Insert.Into.Select.From.Where
Доброго утра всем, пытаюсь записать данные с лэйбла в последнюю строку БД, но выдает ошибку в...

Не работает запрос INSERT MySQLdb или как его правильно составить?
Есть код: import MySQLdb try: con = MySQLdb.connect(host="localhost", user="root",...

35
91 / 91 / 13
Регистрация: 14.07.2012
Сообщений: 539
27.12.2016, 23:37 2
Что-то с полями не так. В 3 строке это идентификатор? Автоинкемент и все такое?
Попробуйте так написать
NULL,
0
0 / 4 / 1
Регистрация: 20.05.2015
Сообщений: 450
28.12.2016, 01:04  [ТС] 3
pyramida, Ты сейчас за какой запрос говоришь за первый или второй? Если за второй то поле автоинкримента то-есть user_id

Добавлено через 3 минуты
pyramida, добавил вместо "" поставил NULL все ровно та же ошибка.

Добавлено через 38 минут
Вроде исправил запрос, вместо тех данных которые есть в теме я их просто пропустил, и написал так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                $sql = 'INSERT INTO `users`
                                VALUES(
                                "",
                                :login,
                                :email,
                                :pass,
                                :salt,
                                :active_hex,
                                0,
                                3,
                                NOW(),"","","","","","",""
                                )';
                $stmt = $pdo->prepare($sql);
                $stmt->bindValue(':login', $_POST['login'], PDO::PARAM_STR);
                $stmt->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
                $stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
                $stmt->bindValue(':salt', $salt, PDO::PARAM_STR);
                $stmt->execute();
То-есть вместо данных поставил пустые кавычки, как же сделать так, что бы этого не допускать, эти пустые кавычки?
Если в таблице users имеются регистрационные и информационные данные о пользователе?
Можно как то пропустить их?

Добавлено через 21 минуту
Я думаю такого допускать нельзя, посоветуйте обойти, такое странное мое решение, благодарен буду.
0
91 / 91 / 13
Регистрация: 14.07.2012
Сообщений: 539
28.12.2016, 01:32 4
Цитата Сообщение от _NE_KAKIX_IMEN_ Посмотреть сообщение
посоветуйте обойти, такое странное мое решение
Это :login откуда и что за данные?
Берете свой запрос
PHP
1
echo $sql;
Выводите в виде текста. Загружаете в phpmyadmin и проверяете, какие ошибки выдаются.

И давайте без "тыканья" мы водку не пили вместе.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
28.12.2016, 11:15 5
_NE_KAKIX_IMEN_, вам PDO, может и не по-русски, но довольно ясно говорит, что список вставляемых имен не совпадает со списком столбцов: число столбцов не совпадает с числом вставляемых значений. Структуру таблицы выложите.
0
0 / 4 / 1
Регистрация: 20.05.2015
Сообщений: 450
28.12.2016, 12:15  [ТС] 6
Kerry_Jr, pyramida, Да я знаю что в переводе, оно означает, а при чем тут список столбцов, я например при регистрации, их указывать не хочу.
Вот дамп таблицы users и поля к ней:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE `users` (
`user_id` INT(11) NOT NULL,
`login` VARCHAR(32) NOT NULL,
`email` CHAR(32) NOT NULL,
`pass` VARCHAR(32) NOT NULL,
`salt` VARCHAR(32) NOT NULL,
`active_hex` VARCHAR(32) NOT NULL,
`status` INT(1) NOT NULL,
`role` tinyint(3) NOT NULL,
`date_reg` DATE NOT NULL,
`name` VARCHAR(32) NOT NULL,
`surname` VARCHAR(32) NOT NULL,
`birthday` DATE NOT NULL,
`sex` INT(1) NOT NULL DEFAULT '0',
`country` VARCHAR(32) NOT NULL,
`city` VARCHAR(32) NOT NULL,
`avatar` VARCHAR(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Что дальше будем делать, кто подскажет?
0
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
28.12.2016, 12:31 7
Цитата Сообщение от _NE_KAKIX_IMEN_ Посмотреть сообщение
я например при регистрации, их указывать не хочу
У тебя все колонки объявлены как NOT NULL, значит при INSERT все должны получить какие-то значения.
0
0 / 4 / 1
Регистрация: 20.05.2015
Сообщений: 450
28.12.2016, 12:49  [ТС] 8
Grossmeister, так мне все во лишь надо указать те поля какие я хочу использовать а не все!
0
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
28.12.2016, 13:07 9
Цитата Сообщение от _NE_KAKIX_IMEN_ Посмотреть сообщение
так мне все во лишь надо указать те поля какие я хочу использовать а не все
Значит те, в которых допустимо отсутствие значения (а это и есть NULL) не нужно объявлять как NOT NULL.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
28.12.2016, 13:10 10
_NE_KAKIX_IMEN_, изменяйте структуру таблицы. Для тех столбцов, где не нужны обязательные значения, не используйте NOT NULL, либо если используете NOT NULL, то добавьте значение по умолчанию с помощью DEFAULT, отличающееся от NULL.
0
0 / 4 / 1
Регистрация: 20.05.2015
Сообщений: 450
28.12.2016, 19:00  [ТС] 11
Grossmeister, Kerry_Jr, Я конечно уже разобрался с запросом, всего лишь нужно было сделать так,
PHP
1
2
                $sql = 'INSERT INTO `users` (`login`, `email`, `pass`, `salt`,`active_hex`,`role`)
                VALUES (:login, :email, :pass, :salt, :active_hex, :role)';
то-есть выбираю те поля с которыми буду работать да и все.

Так теперь на счет Not Null, как же мне ставить DEFAULT если эти поля будут заполнятся, но чуть позже.
Что в таком случае делать?

Добавлено через 21 минуту
И сразу еще вопрос, если я использую в базе DEFAULT например 1, мне в запросе нужно ли указывать это же значение что и в базе? Или оно само станет как я указал по дефолту?
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
28.12.2016, 19:48 12
Цитата Сообщение от _NE_KAKIX_IMEN_ Посмотреть сообщение
И сразу еще вопрос, если я использую в базе DEFAULT например 1, мне в запросе нужно ли указывать это же значение что и в базе? Или оно само станет как я указал по дефолту?
Смотрите, если вы в запросе используете поле, у которого есть дефолтное значение, то, несмторя на это значение, вам нужно будет указать то значение, которое нужно записать, даже если оно совпадает с дефолтным. Если данного поля в запросе не будет, то в него автоматом запишется дефолтное значение.
0
0 / 4 / 1
Регистрация: 20.05.2015
Сообщений: 450
28.12.2016, 21:28  [ТС] 13
Kerry_Jr, Так я о этом и пишу, мне нужно что бы записывалось дефолтное значения, которое я указываю в базе, обязательно ли мне в запросе указывать это поле, и это же значение что указал в базе, или просто можно пропустить это поле, и он автоматом подставить дефолтное значение?
Или правильней будет если я укажу это поле в запросе и поставлю значение которое совпадает в базе с дефолтным значением?

Добавлено через 1 час 5 минут
А как заполнить данные для определенного пользователя? если этот пользователь зашел на сайт, ему мы даем его страницу, где он может заполнять свои данные, имя фамилию и т.д.
Делаю запрос на заполнения данных:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
    $sql = 'INSERT INTO `users`
    (`name`, `surname`, `birthday`, `sex`, `country`, `city`, `avatar`)
    VALUES
    (:name, :surname, "'.$_POST['birthday'].'", :sex, :country, :city, :avatar)';
    $stmt = $pdo->prepare($sql); 
    $stmt->bindValue(':name', $_POST['name'], PDO::PARAM_STR);
    $stmt->bindValue(':surname', $_POST['surname'], PDO::PARAM_STR);
    $stmt->bindValue(':sex', $_POST['sex'], PDO::PARAM_STR);
    $stmt->bindValue(':country', $_POST['country'], PDO::PARAM_STR);
    $stmt->bindValue(':city', $_POST['city'], PDO::PARAM_STR);
    $stmt->bindValue(':avatar', $name, PDO::PARAM_STR);
    $stmt->execute();
Данные записываются только не для этого пользователя, а просто в пустое поле id-2, а мне надо для этого пользователя который авторизовался id-1
0
1931 / 1522 / 703
Регистрация: 17.11.2012
Сообщений: 6,585
28.12.2016, 21:50 14
Цитата Сообщение от _NE_KAKIX_IMEN_ Посмотреть сообщение
Данные записываются только не для этого пользователя, а просто в пустое поле id-2,
SQL
1
WHERE `id` = 'идентификатор пользователя'
0
0 / 4 / 1
Регистрация: 20.05.2015
Сообщений: 450
28.12.2016, 21:58  [ТС] 15
fanatikus,
Че то уже перебрал по разному и не получается что не так я делаю?
PHP
1
2
3
4
5
    $sql = 'INSERT INTO `users`
    (`name`,`surname`, `birthday`, `sex`, `country`, `city`, `avatar`)
    VALUES
    (:name, :surname, "'.$_POST['birthday'].'", "'.$_POST['sex'].'", :country, :city, :avatar)
    WHERE `id`="'. $_SESSION['id'] .'"';
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
28.12.2016, 22:00 16
insert - добавление новой записи. Если вы хотите изменить уже существующую, используется UPDATE.
0
0 / 4 / 1
Регистрация: 20.05.2015
Сообщений: 450
28.12.2016, 22:07  [ТС] 17
KOPOJI, insert или insert into для добавления... Я использую Insert into.
0
1931 / 1522 / 703
Регистрация: 17.11.2012
Сообщений: 6,585
28.12.2016, 22:08 18
вы хотите добавить данные уже после регистрации?
если да, то запись в таблице уже есть, просто не все поля заполнены.
тогда нужно update а не insert.
или я что-то не понял?
0
0 / 4 / 1
Регистрация: 20.05.2015
Сообщений: 450
28.12.2016, 22:21  [ТС] 19
fanatikus, Да получается запись уже есть в таблице, для id-1 теперь просто надо заполнить остальные данные.
Значит получается мне надо такой запрос делать:
PHP
1
2
3
4
5
6
7
8
9
10
$sql =
        "UPDATE `users` SET
        :name,
        :surname,
        '".$_POST['birthday']."',
        '".$_POST['sex']."',
        :country,
        :city,
        :avatar
        WHERE `user_id`='". $_SESSION['user_id'] ."'";
Ругается не получается(
0
1931 / 1522 / 703
Регистрация: 17.11.2012
Сообщений: 6,585
28.12.2016, 22:23 20
Цитата Сообщение от _NE_KAKIX_IMEN_ Посмотреть сообщение
Все ровно ошибка!
какая?
0
28.12.2016, 22:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2016, 22:23
Помогаю со студенческими работами здесь

Как правильно построить БД и запрос
Здравствуйте.Нужна ваше помощь в создании бд. Задание следующее: Создать бд,содержащую данные:...

Как правильно построить запрос?
Собственно вся проблема продемонстрирована на прилагаемом рисунке. В некой таблице, существуют два...

Как правильно построить запрос
Добрый день) Имеется таблицы в БД содержащая строки: Дата заказа-DZ, дата выполнения-DW и вид...

Как правильно построить запрос для графика?
Добрый день всем. Изначально в базе есть две таблицы - План и Факт. В них заносятся даты и суммы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru