80-memoriaDB.php

1<?php
2// attende l'invio di un numero e un testo in due messaggi separati
3
4// ATTENZIONE: usa SQLite per semplicità ma non può gestire la concorrenza [2]
5// create table messaggi( id int primary key, testo varchar(100), numero int);
6// per creare il file del db in assenza di alternative: https://sqliteonline.com/
7$botToken = "metti_qui_il_tuo_id";
8$sitoApi = "https://api.telegram.org/bot".$botToken;
9$content = file_get_contents("php://input");
10$ricevuto = json_decode($content, true);
11$chatId = $ricevuto['message']['chat']['id'];
12$valore = $ricevuto['message']['text'];
13
14// connessione al database, attenzione ai diritti di accesso ai file
15// https://www.php.net/manual/en/pdo.construct.php
16$db = new PDO('sqlite:database.sqlite3');
17
18// inserisco una riga "vuota" per la chat soltanto se non c'è già
19$db->query("INSERT OR IGNORE INTO messaggi(id) VALUES($chatId)"); // [1]
20
21// https://www.php.net/manual/en/function.is-numeric.php
22if(is_numeric($valore)){
23    $db->query("UPDATE messaggi set numero=$valore WHERE id=$chatId");
24    $testoRisposta = "ok, ora scrivi un testo";
25} else {
26    $db->query("UPDATE messaggi set testo='$valore' WHERE id=$chatId");
27    $testoRisposta = "ok, ora scrivi un numero";
28}
29// leggo di nuovo io dati per vedere se li ho inseriti tutti
30$risultato = $db->query("SELECT * FROM messaggi WHERE id=$chatId");
31$row  = $risultato -> fetch();
32echo $row["id"],"\n";
33if( isset($row['numero']) && isset($row['testo']) ){
34    // rispondo mettendo insieme numero e testo
35    $testoRisposta = "${row['testo']}#${row['numero']}\n";
36    // faccio pulizia nel db: i vecchi dati non mi servono più
37    $db->query("DELETE FROM messaggi WHERE id=$chatId");
38}
39
40sendMessage($chatId, $testoRisposta);
41
42function sendMessage($chatId,$text){
43    $url=$GLOBALS['sitoApi']
44        ."/sendMessage?chat_id=$chatId&parse_mode=HTML&text="
45        .urlencode($text);
46    file_get_contents($url);
47}
48

1

https://www.sqlite.org/lang_insert.html il manuale non è esattamente come quello di PostgreSQL

2

https://www.sqlite.org/cgi/src/doc/begin-concurrent/doc/begin_concurrent.md