Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21

    Implementare ricerca avanzata

    Sto realizzando il codice che deve effettuare la ricerca avanzata ma sto avendo un problema abbastanza grande.
    Siccome si tratta di un web services, sto utilizzando soap, php e java.
    Il problema sta in una parte della funzione della ricerca avanzata in java; infatti, dato che non tutti i campi posso essere riempiti non so come generalizzare la situazione. Prevedere tutte le possibili combinazioni di 8 campi è davvero impossibile.
    Il problema, nello specifico, viene fuori quando devo settare i placeholders del prepared statament.
    PHP passa un array che contiene sempre qualcosa in tutti i campi, ma se non è stata selezionato nulla per quel campo, mette una stringa vuota.
    Java riceve l'array e prepara correttamente la stringa con i placeholders per interrogare il database, ma quando poi devo settare il prepared statament sorgono i problemi, dato che non riesco a trattatare tutte le possibili combinazioni.
    Avete qualche idea per risolvere questo problema?
    Questa è la funzione
    codice:
    public String[][] ricercaAvanzata(String[] campi) {
    		int numero = 0;
    		for(int i=0;i<campi.length;i++) {
    			System.out.println("["+i+"]"+campi[i]);
    		}
    		String query = "";
    		String[][] risultato = null;
    		boolean titolo, autore, isbn, editore, anno, voto, lingua, prezzo;
    		titolo = autore = isbn = editore = anno = voto = lingua = prezzo = false;
    		boolean primo = true;
    		if (!connectDatabase()) {
    			return risultato;
    		}		
    		try {
    			for (int i = 0; i < 8; i++) {
    				if (i == 0 && !((campi[i]).equals(""))) {
    					titolo = true;
    					primo = false;
    					query = "SELECT * FROM libri_table WHERE titolo=?";
    				} else if (i == 1 && !((campi[i]).equals(""))) {
    					autore = true;
    					if (primo) {
    						query = "SELECT * FROM libri_table WHERE autore=?";
    					} else {
    						query = query + " AND autore=?";
    					}
    					primo = false;
    				} else if (i == 2 && !((campi[i]).equals(""))) {
    					isbn = true;
    					if (primo) {
    						query = "SELECT * FROM libri_table WHERE isbn=?";
    					} else {
    						query = query + " AND isbn=?";
    					}
    					primo = false;
    				} else if (i == 3 && !((campi[i]).equals(""))) {
    					editore = true;
    					if (primo) {
    						query = "SELECT * FROM libri_table WHERE casa_editrice=?";
    					} else {
    						query = query + " AND casa_editrice=?";
    					}
    					primo = false;
    				} else if (i == 4 && !((campi[i]).equals(""))) {
    					anno = true;
    					if (primo) {
    						query = "SELECT * FROM libri_table WHERE anno=?";
    					} else {
    						query = query + " AND anno=?";
    					}
    					primo = false;
    				} else if (i == 5 && !((campi[i]).equals(""))) {
    					voto = true;
    					if (primo) {
    						query = "SELECT * FROM libri_table WHERE voto=?";
    					} else {
    						query = query + " AND voto=?";
    					}
    					primo = false;
    				} else if (i == 6 && !((campi[i]).equals(""))) {
    					lingua = true;
    					if (primo) {
    						query = "SELECT * FROM libri_table WHERE lingua=?";
    					} else {
    						query = query + " AND lingua=?";
    					}
    					primo = false;
    				} else if (i == 7 && !((campi[i]).equals(""))) {
    					prezzo = true;
    					if (primo) {
    						query = "SELECT * FROM libri_table WHERE prezzo=?";
    					} else {
    						query = query + " AND prezzo=?";
    					}
    					primo = false;
    				}
    			}
    			query = query + ";";
    			PreparedStatement prstmt = con.prepareStatement(query);
                           /* Questa è la parte che ovviamente non funziona */
    			if (titolo == true) {
    				prstmt.setString(1, campi[0]);
    			}
    			if (autore == true) {
    				prstmt.setString(1, campi[1]);
    			}
    			if (isbn == true) {
    				prstmt.setString(1, campi[2]);
    			}
    			if (editore == true) {
    				prstmt.setString(1, campi[3]);
    			}
    			if (anno == true) {
    				prstmt.setString(1, campi[4]);
    			}
    			if (voto == true) {
    				prstmt.setString(1, campi[5]);
    			}
    			if (lingua == true) {
    				prstmt.setString(1, campi[6]);
    			}
    			if (prezzo == true) {
    				prstmt.setString(1, campi[7]);
    			}
                            /* Fino a qui */
    			if ((numero = contaLibri(prstmt.toString())) == 0) {
    				return risultato;
    			}
    			risultato = new String[numero][8];
    			ResultSet rs = prstmt.executeQuery();
    			if (!(rs.next())) {
    				System.out.println("Nessun risultato trovato.\n");
    				return risultato;
    			}
    			int i = 0;
    			while (rs.next()) {
    				// for (int i = 0; i <= numero; i++) {
    				if (i < numero) {
    					risultato[i][0] = rs.getString("titolo");
    					risultato[i][1] = rs.getString("autore");
    					risultato[i][2] = rs.getString("anno");
    					risultato[i][3] = rs.getString("casa_editrice");
    					risultato[i][4] = rs.getString("ISBN");
    					risultato[i][5] = rs.getString("prezzo");
    					risultato[i][6] = rs.getString("lingua");
    					risultato[i][7] = rs.getString("voto");
    				}
    				i++;
    			}
    			rs.close();
    			prstmt.close();
    		} catch (SQLException e) {
    			System.out.println("Errore. Impossibile eseguire l'operazione richiesta.\n");
    			e.printStackTrace();
    			return risultato;
    		}
    		return risultato;
    	}
    Grazie per il vostro aiuto.

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    ho capito che hai capito perchè non funziona dal commento: usi lo stesso indice per settare i placeholder.
    D'altro canto non hai modo di sapere a quel punto l'indice esatto da utilizzare. Un idea potrebbe essere quella di trasformare i flag (le variabili bool) in interi e memorizzare in fase di costruzione della query l'indice per ognuno dei campi (-1 se la stringa è vuota). Per fare questo lavoro hai bisogno di un contatore ma è un lavoro che in parte gia fai con la variabile primo. Man mano che vai avanti nel for ogni volta che un campo è diverso da null invece di settare il flag a true gli assegni l'indice e incrementi quest'ultimo. A fine ciclo puoi settare correttamente i placeholder perche ora i flag non indicano soltanto la presenza della porzione di query e quindi del placeholder ma anche l'indice per setString.
    Spero di essere stato sufficientemente chiaro.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    Originariamente inviato da rsdpzed
    ho capito che hai capito perchè non funziona dal commento: usi lo stesso indice per settare i placeholder.
    Avevo messo indici fasulli, tanto non avrebbe mai funzionato in quel modo.
    Spero di essere stato sufficientemente chiaro.
    Sei stato chiaro, ora speriamo di essere riuscito a fare quello che tu suggerivi.
    Mi sembra una bella idea la tua, e senza troppi problemi dovrei risolvere la complicazione che si era presentata.

    Vediamo ora se sono riuscito a fare quello che tu proponevi.

    codice:
    public String[][] ricercaAvanzata(String[] campi) {
    		int numero = 0;
    		for(int i=0;i<campi.length;i++) {
    			System.out.println("["+i+"]"+campi[i]);
    		}
    		String query = "";
    		String[][] risultato = null;
    		int titolo, autore, isbn, editore, anno, voto, lingua, prezzo;
    		//boolean titolo, autore, isbn, editore, anno, voto, lingua, prezzo;
    		//titolo = autore = isbn = editore = anno = voto = lingua = prezzo = false;
    		titolo = autore = isbn = editore = anno = voto = lingua = prezzo = -1;
    		//boolean primo = true;
    		int cc=1;
    		if (!connectDatabase()) {
    			return risultato;
    		}		
    		try {
    			for (int i = 0; i < 8; i++) {
    				if (i == 0 && !((campi[i]).equals(""))) {
    					titolo = cc++;
    					//primo = false;
    					query = "SELECT * FROM libri_table WHERE titolo=?";
    				} else if (i == 1 && !((campi[i]).equals(""))) {
    					//autore = true;
    					autore = cc++;
    					if (cc==0) {
    						query = "SELECT * FROM libri_table WHERE autore=?";
    					} else {
    						query = query + " AND autore=?";
    					}
    					//primo = false;
    				} else if (i == 2 && !((campi[i]).equals(""))) {
    					//isbn = true;
    					isbn= cc++;
    					if (cc==0) {
    						query = "SELECT * FROM libri_table WHERE isbn=?";
    					} else {
    						query = query + " AND isbn=?";
    					}
    					//primo = false;
    				} else if (i == 3 && !((campi[i]).equals(""))) {
    					//editore = true;
    					editore = cc++;
    					if (cc==0) {
    						query = "SELECT * FROM libri_table WHERE casa_editrice=?";
    					} else {
    						query = query + " AND casa_editrice=?";
    					}
    					//primo = false;
    				} else if (i == 4 && !((campi[i]).equals(""))) {
    					//anno = true;
    					anno=cc++;
    					if (cc==0) {
    						query = "SELECT * FROM libri_table WHERE anno=?";
    					} else {
    						query = query + " AND anno=?";
    					}
    					//primo = false;
    				} else if (i == 5 && !((campi[i]).equals(""))) {
    					//voto = true;
    					voto=cc++;
    					if (cc==0) {
    						query = "SELECT * FROM libri_table WHERE voto=?";
    					} else {
    						query = query + " AND voto=?";
    					}
    					//primo = false;
    				} else if (i == 6 && !((campi[i]).equals(""))) {
    					//lingua = true;
    					lingua=cc++;
    					if (cc==0) {
    						query = "SELECT * FROM libri_table WHERE lingua=?";
    					} else {
    						query = query + " AND lingua=?";
    					}
    					//primo = false;
    				} else if (i == 7 && !((campi[i]).equals(""))) {
    					//prezzo = true;
    					prezzo=cc++;
    					if (cc==0) {
    						query = "SELECT * FROM libri_table WHERE prezzo=?";
    					} else {
    						query = query + " AND prezzo=?";
    					}
    					//primo = false;
    				}
    			}
    			query = query + ";";
    			PreparedStatement prstmt = con.prepareStatement(query);
    			if (titolo!=-1) {
    				prstmt.setString(titolo, campi[0]);
    			}
    			if (autore !=-1) {
    				prstmt.setString(autore, campi[1]);
    			}
    			if (isbn !=-1) {
    				prstmt.setString(isbn, campi[2]);
    			}
    			if (editore !=-1) {
    				prstmt.setString(editore, campi[3]);
    			}
    			if (anno !=-1) {
    				prstmt.setString(anno, campi[4]);
    			}
    			if (voto !=-1) {
    				prstmt.setString(voto, campi[5]);
    			}
    			if (lingua !=-1) {
    				prstmt.setString(lingua, campi[6]);
    			}
    			if (prezzo !=-1) {
    				prstmt.setString(prezzo, campi[7]);
    			}
    			if ((numero = contaLibri(prstmt.toString())) == 0) {
    				return risultato;
    			}
    			risultato = new String[numero][8];
    			ResultSet rs = prstmt.executeQuery();
    			if (!(rs.next())) {
    				System.out.println("Nessun risultato trovato.\n");
    				return risultato;
    			}
    			int i = 0;
    			while (rs.next()) {
    				// for (int i = 0; i <= numero; i++) {
    				if (i < numero) {
    					risultato[i][0] = rs.getString("titolo");
    					risultato[i][1] = rs.getString("autore");
    					risultato[i][2] = rs.getString("anno");
    					risultato[i][3] = rs.getString("casa_editrice");
    					risultato[i][4] = rs.getString("ISBN");
    					risultato[i][5] = rs.getString("prezzo");
    					risultato[i][6] = rs.getString("lingua");
    					risultato[i][7] = rs.getString("voto");
    				}
    				i++;
    			}
    			rs.close();
    			prstmt.close();
    		} catch (SQLException e) {
    			System.out.println("Errore. Impossibile eseguire l'operazione richiesta.\n");
    			e.printStackTrace();
    			return risultato;
    		}
    		return risultato;
    	}

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    Tutti gli
    codice:
    if(cc==0)
    devo essere sostituiti con
    codice:
    if(cc==1)
    Inoltre, tutti i
    codice:
    titolo=cc++;
    autore=cc++
    etc...
    vanno spostati alla fine di ogni proprio else if

    Scusate il doppio post, ma non potevo più modificare quello precedente.
    Magari un moderatore potrà cancellare questo post di risposta ed editare quello precedente con le modifiche qua introdotte.

    Quindi, il nuovo codice funzionate:
    codice:
    public String[][] ricercaAvanzata(String[] campi) {
    		int numero = 0;
    		System.out.println(campi.length);
    		for(int i=0;i<campi.length;i++) {
    			System.out.println("["+i+"]"+campi[i]);
    		}
    		String query = "";
    		String[][] risultato = null;
    		int titolo, autore, isbn, editore, anno, voto, lingua, prezzo;
    		//boolean titolo, autore, isbn, editore, anno, voto, lingua, prezzo;
    		//titolo = autore = isbn = editore = anno = voto = lingua = prezzo = false;
    		titolo = autore = isbn = editore = anno = voto = lingua = prezzo = -1;
    		//boolean primo = true;
    		int cc=1;
    		if (!connectDatabase()) {
    			return risultato;
    		}		
    		try {
    			for (int i = 0; i < campi.length; i++) {
    				if (i == 0 && !((campi[i]).equals(""))) {
    					titolo = cc++;
    					//primo = false;
    					query = "SELECT * FROM libri_table WHERE titolo=?";
    				} else if (i == 1 && !((campi[i]).equals(""))) {
    					//autore = true;					
    					if (cc==1) {
    						query = "SELECT * FROM libri_table WHERE autore=?";
    					} else {
    						query = query + " AND autore=?";
    					}
    					autore = cc++;
    					//primo = false;
    				} else if (i == 2 && !((campi[i]).equals(""))) {
    					//isbn = true;					
    					if (cc==1) {
    						query = "SELECT * FROM libri_table WHERE isbn=?";
    					} else {
    						query = query + " AND isbn=?";
    					}
    					isbn= cc++;
    					//primo = false;
    				} else if (i == 3 && !((campi[i]).equals(""))) {
    					//editore = true;					
    					if (cc==1) {
    						query = "SELECT * FROM libri_table WHERE casa_editrice=?";
    					} else {
    						query = query + " AND casa_editrice=?";
    					}
    					editore = cc++;
    					//primo = false;
    				} else if (i == 4 && !((campi[i]).equals(""))) {
    					//anno = true;					
    					if (cc==1) {
    						query = "SELECT * FROM libri_table WHERE anno=?";
    					} else {
    						query = query + " AND anno=?";
    					}
    					anno=cc++;
    					//primo = false;
    				} else if (i == 5 && !((campi[i]).equals(""))) {
    					//voto = true;					
    					if (cc==1) {
    						query = "SELECT * FROM libri_table WHERE voto=?";
    					} else {
    						query = query + " AND voto=?";
    					}
    					voto=cc++;
    					//primo = false;
    				} else if (i == 6 && !((campi[i]).equals(""))) {
    					//lingua = true;					
    					if (cc==1) {
    						query = "SELECT * FROM libri_table WHERE lingua=?";
    					} else {
    						query = query + " AND lingua=?";
    					}
    					lingua=cc++;
    					//primo = false;
    				} else if (i == 7 && !((campi[i]).equals(""))) {
    					//prezzo = true;					
    					if (cc==1) {
    						query = "SELECT * FROM libri_table WHERE prezzo=?";
    					} else {
    						query = query + " AND prezzo=?";
    					}
    					prezzo=cc++;
    					//primo = false;
    				}
    			}
    			System.out.println("titolo->"+titolo);
    			System.out.println("contatore->"+cc);
    			query = query + ";";
    			PreparedStatement prstmt = con.prepareStatement(query);
    			if (titolo!=-1) {
    				prstmt.setString(titolo, campi[0]);
    			}
    			if (autore !=-1) {
    				prstmt.setString(autore, campi[1]);
    			}
    			if (isbn !=-1) {
    				prstmt.setString(isbn, campi[2]);
    			}
    			if (editore !=-1) {
    				prstmt.setString(editore, campi[3]);
    			}
    			if (anno !=-1) {
    				prstmt.setString(anno, campi[4]);
    			}
    			if (voto !=-1) {
    				prstmt.setString(voto, campi[5]);
    			}
    			if (lingua !=-1) {
    				prstmt.setString(lingua, campi[6]);
    			}
    			if (prezzo !=-1) {
    				prstmt.setString(prezzo, campi[7]);
    			}
    			System.out.println("Su contaLibri\n");
    			System.out.println(prstmt.toString());
    			if ((numero = contaLibri(prstmt.toString())) == 0) {
    				return risultato;
    			}
    			System.out.println("Dopo contaLibri\n");
    			risultato = new String[numero][8];
    			ResultSet rs = prstmt.executeQuery();
    			if (!(rs.next())) {
    				System.out.println("Nessun risultato trovato.\n");
    				return risultato;
    			}
    			int i = 0;
    			rs.beforeFirst();
    			System.out.println("Prima del while\n");
    			while (rs.next()) {
    				// for (int i = 0; i <= numero; i++) {
    				if (i < numero) {
    					risultato[i][0] = rs.getString("titolo");
    					risultato[i][1] = rs.getString("autore");
    					risultato[i][2] = rs.getString("anno");
    					risultato[i][3] = rs.getString("casa_editrice");
    					risultato[i][4] = rs.getString("ISBN");
    					risultato[i][5] = rs.getString("prezzo");
    					risultato[i][6] = rs.getString("lingua");
    					risultato[i][7] = rs.getString("voto");
    				}
    				i++;
    			}
    			rs.close();
    			prstmt.close();
    		} catch (SQLException e) {
    			System.out.println("Errore. pirppi Impossibile eseguire l'operazione richiesta.\n");
    			e.printStackTrace();
    			return risultato;
    		}
    		System.out.println("Arriva alla fine\n");
    		for(int i=0;i<numero;i++) {
    			for(int j=0;j<8;j++) {
    				System.out.println("["+i+","+j+"]="+risultato[i][j]);
    			}
    		}
    		return risultato;
    	}

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.