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
Форумы портала PHP.SU :: Версия для печати :: SQLIte Update or Insert
Форумы портала PHP.SU » » Работа с СУБД » SQLIte Update or Insert

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

1. tonchikp - 15 Июля, 2017 - 15:49:05 - перейти к сообщению
Уважаемые форумчане! Требуется ваша помощь!

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

  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);
2. Мелкий - 15 Июля, 2017 - 18:45:08 - перейти к сообщению
Индивидуально для каждой субд. Поэтому поправил заголовок темы.

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

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

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

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

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

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

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

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

 

Powered by ExBB FM 1.0 RC1