PDA

View Full Version : [PHP] Interrogazione SQL come renderla dinamica?


*nicola*
30-04-2011, 09:53
CIao, sto cercando il modo di creare delle pagine in HTML e PHP per presentare i risultati di una ricerca in un database fatta attraverso una query SQL nella quale inserisco i valori presi da un form.
Fin qui ci sono riuscito creando le seguenti pagine:

Pagina con form in HTML
Pagina che si collega al DB, esegue la query SQL e presenta i risultati (tutto in PHP)

Mi interesserebbe ora fare qualcosa di più sofisticato, in pratica una volta che a pagina 2 sono presentati i risultati l'utente dovrebbe poter scegliere di nascondere alcuni risultati quindi la tabella dovrebbe aggiornarsi dinamicamente senza ricaricare la pagina.

Faccio un esempio che spero aiuti a spiegarrmi: a pagina 1 indico che voglio fare una ricerca tra tutti gli utenti che vivono a Roma. A pagina 2 mi vengono presentati in una tabella tutti i risultati trovati dalla query:

SELECT *
FROM Utenti
WHERE comune='Roma'

a questo punto vorrei fare un piccolo menu in alto o a sinistra dove l'utente può scegliere di limitare i risultati presentati ai soli utenti di sesso femminile.
Quindi:

SELECT *
FROM Utenti
WHERE comune='Roma' AND sesso='F'

con quale tecnologia o linguaggio è possibile farlo? Conosco HTML, CSS e PHP e ora mi sto avventurando nel vasto mondo di Javascript ed AJAX...
Se mi date qualche parola chiave da cercare potrei anche provare a cercare su Google se c'è qualcosa di simile a cui ispirarsi.
GRAZIE!!!

