Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: SQLIte Update or Insert

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
tonchikp
Отправлено: 15 Июля, 2017 - 15:49:05
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Дек. 2014  
Откуда: Россия


Помог: 0 раз(а)




Уважаемые форумчане! Требуется ваша помощь!

Подскажите, как правильно? Задача простая, нужно записать визит пользователя в базу данных.

  1. Подключаемся к базе данных.
  2. Обновляем запись о посетителе в таблице.
  3. А вдруг посетитель впервые и его записи нет, значит вставляем запись.
  4. Для развёртывания (для первого запуска): А вдруг таблицы нет, значит создаём таблицу.


Вопрос 1: Беспокоит то, что каждый раз при обновлении (update) куча холостых операций (create, insert), может это как то иначе решается, подскажите.
Вопрос 2: А как вы решаете задачи которые требуются однократно при первом запуске?
Вопрос 3: Подключение к базе данных. Может в другой файл переместить? Но тогда при перемещении файла будут проблемы, а если оставить - то постоянно открывается и закрывается подключение к базе данных в разных файлах.

CODE (text):
скопировать код в буфер обмена
  1. $db = new PDO('sqlite:file.sqlite');
  2.  
  3. $db -> exec("CREATE TABLE IF NOT EXISTS 'tableName' (
  4.  
  5. id PRIMARY KEY AUTOINCREMENT,
  6. user TEXT UNIQUE NOT NULL,
  7. visitCounter INTEGER DEFAULT '0'
  8.  
  9. )");
  10.  
  11. $db -> exec("INSERT OR IGNORE INTO 'tableName' (user) VALUES ('user1')");
  12.  
  13. $db -> exec("UPDATE 'tableName' SET visitCounter = visitCounter + 1 WHERE user = 'user1'");
  14.  
  15. unset($db);
 
 Top
Мелкий Супермодератор
Отправлено: 15 Июля, 2017 - 18:45:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Индивидуально для каждой субд. Поэтому поправил заголовок темы.

По существу - у вас sqlite на запись. На конкурентную запись. Значит вы осознанно его выбрали и делается одна или три операции вас не волнуют с вашими полутора пользователями.

tonchikp пишет:
Вопрос 1: Беспокоит то, что каждый раз при обновлении (update) куча холостых операций (create, insert), может это как то иначе решается, подскажите.

С sqlite расширением синтаксиса не знаком. По документации похоже, что нативно upsert не умеет делать.

tonchikp пишет:
Вопрос 2: А как вы решаете задачи которые требуются однократно при первом запуске?

Обычно схема данных статична по природе самой реляционной базы. Поэтому схема данных накатывается при раскатке кода проекта в рамках общего процесса установки и обновления. И не присутствует в коде взаимодействия с базой, а вызывается именно вне контекста сайта.

Для всяких коробочных продуктов - во фронтконтроллере проверяется существование (или отсутствие) какого-нибудь нужного файлика, например скрипта установщика. Соответственно этому становится ясно, есть уже база или ещё нет.

tonchikp пишет:
Вопрос 3: Подключение к базе данных. Может в другой файл переместить? Но тогда при перемещении файла будут проблемы, а если оставить - то постоянно открывается и закрывается подключение к базе данных в разных файлах.

depency injection, для маленьких приложений singleton всё так же удобен, вот это всё.
Открывать-закрывать на каждое обращение разумеется не надо.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB