Trovare record nel database partendo da id non sequenziali

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
Ciao,
come da titolo, sto cercando una soluzione semplice ad un problema complesso, cioè devo estrarre da una tabella, alcuni record non sequenziali non a caso, sarebbe facile, ma con determinati ID.

In pratica ho costruito un problema di news per un sito interno alla nostra intranet, in prima stesura funzionava bene ma non mi permetteva di gestire correttamente le news, cioè selezionavo tutte quelle da leggere e lui non me le faceva più leggere una volta selezionate appunto. Tutte quelle da una certa data!

A me serve invece che l'utente legge anche quelle vecchie se non selezionate e così ho creato nel record utente un campo json, in cui ci sono gli ID di tutte le news che lui ha già letto.

Perfetto!

E no, perché in pratica queste non hanno un ID sequenziale ma casuale, stabilito da quelle che lui ha selezionato come lette.

Un po' come quando in un client di posta uno segna come lette certe email ed altre no.

In realtà la differenza è che alla prossima apertura del programma, io voglio fargli vedere solo quelle che non ha ancora letto, mentre le altre no. E siccome la selezione di quelle già viste è casuale, come faccio la query al database?

In pratica e semplicemente, estraggo il json memorizzato nel campo utente, in questo ci sono memorizzati gli ID delle news già lette, facciamo per esempio che lui ha già letto la 1, la 5 e la 12 io a questo punto devo estrarre la 2, la 3, la 4, la 6, la 7, eccetera.

Ma non so come fare la query, dovrei forse interagire tramite gli insiemi? O bo!
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
json, in cui ci sono gli ID di tutte le news che lui ha già letto.
trasforma questo json in una stringa fatta da ID separati da una virgola e poi fai una select con clausola where campo not in (stringa)
ovvero,
select * from news where IDnews not in (1, 5, 12)
quindi estraendo solo i record non letti

1642244381461.png
 

Allegati

  • 1642244298766.png
    1642244298766.png
    9,6 KB · Visite: 121
Ultima modifica:

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
Come immaginavo, dovevo interagire con gli insiemi.

Bene funziona ma ho un problema, costruisco la stringa CSV che è una stringa appunto, come la metto nella query?
Cioè se la passo con PDO essendo una stringa mi viene inserita come tale e non va bene, dato che i parametri devono essere interi.

Per ora ho realizzata una porcata invereconda, cioè ho inserito direttamente nella query la stringa contenente il CSV, non c'è un problema di sicurezza dato che comunque i dati provengono direttamente dal database e non possono essere manipolati dall'esterno, ma non mi piace.
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
se anziché un campo json avessi una tabella delle news lette per utente, potresti fare la stessa cosa con
select .... where IDnews not in (select ..... where IDuser = :IDuser)
evitando limiti sugli elementi memorizzabili

i dati provengono direttamente dal database e non possono essere manipolati dall'esterno
oppure, .... accontentati
 
  • Wow
Reactions: MarcoGrazia

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
vedi se qui trovi una soluzione,
"Prepared statements and IN clause"
 
  • Like
Reactions: MarcoGrazia

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
vedi se qui trovi una soluzione,
"Prepared statements and IN clause"
Sì è interessante ma presuppone che io abbia una array, mentre ho una stringa CSV come partenza.
JSON l'avevo utilizzato perché volevo o meglio pensavo di dover manipolare i dati dopo averli inseriti e json è facilmente trasformarlo in un array e viceversa anche in PHP, ma poi ho modificata la struttura del programma e quindi uso un VARCHAR in cui inserisco il CSV che poi passo direttamente all'istruzione SQL, come dicevo lo passo con una semplice assegnazione, senza un effettivo controllo, perché avevo provato a effettuare il binding ma non c'è verso di passarlo senza che il PDO lo tratti come stringa, poi l'istruzione IN dell'SQL non lo accetta, perché vuole una sequenza di interi.

Ho provato a trasformarlo in un array, ma è pur sempre un'istruzione in più che non ritenevo necessaria.
PHP:
$listaID = explode(',', $newsLette['news_lette']);
$sql = 'SELECT N.*, U.nome, U.cognome FROM news AS N ';
$sql .= 'LEFT JOIN utenti AS U ON U.id_ute = N.id_ute ';
$sql .= 'WHERE N.visibile = 1 AND N.id_news NOT IN ( ? ) ORDER BY N.data_inserimento DESC; --';
$handle = $pdo->prepare($sql);
$handle->execute($listaID);
//  Poi prosegue con la lettura

Alla fine, dato che il programma è in una LAN alquanto protetta dall'esterno, e il dato proviene direttamente da un database ho preferito alleggerire il codice il più possibile inserendo direttamente la stringa CSV nella QUERY SQL con un'assegnazione PHP.
Così il tutto è diventato:
PHP:
$sql = 'SELECT N.*, U.nome, U.cognome FROM news AS N ';
$sql .= 'LEFT JOIN utenti AS U ON U.id_ute = N.id_ute ';
$sql .= 'WHERE N.visibile = 1 AND N.id_news NOT IN ( ' . $newsLette['news_lette'] . ' ) ORDER BY N.data_inserimento DESC; --';
$handle = $pdo->prepare($sql);
$handle->execute();
e funziona.
Probabilmente perché alla fine l'SQL vede tutta la stringa $sql come un'unica istruzione e non distingue più tra stringhe di caratteri o valori interi. E' una mia opinione, ma penso sia questo il motivo, solo non è ne sicura al 100% ( e chi lo è mai ) ne elegante.

PS conoscevo il sito dei delusi dal PHP, anche se non ci andavo più da anni in effetti, ma ho anche letto cose che... se un'istruzione esiste in SQL è meglio usare quella piuttosto che aumentare il numero di istruzioni in PHP, per esempio con il LIKE una volta anche io costruivo la stringa da passare con il PHP come mostrato nel sito, ora uso l'istruzione SQL CONCAT.
SQL:
SELECT nome FROM utenti WHERE nome LIKE CONCAT( "%", :frase, "%") LIMIT 1 ; --
ma sono solo metodi di programmazione, non il vangelo :)
 
  • Like
Reactions: marino51
Discussioni simili
Autore Titolo Forum Risposte Data
B Non riesco a trovare i cognomi con i caratteri speciali in Access (Microsoft 365) MS Access 0
R Trovare la Tabella del pagamento su WooCommerce WordPress 0
G Nuova Idea su come trovare clienti per sviluppo web Discussioni Varie 6
W Errore di run-time di Microsoft VBScript error '800a0035' Impossibile trovare il file Classic ASP 0
W Impossibile Trovare Provider Classic ASP 7
G [PHP] Trovare tutti i file a un arl PHP 2
K [PHP] Trovare le cartelle online PHP 1
W [PHP] dirmi dove posso trovare.. Offerte e Richieste di Lavoro e/o Collaborazione 1
E salve tutti spero si essere di aiuto e di trovare aiuto Presentati al Forum 2
L Trovare immagini belle per siti Discussioni Varie 1
Federico.Marcelo Come trovare una corretta mailing list italiana Email Marketing 7
C [PHP] Trovare simbolo unicode in stringa PHP 1
V [Visual Basic] trovare versione di un .exe con vb6 Visual Basic 0
D [PHP] Trovare le cartelle online PHP 3
N [VENDO] Articolo SEO "I migliori siti per trovare offerte di lavoro in Germania". Offerte e Richieste di Lavoro e/o Collaborazione 0
C [PHP] Trovare se la parola è presente in una pagina PHP 1
V [PHP] Non riesco a trovare errore PHP 25
C Trovare coordinate del quadrato intorno ad un punto centrale conoscendo la distanza PHP 1
filippino Chiavi a corrispondenza inversa per i risultati organici? (Era: come NON farsi trovare con date chia SEO e Posizionamento 4
S Comando per trovare file PHP 0
F Trovare foto da Codici Prodotti E-Commerce 6
Z Tool per trovare Long Tail SEO e Posizionamento 0
MarcoGrazia Come trovare parole similari nel database? PHP 1
V Trovare numero unico minore PHP 1
IImanuII Trovare del testo in una stringa. PHP 1
IImanuII Trovare un'immagine PHP 0
W Dove trovare temi per Drupal 7 gratuiti ed affidabili? CMS (Content Management System) 1
C Trovare parole con le doppie PHP 2
A GoGo Voglio creare un sito come ustream.tv, dove posso trovare uno script come ustream.tv? Discussioni Varie 0
M PHP/MySQL: Sistema per trovare multiaccount PHP 7
D Trovare dimensione cella tabella Javascript 3
asevenx trovare nome dell'utente dopo login PHP 1
F Trovare clienti Discussioni Varie 3
F Trovare una riga conoscendo un valore (MYSQL) PHP 2
novello88 Trovare domini liberi e/o scaduti Domini 5
StarFish [Prestashop] Dove posso trovare dei template gratuiti per Prestashop CMS (Content Management System) 2
A Trovare un "percorso" in un file PHP... WordPress 1
S trovare span con classe dentro un div jQuery 2
Monital Trovare un array in txt e modificarlo PHP 16
neo996sps Dove trovare omini bianchi 3D [era: Omini bianchi, avete presente?] Webdesign e Grafica 0
emanuelevt trovare file PHP 1
G dove posso trovare un modello di disclaimer e di privacy? Leggi, Normative e Fisco 2
LaKanka ereg() per trovare file di cui so solo parte del nome PHP 3
G dove posso trovare i forum con le cartelle? HTML e CSS 1
max1850 Trovare il num. di ricerche mensili di una keyword SEO e Posizionamento 2
G Trovare su Google il proprio sito dalle immagini SEO e Posizionamento 7
L Dove posso trovare pulsanti in flash? Flash 3
K Impossibile trovare ISAM installabile ASP.NET 1
A Soulmet: annunci online per incontrare nuovi amici e trovare l'anima gemella. Presenta il tuo Sito 1
L Come trovare una licenza Flash 1

Discussioni simili