С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157

Добавление записи, если не существует, обновление. если существует

02.03.2017, 17:30. Показов 4534. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Ситуация такая: Есть файл в который приходит ид ($content_id), нужно пройтись по таблице (в базе)
и если такой записи нет, то добавить ее, а если есть, то изменить значение поля count_elem.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  $content_id = $_POST['content_id'];
  $id_client = $_SESSION['id_client'];
  $order_num='0';
  $count_elem = 1;
$query = ("SELECT * FROM table WHERE (id_client='" . $id_client . "')AND (order_num='" . $order_num . "')");
$result = mysqli_query($link, $query) or die("Error " . mysqli_error($link));
$row = mysqli_fetch_array($result);
 
//Добавить запись если такой нет
  $query3 = ("INSERT INTO table(content_id, id_client, count_elem) 
                    VALUES('" . $content_id . "','" . $id_client . "','" . $count_elem . "')");
  $result3 = mysqli_query($link, $query3) or die("Error " . mysqli_error($link));
 
//Обновить данные если запись есть
  $count_elem = $row['count_elem'];
  $count_elem = $count_elem + 1;
  $query2 = ("UPDATE table SET count_elem=" . $count_elem . " WHERE (id_client='" . $id_client . "')
                               AND (content_id='" . $content_id . "')AND (order_num='" . $order_num . "')");
  $result2 = mysqli_query($link, $query2) or die("Error " . mysqli_error($link));
  $count_elem = 1;
Вид таблицы в базе:
id_table(AI) | content_id(int) | count_elem(int) | id_client(int) | order_num(int)


Подскажите, как мне сделать проверки (если есть запись, и если нет записи), Как пройтись по таблице и проверить???
Полностью одинаковых записей быть не может!!

Добавлено через 27 минут
Для обновления записи сделала такую проверку, работает
PHP
1
2
3
4
5
6
7
8
9
10
while ($row = mysqli_fetch_array($result)) {
if($row['content_id']>='1') {
      $count_elem = $row['count_elem'];
      $count_elem = $count_elem + 1;
      $query2 = ("UPDATE table SET count_elem=" . $count_elem . "
                       WHERE (id_client='" . $id_client . "')AND (content_id='" . $addrow . "')");
      $result2 = mysqli_query($link, $query2) or die("Error " . mysqli_error($link));
      $count_elem = 1;
    }
 }
Но не знаю как сделать проверку если нету записи, может кто знает??
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.03.2017, 17:30
Ответы с готовыми решениями:

Если существует в переменной символ, то
Вот не могу сообразить! Вот в таблице есть допустим три строки: id, title, text. И они выводятся на странице. Как сделать так, что если...

Не создавать запись в БД если она уже существует а просто обновить
Доброго всем дня. Ситуация такая, есть БД MSSQL и php скрипт добавления данных Задача в следующем, как реализовать так чтобы, если...

404 не отдается апачем в случае если страница не существует?
Так не работает <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ -

17
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
02.03.2017, 20:48
Цитата Сообщение от DJestin Посмотреть сообщение
Но не знаю как сделать проверку если нету записи, может кто знает??
PHP
1
2
3
4
5
6
7
8
if($row['content_id']>='1') { 
...
} else {
//Добавить запись если такой нет
  $query3 = ("INSERT INTO table(content_id, id_client, count_elem) 
                    VALUES('" . $content_id . "','" . $id_client . "','" . $count_elem . "')");
  $result3 = mysqli_query($link, $query3) or die("Error " . mysqli_error($link));
}
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
02.03.2017, 20:51
Для этого предназначения конструкция INSERT ... ON DUPLICATE KEY UPDATE.
Только нужно назначить ключевое поле, которое участвует в запросе (возможно, составной).
1
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
03.03.2017, 11:43  [ТС]
FloppyDisc, спасибо, но я и сама догадалась поставить else, но он не работает, if срабатывает(если находит в таблице content_id), а else нет.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$query = ("SELECT * FROM table WHERE (content_id='" . $content_id . "')");
$result = mysqli_query($link, $query) or die("Error " . mysqli_error($link));
while ($row = mysqli_fetch_array($result)) {
if($row['content_id']>='1') {
      $count_elem = $row['count_elem'];
      $count_elem = $count_elem + 1;
      $query2 = ("UPDATE table SET count_elem=" . $count_elem . "
                 WHERE (id_client='" . $id_client . "')AND (content_id='" . $content_id . "')");
      $result2 = mysqli_query($link, $query2) or die("Error " . mysqli_error($link));
      $count_elem = 1;
    }
 }else{
   $query3 = ("INSERT INTO table(content_id, id_client, count_elem)
                VALUES('" . $content_id . "','" . $id_client . "','" . $count_elem . "')");
    $result3 = mysqli_query($link, $query3) or die("Error " . mysqli_error($link));
  }
Я думаю что причина в этом WHERE (content_id='" . $content_id . "'), если он не находит его в таблицы то while и не срабатывает, а и соответственно if и else, а как по другому сделать не знаю.. Может есть варианты??
________________________________________ ________________________________________ ___________________



Добавлено через 4 минуты
Para bellum, Попробовала, но он просто добавляет одну и ту же несколько раз, может я не так что сделала
Вот как я сделала:
PHP
1
2
3
$query4 = ("INSERT INTO table(content_id, id_client, count_elem)
       VALUES('" . $content_id . "','" . $id_client . "','" . $count_elem . "')ON DUPLICATE KEY UPDATE count_elem=count_elem+1");
$result4 = mysqli_query($link, $query4) or die("Error " . mysqli_error($link));
Может знаете как мне доработать этот пример, что бы если запись есть поменять count_elem на (count_elem+1)??
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
03.03.2017, 12:37
Цитата Сообщение от DJestin Посмотреть сообщение
может я не так что сделала
Назначили ключ для поля "content_id"?
0
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
03.03.2017, 16:00  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
Назначили ключ для поля "content_id"?
ээм а как его назначить??
У меня только этот запрос и все
PHP
1
2
3
$query4 = ("INSERT INTO table(content_id, id_client, count_elem)
       VALUES('" . $content_id . "','" . $id_client . "','" . $count_elem . "')ON DUPLICATE KEY UPDATE count_elem=count_elem+1");
$result4 = mysqli_query($link, $query4) or die("Error " . mysqli_error($link));
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
03.03.2017, 16:20
Цитата Сообщение от DJestin Посмотреть сообщение
ээм а как его назначить?
Зайдите в PhpMyAdmin (или что Вы используете для администрирования базы). Зайдите в базу и выполните такой запрос:
SQL
1
ALTER TABLE `имя таблицы` ADD UNIQUE(`content_id`);
Добавится уникальный индекс для поля content_id. Собственно, по нему и будет ориентироваться "ON DUPLICATE".
Ваш запрос менять не нужно. Добавьте только ключ и всё.
1
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
03.03.2017, 16:53  [ТС]
Para bellum, Спасибо, огромное, все заработало как нужно!!!

Добавлено через 8 минут
Para bellum, а не ни совсем так как нужно работает
Как мне сделать что бы он проверял и изменял только у тех у кого $id_client = $_SESSION['id_client'] и $order_num='0' ???
типо WHERE можно поставить ??

Добавлено через 3 минуты
Сейчас получается если я захожу под $id_client=1 все работает как нужно, затем захожу под $id_client=2 и те content_id которые я добавила с $id_client=1 я не могу добавить для $id_client=2

Добавлено через 3 минуты
Я так понимаю что с этим ALTER TABLE `имя таблицы` ADD UNIQUE(`content_id`) content_id вообще не будут повторятся а мне нужно чтобы повторялись для разных $id_client, $order_num.
Нужно что бы не повторялось для например $id_client=1, $order_num=1
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
03.03.2017, 19:22
Цитата Сообщение от DJestin Посмотреть сообщение
Я так понимаю что с этим ALTER TABLE `имя таблицы` ADD UNIQUE(`content_id`) content_id вообще не будут повторятся а мне нужно чтобы повторялись для разных $id_client, $order_num.
Понял. Значит выполняем такие запросы:
SQL
1
2
/* Удаление старого индекса */
ALTER TABLE `имя таблицы` DROP INDEX `content_id`;
SQL
1
2
/* Добавление составного индекса */
ALTER TABLE `имя таблицы` ADD UNIQUE(`content_id`, `id_client`);
Можно сделать и PRIMARY KEY, если такового в таблице нет. Но и UNIQUE нормально.
0
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
06.03.2017, 13:55  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
/* Добавление составного индекса */
ALTER TABLE `имя таблицы` ADD UNIQUE(`content_id`, `id_client`);
Сделала, но когда повторно приходит content_id , то выдает ошибку:
Error Duplicate entry '5-1' for key 'content_id' , а должен менять количество count_elem

Добавлено через 13 минут
И должен учитываться еще и order_num, так как
content_id не должен повторятся для (id_client и order_num), а если id_client - тот же ,но order_num поменялся, то content_id могут быть те же, мм я может не очеть понятно объяснила что имменно мне нужно покажу нагляднее как оно должно быть в в таблице:
id_table(AI) | content_id(int) | count_elem(int) | id_client(int) | order_num(int)
1 | 1 | 1 (изм.) | 1 | 11111
2 | 2 | 1 (изм.) | 1 | 11111
3 | 3 | 1 (изм.) | 1 | 11111
4 | 1 | 1 (изм.) | 1 | 22222 - тот же id_client, но другой order_num
5 | 2 | 1 (изм.) | 1 | 22222
6 | 3 | 1 (изм.) | 1 | 22222
7 | 1 | 1 (изм.) | 2 | 33333 - другой id_client, и другой order_num
8 | 2 | 1 (изм.) | 2 | 33333
9 | 3 | 1 (изм.) | 2 | 33333
10 | 3 | 1 (изм.) | 2 | 44444 - другой order_num

Добавлено через 5 минут
count_elem ( 1 (изм.)) - должен изменять (count_elem+1) если повторно пришел content_id (если он уже есть в таблице для данного id_client и order_num )
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
06.03.2017, 14:33
Цитата Сообщение от DJestin Посмотреть сообщение
Error Duplicate entry '5-1' for key 'content_id' , а должен менять количество count_elem
Запрос покажите.
0
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
06.03.2017, 15:05  [ТС]
Para bellum, вот
SQL
1
2
3
  $query3 = ("INSERT INTO table(content_id, id_client, count_elem)
                VALUES('" . $content_id. "','" . $id_client . "','" . $count_elem . "')");
      $result3 = mysqli_query($link, $query3) OR die("Error " . mysqli_error($link));
Добавлено через 7 минут
Поменяла на этот?:
SQL
1
2
3
$query4 = ("INSERT INTO table(content_id, id_client, count_elem)
       VALUES('" . $content_id . "','" . $id_client . "','" . $count_elem . "')ON DUPLICATE KEY UPDATE count_elem=count_elem+1");
$result4 = mysqli_query($link, $query4) OR die("Error " . mysqli_error($link));
Работает, но если order_num меняется , то те content_id которые были в предыдущем order_num не добавляются
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
06.03.2017, 15:13
DJestin, а почему Вы решили вернуть всё в исходное состояние? Пожалуйста, сделайте, как Вам советовали ранее:
PHP
1
2
3
4
5
6
7
8
$query = "
    INSERT INTO `table` (`content_id`, `id_client`, `count_elem`)
        VALUES ('$content_id', '$id_client', '$count_elem')
    ON DUPLICATE KEY
    UPDATE `count_elem` = `count_elem` + 1
";
       
$result = mysqli_query($link, $query) or die(mysqli_error($link));
От всего сердца Вас прошу.

Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от DJestin Посмотреть сообщение
Добавлено через 7 минут
Пока печатал ответ -- Вы и сами поняли, что нужно исправить.


Цитата Сообщение от DJestin Посмотреть сообщение
но если order_num меняется , то те content_id которые были в предыдущем order_num не добавляются
При чём тут order_num, если мы ключ установили на поля content_id и id_client?
0
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
06.03.2017, 15:37  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
При чём тут order_num, если мы ключ установили на поля content_id и id_client?
это понятно а как сделать что бы еще и order_num учитывался??
Просто сейчас ситуация такая, что если..
Пример:
id_client =1
order_num = 1 , то приходящие content_id добавляются, если приходит повторный, то суммируется (все так как мне и нужно)
НО, если тот же id_client =1
но уже с другим order_num = 2, то приходящие content_id те которые добавились когда был order_num = 1 не добавляются в order_num = 2 (а должны добавляться)
Как то так, я выше писала как примерно должна выглядеть таблица
id_table(AI) | content_id(int) | count_elem(int) | id_client(int) | order_num(int)
1 | 1 | 1 (изм.) | 1 | 11111
2 | 2 | 1 (изм.) | 1 | 11111
3 | 3 | 1 (изм.) | 1 | 11111
4 | 1 | 1 (изм.) | 1 | 22222 - тот же id_client, но другой order_num, content_id такие же как и в order_num= 11111
5 | 2 | 1 (изм.) | 1 | 22222
6 | 3 | 1 (изм.) | 1 | 22222
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.03.2017, 09:06
Лучший ответ Сообщение было отмечено DJestin как решение

Решение

Цитата Сообщение от DJestin Посмотреть сообщение
то приходящие content_id те которые добавились когда был order_num = 1 не добавляются в order_num = 2 (а должны добавляться)
Добавьте ещё и order_num в составной ключ, в таком случае.
1
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
07.03.2017, 10:20  [ТС]
Para bellum, сделала
SQL
1
ALTER TABLE `имя таблицы` ADD UNIQUE(`content_id`, `id_client`, `order_num`);
но, ни чего не изменилось..

Добавлено через 42 секунды
Запрос менять не нужно??

Добавлено через 7 минут
АА, заметила что если в order_num=1 пришли какие то content_id (например 1, 2 и 3), то в order_num=2, эти же content_id не добавляются , но если они приходят(такие же как и в order_num=1 ) и если посмотреть в базе то они меняют свои count_elem для order_num=1.
Но по идее если я уже с order_num=2 работаю, то в order_num=1 ничего меняться не должно. Эти же content_id (1, 2 и 3) должны добавится для order_num=2.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.03.2017, 10:38
Лучший ответ Сообщение было отмечено DJestin как решение

Решение

Вы удалили старый ключ, который для двух полей был?
1
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
07.03.2017, 11:24  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
Вы удалили старый ключ, который для двух полей был?
ЭЭ, нет )), спасибо, старый удалила и все заработало так как нужно. Еще раз спасибо за помощь!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.03.2017, 11:24
Помогаю со студенческими работами здесь

Проверка на существование файла, если существует, то выдать сообщение и открыть его
есть файл С:\1.txt. на странице кнопка. при нажатии на кнопку необходимо проверить его существование, и если он существует(создан) то...

Поиск записи Обновление\добавление
Доброго времени суток! Есть цикл $i = 1; foreach ($p as $a) { echo $i++ . '. ' . $a . "<br />"; ...

Если h-файл существует, подключить его, если не существует, проигнорировать
Как это сделать?

Добавить если не существует, показать если существует (SQL-запрос)
Мир всем и привет Как задать sql запрос в adoquery на существование записи: "если есть показать, если нет добавлять". База у...

Как открыть файл на чтение и запись, создав его, если его не существует, и перезаписать, если он существует?
Как открыть файл на чтение и запись, создав его, если его не существует, и перезаписать, если он существует?


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru