Info su query [PHP + MYSQL]

crc_error

Biker poeticus
5/5/08
3.530
11
0
44
Besana (MB)
Visita sito
Bike
Giant Trance 3 2015
Ciao a tutti, come da titolo avrei bisogno di un aiuto per la creazione di una query che faccia "selezione" sul testo contenuto in una tabella mysql.

Nel codice della pagina mi ritrovo con un array contenente una lista di nomi. Da ognuno di questi nomi dovrei cercare i messaggi inseriti, contarli e stamparli.

Fin qua nessun problema, pensavo fosse una cosa semplice e invece già in partenza ho un problemino.
Il problema è proprio nei nomi ricercati che sono p.e.: Marco, Marco 1, Marco2, Franco, Roberto1 Roberto 3, ecc..

P.e.: Come faccio a cercare tutti i messaggi contenenti il testo Marco?

Attualmente faccio così:

PHP:
for($e = 0; $e < count($arrayNomi); $e++) {
 $query = $con->query("SELECT Testo FROM tabella WHERE testo LIKE '".$arrayNomi[$e]."%'");
 while ($esito = $query->fetch_object()) {
  echo $esito->Testo
 }
}

Però in questo modo quando cicla "Marco", nel while mi vengono postati anche i messaggi di Marco 1 e Marco2.
Se volessi solo i messaggi di Marco?

I testi hanno in comune solo il fatto di cominciare con in nome dell'autore..
 

ginogino

Biker perfektus
7/6/03
2.965
482
0
58
Sarzana (SP)
Visita sito
Bike
Giant Reign 2008, Gary Fisher Paragon 2008, Specialized Camber Comp 29er 2012, turbo levo 2019, Niner RLT Steel 2019
Nel campo dove fai la ricerca, che tu hai chiamato "testo", c'è contenuto solo il nome dell'autore o ci sono altri dati, nel caso ci sia solo il nome dell'autore dovresti cambiare la query così:

SELECT Testo FROM tabella WHERE testo=MARCO

se invece il campo "testo" contiene anche altri dati, la cosa non funziona.

Ciao
 

crc_error

Biker poeticus
5/5/08
3.530
11
0
44
Besana (MB)
Visita sito
Bike
Giant Trance 3 2015
Nel campo dove fai la ricerca, che tu hai chiamato "testo", c'è contenuto solo il nome dell'autore o ci sono altri dati, nel caso ci sia solo il nome dell'autore dovresti cambiare la query così:

SELECT Testo FROM tabella WHERE testo=MARCO

se invece il campo "testo" contiene anche altri dati, la cosa non funziona.

Ciao

Purtroppo ci sono altri dati.. un esempio dei record inseriti potrebbe essere così:

Codice:
ID | Testo
1  | Marco sono arrivato a casa
2  | Roberto io sono ancora in viaggio
3  | Marco 1 io ci sono quasi
4 .. via così

Il testo purtroppo non è separato da nessun "carattere speciale" o che.
 

ginogino

Biker perfektus
7/6/03
2.965
482
0
58
Sarzana (SP)
Visita sito
Bike
Giant Reign 2008, Gary Fisher Paragon 2008, Specialized Camber Comp 29er 2012, turbo levo 2019, Niner RLT Steel 2019
Purtroppo ci sono altri dati.. un esempio dei record inseriti potrebbe essere così:

Codice:
ID | Testo
 1  | Marco sono arrivato a casa
 2  | Roberto io sono ancora in viaggio
 3  | Marco 1 io ci sono quasi
 4 .. via così
Il testo purtroppo non è separato da nessun "carattere speciale" o che.

Infatti, l'avevi anche scritto, per me era ora di andare a letto.

Purtroppo allora non c'è modo di estrapolare solo "Marco" se all'interno del campo c'è anche "Marco 1".

L'unica soluzione sarebbe aggiungere un campo identificatore, dove inserire un ID per ogni autore, quindi nella tua tabella modificata sarebbe:

ID, ID_AUTORE, TESTO

e sarebbe da creare anche una tabella autori così composta:

ID_AUTORE, NOME AUTORE

da mettere in relazione con l'altra tabella.

Ciao
 

crc_error

Biker poeticus
5/5/08
3.530
11
0
44
Besana (MB)
Visita sito
Bike
Giant Trance 3 2015
Ci avevo pensato anche io, ma purtroppo oramai il db si è ingigantito e sono più di 20000 record da modificare...

Pensavo ci fosse un modo di "discriminare" con LIKE..
In alternativa potrei fare così:

- mettere il risultato in un array.
- Invertire l'array nomi
- confrontare l'array nomi (invertito) con quello testo.
- Man mano che trova corrispondenze, toglie i valori dall'array testo.
- salvare il risultato del confronto in un nuovo array (o una tabella mysql in modo da velocizzare il recupero dei dati)

Sarà un pò lunga come cosa ma dovrebbe funzionare. Poi una volta inserito tutto in una nuova tabella ripescare i dati sarà velocissimo.

Che dici può funzionare?
 

Teech

Biker ciceronis
25/8/04
1.598
1
0
46
Zola Predosa (Bo)
www.neptunes.it
Non conosco il PHP e quindi non riesco ad aiutarti a livello di linguaggio, ma potresti usare le Regular Expression cercando/scartando tutte le occorrenze di una determinata stringa all'interno di un testo.
 

mollastifreni

Biker novus
11/12/09
12
0
0
viterbo
Visita sito
Se i nomi sono tutta una parola puoi aggiungere un carattere di check al nome di ricerca nell'array, per es "#" quindi prima del carattere jolli % metti lo stesso a controllo.
Ovviamente con un codice di identificazione utente la cosa sarebbe ottimale.

dopo aver costruito l'array con il carattere aggiuntivo ad ogni nome, prova cosi' :

for($e = 0; $e < count($arrayNomi); $e++) {
$query = $con->query("SELECT Testo FROM tabella WHERE testo LIKE '".$arrayNomi[$e]."#%'");
while ($esito = $query->fetch_object()) {
echo $esito->Testo
}
}

ciao.
 

ricchiRock

Biker serius
7/9/09
245
32
0
39
Pietraviva, Bucine (Ar)
Visita sito
Bike
Commencal Supreme 29 + Ancillotti Scarab EVO 29 + quelle di ferro
il mio consiglio è di sistemare il DB creando una tabella di Autori.
Cercare di estrapolare il nome dal messaggio potrà funzionare, ma costa molto in termini di complessità dell'algoritmo e di utilizzo del DB.
Forse ti merita trovare una soluzione per modificare il db.
La tabella dei messaggi puoi lsciarla identica.
Aggiungi la tabella degli autori, e una tabella per rappresentare la relazione Autori-Messaggi se proprio non vuoi modificare la tabella messaggi.
;)
 

mollastifreni

Biker novus
11/12/09
12
0
0
viterbo
Visita sito
La soluzione che ho postato a me sembra funzionale anche senza cambiare struttura al Db. Un esempio è :

mettiamo che si cerchino i messaggi di marco e marco 1, in arraynomi(0) metto "marco#" e in arraynomi(1) metto "marco 1#".

la sintassi quindi elaborata diventerebbe nel caso 1:
"Select Testo from Tabella Where Testo like 'Marco#%'"
mentre nel secondo:
"Select Testo from Tabella Where Testo like 'Marco 1#%'"

Funziona, senza creare quindi conflitti.
:celopiùg:
 

crc_error

Biker poeticus
5/5/08
3.530
11
0
44
Besana (MB)
Visita sito
Bike
Giant Trance 3 2015
Ciao, per ora ho risolto così:

E' un modo un pò contorto ma ce l'ho fatta..

In breve:
Ho modificato il codice iniziale. Anzichè stampare il testo l'ho buttato in un array
Dopodichè ho cercato nell'array i nomi simili a quello da cercare e li ho messi in un'altro array.
Ho invertito l'array e l'ho reso unico.
Infine ho ciclato l'array con le stringhe. All'interno di questo for ho ciclato anche l'array con i nomi simili.
Con un if ho estratto tutte le stringhe corrispondenti al nome da cercare e scartato le altre.
E buttato tutto in una nuova tabella con gli autori..

@mollastifreni: Ma in quel modo dovrei avere o aggiungere il carattere di controllo nei record della colonna testi.. No? :nunsacci:
 

crc_error

Biker poeticus
5/5/08
3.530
11
0
44
Besana (MB)
Visita sito
Bike
Giant Trance 3 2015
Ma cavolo è vero! Chissà perchè non ci avevo pensato.. Son stato li a fare un giro del cavolo e a buttare giù un casino di codice quando potevo risolvere con così poche righe..
Prima avevo dato un'occhiata al codice e non so perchè non riuscivo a capire cosa facesse e non so perchè davo per scontato che non potesse funzionare.. (saranno i postumi del capodanno o qualche panettone mal digerito .. :-))

Comunque grazie! Lunedì lo provo in test e vedo che succede..
Ti saprò dire! ;-)
Ciao!
 

mollastifreni

Biker novus
11/12/09
12
0
0
viterbo
Visita sito
@mollastifreni: Ho provato ma la query non funziona.. Dove sbaglio?

Hai ragione scusa, rivedendo il tutto a mente fresca, se non hai modo di inserire il carattere "#" dopo il nome nel momento che registri i messaggi, come l'avevo messa io non puo' andare.
L'unico modo che hai di sfangarla è quello di scrivere un carattere, anche un punto o duepunti tra la fine del nome e l'inizio del messaggio, in questo modo puoi fare il controllo mettendo questo carattere prima del giolly nella query.
per es. se nei dati tu avessi :
Marco: Ciao
Marco 1: come va' ?
Marco 1: tutto a posto ?
Marco: si qui tutto bene e da te ?
Franco: non ce male anche qui
Marco 2: ciao amici

la query diventa :

for($e = 0; $e < count($arrayNomi); $e++) {
$query = $con->query("SELECT Testo FROM tabella WHERE testo LIKE '".$arrayNomi[$e].":%'");
while ($esito = $query->fetch_object()) {
echo $esito->Testo
}
}

lasciando l'array nella modalità classica coi nomi senza altro es. ."Marco,Marco 1,Franco" etc.etc.

ciao
:celopiùg:
 

zoorlen

Biker celestialis
14/12/04
7.837
285
0
-
Visita sito
Bike
Graziella
Secondo me con una query secca non ci esci; il tuo metodo di cicli, controcicli, array mi sembra un po' contorto. Visto che non mi sembra che tu debba manovrare milioni di record io farei una like %nome% e poi scorrerei il resultset prendendo i risultati che matchano /[^\w]nome[^\w]/i. In questo modo selezioni solo le stringhe che contengono nome con vicino caratteri di punteggiatura: se nome vale Marco becchi ad esempio "Marco", "Marco:", ";Marco" e scarti "Marco1", "Piermarco" etc.
Detto questo... penso che nel 2010 scrivere SQL (a meno di non avere applicazioni critiche o per la mole di dati o per la velocità) sia un'attività piuttosto aberrante; esistono più o meno in tutti i linguaggi dei framework o delle librerie per la persistenza degli oggetti che consentono di scrivere codice più pulito, manutenibile, cross-database e sicuro (ad esempio il tuo codice non è robusto ad una "semplice" SQL injection).
 

crc_error

Biker poeticus
5/5/08
3.530
11
0
44
Besana (MB)
Visita sito
Bike
Giant Trance 3 2015
Secondo me con una query secca non ci esci; il tuo metodo di cicli, controcicli, array mi sembra un po' contorto. Visto che non mi sembra che tu debba manovrare milioni di record io farei una like %nome% e poi scorrerei il resultset prendendo i risultati che matchano /[^\w]nome[^\w]/i. In questo modo selezioni solo le stringhe che contengono nome con vicino caratteri di punteggiatura: se nome vale Marco becchi ad esempio "Marco", "Marco:", ";Marco" e scarti "Marco1", "Piermarco" etc.
Detto questo... penso che nel 2010 scrivere SQL (a meno di non avere applicazioni critiche o per la mole di dati o per la velocità) sia un'attività piuttosto aberrante; esistono più o meno in tutti i linguaggi dei framework o delle librerie per la persistenza degli oggetti che consentono di scrivere codice più pulito, manutenibile, cross-database e sicuro (ad esempio il tuo codice non è robusto ad una "semplice" SQL injection).

Grazie, per la risposta. Ormai con il metodo del ciclo-array ho fatto.
Però, come ulteriore test (per verifica dei dati) potrei provare a fare così..
I record non sono milioni ma sono comunque sopra i 20.000, un numero considerevole..

Purtroppo chi aveva fatto il db allora si è preoccupato poco del futuro e ha creato solo 3 colonne: id, stringa e data di inserimento.
Il fatto che non sia sicuro non è importante, questo codice gira solo in locale per estrarre i dati dalla vecchia tabella e reinserirli nella nuova.
Una volta finita la ri-organizzazione dei record il codice non girerà più.

Grazie ancora :celopiùg:
 

crc_error

Biker poeticus
5/5/08
3.530
11
0
44
Besana (MB)
Visita sito
Bike
Giant Trance 3 2015
Ciao, ho una nuova domandina...

Qualcuno sa se è possibile con la versione 5 di php collegarsi ad un vecchio DB MYSQL 3?
Fin'ora non ho trovato nessun connettore compatibile..
 

tettabeta

Biker dantescus
5/9/03
4.944
21
0
60
Oleggio
Visita sito
Detto questo... penso che nel 2010 scrivere SQL (a meno di non avere applicazioni critiche o per la mole di dati o per la velocità) sia un'attività piuttosto aberrante; esistono più o meno in tutti i linguaggi dei framework o delle librerie per la persistenza degli oggetti che consentono di scrivere codice più pulito, manutenibile, cross-database e sicuro (ad esempio il tuo codice non è robusto ad una "semplice" SQL injection).

Rispolvero questo 3d perche' sono in procinto di mettere mano a un DB Progress che gira da 20 anni (venti anni) e portarlo su qualcosa di opensource, facile da gestire, sicuro etc....

Quindi: se io voglio accedere a un DB in una LAN dove ci sono client Win (XP) e Linux (Ubuntu e Suse), quali sono le alternative esistenti ?

Come server pensavo a MySQL o Postrgres (Linux, ovviamente).

Ma come interfaccia utente non saprei cosa scegliere... chiedo a voi giovini quindi quale sia la soluzione migliore (opensource) per generare applicazioni neanche tanto astruse (magazzino, produzione, codici a barre, stampe varie) .

Grazie
(o )Beta
 

zoorlen

Biker celestialis
14/12/04
7.837
285
0
-
Visita sito
Bike
Graziella
Come server pensavo a MySQL o Postrgres (Linux, ovviamente).

Uhm... MySQL ora è di Oracle (passando per Sun), giusto? Con che licenza è distribuito? Dal punto di vista "tencnologico" penso si equivalgano, da quello "politico" non lo so.

Ma come interfaccia utente non saprei cosa scegliere... chiedo a voi giovini quindi quale sia la soluzione migliore (opensource) per generare applicazioni neanche tanto astruse (magazzino, produzione, codici a barre, stampe varie) .

Se io dovessi partire ora forse farei un front-end web con Django. A parte che mi piace da morire il Python, trovo che sia un progetto veramente ottimo: mi sembra un buon equilibrio tra pulizia formale (per scrittura e manutenzione) e robustezza (non avrà i formalismi di J2EE, ma non credo che tu voglia imbarcarti in ant, maven, 6 milioni di cartelle e file di configurazione solo per fare una web application stile "Hello, world"). Poi è ben documentato e (cosa da non sottovalutare) ha una buona comunità di sviluppatori; penso che si possa trovare aiuto in men che non si dica. Dovrebbe avere anche degli strumenti per la reportistica (pdf, excel non lo so). Il "succo" è che si possono definire i modelli come classi Python e lui ti fa al volo gli script SQL e le form di data entry e edit (con ruoli e policy di visibilità configurabili).
L'alternativa sono framework come CakePHP, CodeIgniter... anche questi ben fatti e documentati; vantaggi: il PHP è molto diffuso e ci sono un sacco di librerie già pronte (ad esempio per le tue esigenze di stampa penso tu possa trovare qualcosa di già pronto); svantaggi: è pur sempre PHP :))):
 
  • Mi piace
Reactions: tettabeta

Classifica giornaliera dislivello positivo

Classifica mensile dislivello positivo