Kenger
30-04-2011, 12:37
Con javascript hai tutto quello che ti serve. In linea di principio dovresti al click nel menù far partire una richiesta ajax passando cosa è stato clickato ad una pagina PHP(che può essere anche quella in cui sei). Questa pagina PHP deve fare echo del contenuto che deve cambiare. La chiamata ajax prende in ingresso una funzione da eseguire se ha avuto successo e a cui viene passato automaticamente come argomento la risposta della pagina PHP. A quel punto non ti resta che sostituire i tuoi dati (che avrai avuto l'accortezza di mettere dentro un div per sostituire tutto in una volta sola) con ciò che ti ha ritornato la chiamata ajax dentro questa funzione.

Ho fatto cose simili solo con jQuery quindi se vuoi posso farti un esempio con quello.

*nicola*
30-04-2011, 16:23
Intanto grazie 1000 della risposta. Personalmente non conosco jQuery però non è un problema studiarlo ed impararlo se serve a raggiungere il mio obiettivo. Preferisco leggere un libro che mi insegni qualcosa di utile piuttosto che rincitrullirmi a guardarre la De Filippi in TV.
Sarei molto felice di poter vedere un esempio pratico se ne hai fatto uno simile anche se, come ho già detto, devo proma studiarmi almeno un po' come funziona jQuery per comprenderlo cmq intanto se non ti dà problemi lo potresti postare qui sul forum oppure ti posso fornire il mio indirizzo e-mail via messaggio privato...come preferisci.
Grazie!

Kenger
30-04-2011, 18:10
Beh, di jquery per usare l'ajax non ti serve sapere molta roba.

L'unica cosa che devi fare è:

$.ajax({
url: 'test.php',
data: 'sex=F',
type: 'POST',
success: function(data) {
$('#result').html(data);
}
});


dove result è l'id del div dove mettere il nuovo contenuto.
test.php sarà una pagina che controlla che parametri sono passati in POST, esegue la query basandosi sui parametri e crea l'output ma che non farà return ma echo. Prova e poi dimmi pure qua se ti serve sapere qualcosa.

*nicola*
07-05-2011, 18:23
Dopo una veloce studiata di JQuery sono riuscito ad utilizzare effcacemente e piuttosto velocemente il tuo codice. Grazie!
Mi resta però un dubbio, al momento i valori che la pagina "test.php" li scrivo io manualmente nel codice della pagina quindi sono sostanzialmente fissi.
Vorrei utilizzare invece un form che mi permetta di inserire direttamente dal browser il valore.
Ho scritto il seguente codice che chiede il nome e poi nella pagina 03.php tramite un echo lo "stampa a video".

<HTML>
<HEAD>
<script type="text/JavaScript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
</HEAD>
<BODY>
<form action="03.php" method="post">
<input type="text" name="nome" size="15">
<input type="submit" value="Calcola" id="Calcola" tabindex="110"></p>
</form>
<script type="text/javascript">
$(document).ready(function(){
$("button").click(function(){
$.ajax({url:"03.php", type: 'POST',data: 'nome=Nicola', success:function(data){
$("#result").html(data);
}});
});});
</script>

<div id="result">Testo prima del cambiamento</div>
</BODY>
</HTML>

Purtroppo però non ho trovato un modo per inserire al posto del nome Nicola il valore che viene inserito all'intero del form. Se premo calcola mi apre in un'altra pagina il file 03.php con il nome inserito però viene completamente bypassata la funzione javascript.
Come posso fare? Mi basta anche qualche input poi cerco di documentarmi in autonomia.

Grazie ancora!

Kenger
07-05-2011, 19:58
Per prendere il valore dal form:


$("button").click(function(){
var data = 'nome=' + $('input[name=nome]').attr('value');
$.ajax({url:"03.php", type: 'POST',data: data, success:function(data) {
$("#result").html(data);
}});
});


Il tuo problema è che il selettore del pulsante è sbagliato. Il pulsante non è un button ma un input:submit. Trasforma il selettore da

$("button")

a così

$("#Calcola")

Che rappresenta l'elemento con id Calcola.
Tra l'altro, alla fine della funzione al click metti
return false;

*nicola*
08-05-2011, 13:10
Ti ringrazio! Ora funziona benone, cercando sul web avevo trovato serialize() però non riuscivo a far apparire i risultati in un formato diverso da name=Nicola, in pratica non riuscivo a far venire fuori solo "Nicola".

Mi permetto di romperti le scatole ancora una volta (spero che sia l'ultima).
Sto cercando di generalizzare un po' l'esempio per farlo funzionare con 2 input (nome e cognome) anzichè con solo il nome però non ci riesco. Inserendo qualche linea scovata su Internet sono arrivato a questo punto però lo script fallisce e mi apre la pagina 03.php senza usare AJAX.


<HTML>
<HEAD>
<script type="text/JavaScript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
</HEAD>
<BODY>
<form action="06.php" method="post">
<input type="text" name="nome" size="15">
<input type="text" name="cognome" size="15">
<input type="submit" value="Calcola" id="Calcola" tabindex="110"></p>
</form>
<script type="text/javascript">
$("#Calcola").click(function(){
var nome = 'nome=' + $('input[name=nome]').attr('value');
var cognome = 'cognome=' + $('input[name=cognome]').attr('value');
$.ajax({url:"03.php", type: 'POST',"nome=" + nome + "cognome=" + cognome, success:function(nome, cognome) {
$("#result").html(nome, cognome);
}});
return false;
});
</script>

<div id="result">Testo che si legge prima del cambiamento</div>

</BODY>
</HTML>


il file 06.php, per il momento, ha solo lo scopo di "raccogliere" i dati e stamparli a schermo:

<?php
$nome=$_POST["nome"];
$cognome=$_POST["cognome"];
echo"Io mi chiamo $nome";
echo"e $cognome di cognome";
?>

Kenger
08-05-2011, 16:08
Penso il problema sia dovuto al modo in cui mandi i dati. Se il problema è quello le soluzioni sono 2.
Se continui ad usare la stringa devi mettere & tra una variabile e l'altra e quindi diventa

"nome=" + nome + "&cognome=" + cognome

Inoltre stai mettendo "nome=" sia nella variabile nome sia nella stringa di inserimento e quindi la tua stringa alla fine diventa "nome=nome=Nicola".

Altrimenti passi agli oggetti:


var data = {};
data['nome'] = $('input[name=nome]').attr('value');
data['cognome'] = $('input[name=cognome]').attr('value');


E passi l'oggetto al posto della stringa. Attento che nella chiamata ajax hai perso il nome della proprietà


{
url:"03.php",
type: 'POST',
data: "nome=" + nome + "cognome=" + cognome,
success:function(nome, cognome) {
$("#result").html(nome, cognome);
}
}

Se hai altri dubbi chiedi pure.

*nicola*
08-05-2011, 16:39
Che bellezza...ho risolto grazie!

Posto il codice nel caso in cui possa tornare utile ai posteri.

Allora il codice della pagina con il form è:

<HTML>
<HEAD>
<script type="text/JavaScript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
</HEAD>
<BODY>
<form action="06.php" method="post">
<input type="text" name="nome" size="15">
<input type="text" name="cognome" size="15">
<input type="submit" value="Calcola" id="Calcola" tabindex="110"></p>
</form>
<script type="text/javascript">
$("#Calcola").click(function(){
var nome = 'nome=' + $('input[name=nome]').attr('value');
var cognome = 'cognome=' + $('input[name=cognome]').attr('value');
$.ajax({url:"06.php", type: 'POST',data: "nome=" + nome + "&cognome=" + cognome, success:function(nome, cognome) {
$("#result").html(nome, cognome);
}});
return false;
});
</script>

<div id="result">Testo che si legge prima del cambiamento</div>

</BODY>
</HTML>

mentre il codice della pagina (06.php) con il testo che deve apparire nella pagina quando si preme "calcola" è:

<?php
$nome=$_POST["nome"];
$cognome=$_POST["cognome"];
echo"Il mio nome è $nome, il mio cognome, se non ricordo male, è $cognome."
?>

Kenger
09-05-2011, 20:32
<HTML>
<HEAD>
<script type="text/JavaScript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
</HEAD>
<BODY>
<form action="06.php" method="post">
<input type="text" name="nome" size="15">
<input type="text" name="cognome" size="15">
<input type="submit" value="Calcola" id="Calcola" tabindex="110"></p>
</form>
<script type="text/javascript">
$("#Calcola").click(function(){
var nome = 'nome=' + $('input[name=nome]').attr('value');
var cognome = 'cognome=' + $('input[name=cognome]').attr('value');
$.ajax({url:"06.php", type: 'POST',data: "nome=" + nome + "&cognome=" + cognome, success:function(nome, cognome) {
$("#result").html(nome, cognome);
}});
return false;
});
</script>

<div id="result">Testo che si legge prima del cambiamento</div>

</BODY>
</HTML>

mentre il codice della pagina (06.php) con il testo che deve apparire nella pagina quando si preme "calcola" è:

<?php
$nome=$_POST["nome"];
$cognome=$_POST["cognome"];
echo"Il mio nome è $nome, il mio cognome, se non ricordo male, è $cognome."
?>


Sempre per i posteri, le parti in rosso non vengono usate per nulla. ^^

ndakota
10-05-2011, 10:00
Sempre per i posteri, le parti in rosso non vengono usate per nulla. ^^

Scusa, mi spieghi una cosa? Riguardo le ultime due cose che hai messo in rosso. Come mai solo cognome non serve? Che differenza c'è con nome? Non capisco. Grazie :D

black_wizard
10-05-2011, 10:55
le parti in rosso ovviamente rappresentano gli errori nel codice.
I primi 2 sono ovvi perchè

var nome = 'nome=' + $('input[name=nome]').attr('value');
var cognome = 'cognome=' + $('input[name=cognome]').attr('value');

perchè non c'è bisogno di mettere nome= e cognome= visto che nella variabile data tu hai riscritto nome= e cognome= .
Lasciando come sta ora nella pagina 06.php la variabile nome diventerà "nome=PIPPO" invece di essere soltanto "PIPPO" e l'echo risultante sarà
"Il mio nome è nome=PIPPO, il mio cognome, se non ricordo male, è cognome=ROSSI."

Perciò bisogna eliminarli da var nome e cognome...e fare direttamente

var nome = $('input[name=nome]').attr('value');
var cognome = $('input[name=cognome]').attr('value');


Poi l'errore che chiedevi tu

success:function(nome, cognome) {
$("#result").html(nome, cognome);
}

in questo caso la function success ritorna, sotto forma di variabile, l'echo che stampa nel file 06.php. Perciò è un'unica variabile non sono 2.
Lasciando il codice come l'hai scritto tu, cognome dovrebbe essere una variabile non definita...infatti se provi a eliminarla e mettere soltanto $("#result").html(nome); vedrai che ti scriverà nell'html sempre lo stesso risultato.
La soluzione sarebbe

success:function(data) {
$("#result").html(data);
}

ndakota
10-05-2011, 12:19
Grazie, comunque non sono io l'autore del thread xD

black_wizard
10-05-2011, 14:24
Grazie, comunque non sono io l'autore del thread xD
lo so ma ho voluto spiegare gli errori per tutti.:D

ndakota
12-05-2011, 11:23
Ragazzi ho un problema.. Nell'html generato dal mio script ho una tabella con dei link che si possono cliccare per far qualcosa ma qua dentro non so come gestirla. Cioè, questa tabella ce l'ho anche da un'altra parte senza essere richiamata da ajax e funziona alla perfezione. Invece, richiamata da ajax, non so come gestire i link. Non so neanche che pagina dovrei richiamare. Qualcuno mi dà un hint?

*nicola*
12-05-2011, 22:57
Ragazzi ho un problema.. Nell'html generato dal mio script ho una tabella con dei link che si possono cliccare per far qualcosa ma qua dentro non so come gestirla. Cioè, questa tabella ce l'ho anche da un'altra parte senza essere richiamata da ajax e funziona alla perfezione. Invece, richiamata da ajax, non so come gestire i link. Non so neanche che pagina dovrei richiamare. Qualcuno mi dà un hint?
Io non sono un grande esperto di Jquery però devo dire che proprio non ho capito la situazione, ti invito a spiegarti meglio postando anche qualche esempio elementare e magari aprire un tread ad hoc per questo problema in modo che in questo restino le discussioni sull'utilizzo di form, SQL e Jquery.

Kenger
13-05-2011, 22:21
Io non sono un grande esperto di Jquery però devo dire che proprio non ho capito la situazione, ti invito a spiegarti meglio postando anche qualche esempio elementare e magari aprire un tread ad hoc per questo problema in modo che in questo restino le discussioni sull'utilizzo di form, SQL e Jquery.

Concordo, e servono maggiori informazioni. Tipo qual è il problema. :) Facendo un tentativo a caso posso dirti che se aggiungi alla pagina del javascript attraverso ajax quello non è codice chiamabile, deve essere aggiunto manualmente al DOM.

Se ti sembra il tuo caso ne parliamo meglio (in un altro thread) sennò spiega meglio che succede. ^^

Ludo237
01-06-2011, 11:45
perchè non usare json_encode?

Kenger
01-06-2011, 20:49
perchè non usare json_encode?

Per far cosa scusa?

Ludo237
01-06-2011, 20:50
per passare i dati,tramite ajax,da pagine php

Kenger
01-06-2011, 21:24
Beh, si, se devi ritornare qualcosa di vagamente complesso si, lo trasformi in JSON

*nicola*
01-06-2011, 22:50
perchè non usare json_encode?
Non conosco tale funzione, dici che posso ottenere dei risultati più performanti che con il codice che ho posto (che per ora funziona piuttosto bene)?

Ludo237
03-06-2011, 21:41
Guarda io tutt'ora mi appoggio agli echo e response .. però mi han detto che con JSON hai più maneggevolezza e io sarei tentato di provarlo ma non ho ancora capito come funziona:cry: :cry: :cry: se qualcuno mettesse un easy sample :D:D :D :D :D :D :D

ndakota
05-06-2011, 15:58
return false;

Ciao, potresti aiutarmi? Ho messo anche io un return false alla fine della mia funzione però nel mio caso non va sempre bene. Quando ho una certa risposta(response) dovrei chiamare la pagina nell'action della mia form. Peccato non riesca a fare questo controllo. Non capisco proprio i comportamenti che assume. Se faccio un alert della variabile response stampa quello che mi aspetto però se poi uso quel valore per restituire true o false a seconda dei casi, ha un comportamento assolutamente inconcepibile :S

Con response intendo la tua data, quella che otteniamo dalla chiamata alla pagina php.

Kenger
05-06-2011, 17:57
Attento che il mio return false è all'interno del click e non della chiamata ajax. Quel return false serve per fermare la propagazione dell'evento click, non a ritornare un valore.

Mentre se hai messo il return dentro la chiamata ajax mi spiace ma non serve a nulla. Visto che la chiamata ajax è asyncrona non può ritornare un valore perchè non c'è nessuno che ne aspetta il risultato. La logica da eseguire al termine della chiamata ajax deve essere tutta dentro la funzione success o dentro una funzione richiamata da dentro success. NOn ho ben capito che vuoi fare. Vuoi far partire il submit del form solo in alcuni casi?

ndakota
05-06-2011, 22:53
Sì, praticamente la mia pagina php, che fa una query, se trova errori deve stampare un messaggio di errore. Altrimenti, se non ne trova, deve partire la form. Dove lo posso mettere allora questo controllo?

Kenger
06-06-2011, 21:18
Attento però che io parlavo del return delle funzioni click e success. Puoi fare tornare alla tua pagina php 0 o 1 e quindi dentro data di success(data) avrai quel valore. Poi dentro success fai il controllo su data, se è 1 fai fare il submit al form con $("#idform").submit() altrimenti fai fare quello che vuoi in caso di errore.

Qualcosa che non ho capito?

ndakota
07-06-2011, 09:11
Ora sono a lavoro. Oggi provo e ti dico. Grazie :)

ndakota
07-06-2011, 19:09
Funziona perfettamente. Grandissimo :)