Joomla.it Forum
Non solo Joomla... => Sviluppo => : kolbac 16 Mar 2007, 14:43:52
-
Ciao ragazzi, sto muovendo i primi passi con ajax, seguendo esempi su internet e varie guide, ma non sono ancora riuscito a capire se è possibile ritornare una variabile o un vettore mediante la richiesta XMLHttpRequest.
<script type="text/javascript">
//<![CDATA[
var myRequest = null;
function CreateXmlHttpReq(handler) {
var xmlhttp = null;
try {
xmlhttp = new XMLHttpRequest();
} catch(e) {
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
xmlhttp.onreadystatechange = handler;
return xmlhttp;
}
function myHandler2() {
if (myRequest.readyState == 4 && myRequest.status == 200) {
e = document.getElementById("ex4result");
e.innerHTML = myRequest.responseText;
}
}
function esempio4() {
var nome = document.f1.id.value;
var database ="<?php echo $vettoreConnection['db']; ?>";
<!-- --> document.f1.database.value;
var host = "<?php echo $vettoreConnection['host']; ?>";
var user = "<?php echo $vettoreConnection['user']; ?>";
var password = "<?php echo $vettoreConnection['password']; ?>";
var prefix = "<?php echo $vettoreConnection['prefix']; ?>";
myRequest = CreateXmlHttpReq(myHandler2);
myRequest.open("POST","components/com_map/lecce.php","true");
myRequest.setRequestHeader("content-type", "application/x-www-form-urlencoded");
myRequest.setRequestHeader("connection", "close");
myRequest.send("id=" + nome + "&database=" + database + "&host=" + host + "&user=" + user + "&password=" + password + "&prefix=" + prefix );
//]]>
</script>
<form name="f1">
Nome: <input type="input" name="id">
<input type="button" onClick="esempio4()" value="Visualizza cognome" /><br />
Risultato: <div id="ex4result"></div>
</form>
questo è myfile.php
$conn= mysql_connect($_GET[host], $_GET[user], $_GET[password]) or die("Connessione non riuscita: ".mysql_error());
$sql = "SELECT via, nome FROM ".$_GET[prefix]."map where id=".$_GET['id'];
$result = mysql_db_query($_GET[database],$sql,$conn) or die ("errore " . mysql_error());
$array = mysql_fetch_array($result);
print "VIA: ".$array['via']."<br>";
?>
in questo caso mi viene modificato il div ex4result con la stampa a video di $array['via'] e fin qui tutto bene. Il problema è che a me non serve visualizzarlo ma passarlo ad un'altra funzione.
Come posso fare?
Grazie.
-
Allora ragazzi...??? nessuno sa come posso recuperare i valori?
sto provando in questo modo
function myHandler2() {
if (myRequest.readyState == 4 && myRequest.status == 200) {
miafunzione(myRequest.responseText);
}}
il problema è che il file php che ho postato precedentemente mi restituisce un vettore e non riesco ad accedere ai vari elementi che sono contenuti dal vettore.
-
Mi sfugge la connessione con Joomla. ???
-
Sto sviluppando un componente per joomla vorrei utilizzare delle richieste asincrone...
-
Mi sfuggono le connessioni...
- lo script JS invoca la pagina PHP
- la pagina PHP effettua un'elaborazione e restituisce il risultato a JS
- JS cosa deve fare con questo risultato?
- qual'è il formato del risultato?
-
Come prima cosa vorrei dire che il codice che vedi è un po' approssimativo perchè stavo facendo delle prove.
JS dovrà utilizzare i dati restituiti dalla query contenuta nel file php, passandoli ad altre funzioni.
Come si vede dal file php il risultato non è altro che un vettore contenente il record restituito dalla query.
Fondamentalmente il problema di recuperare i dati l'ho risolto, ma mi si pone un altro problema, direi molto più importante, riguardante la sicurezza.
Utilizzando firebug di firefox e qualsiasi cosa simile è possibile vedere il contenuto delle variabili. :(
Come faccio ad evitare ciò? il metodo post non dovrebbe essere un metodo sicuro per inviare dati?
myRequest.open("POST","components/com_map/lecce.php","true");
myRequest.setRequestHeader("content-type", "application/x-www-form-urlencoded");
myRequest.setRequestHeader("connection", "close");
myRequest.send("id=" + nome + "&database=" + database + "&host=" + host + "&user=" + user + "&password=" + password + "&prefix=" + prefix );
Hai qualche idea su come risolvere questo problema? o indicarmi qualche buona guida che parli di ciò?
Ciao e grazie per l'interessamento
-
Aspetta un attimo...
Il file PHP restituisce questo:
<?php
print "VIA: ".$array['via']."<br>";
?>
Ma quello che arriva a JS è una stringa, non un vettore.
Per quanto riguarda il problema di sicurezza, l'idea di passare tutti i parametri di connessione è veramente pessima. Tali parametri sono tutti contenuti nel file configuration.php, pertanto è inutile passarli: includi il file ed usali.
-
Il file php l'ho modificato in questo modo. Ora proverò a seguire i tuo consiglio di importare configuration.php
$conn= mysql_connect($_POST[host], $_POST[user], $_POST[password]) or die("Connessione non riuscita: ".mysql_error());
$sql = "SELECT via, nome FROM ".$_POST[prefix]."map where id=".$_POST['id'];
$result = mysql_db_query($_POST[database],$sql,$conn) or die ("errore " . mysql_error());
$array = mysql_fetch_array($result);
?>
<input type="hidden" id="via" value="<?php echo $array[0]; ?>">
<input type="hidden" id="nome" value="<?php echo $array[1]; ?>">
<input type="hidden" id="lng" value="<?php echo $_POST[lng]; ?>">
<input type="hidden" id="lat" value="<?php echo $_POST[lat]; ?>">
quindi quello che mi restituiste sono campi di testo nascosti contenenti i valori che mi ha restituito la query.
Il file JS l'ho modificato in questo modo.
var myRequest = null;
function CreateXmlHttpReq(handler) {
var xmlhttp = null;
try {
xmlhttp = new XMLHttpRequest();
} catch(e) {
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
xmlhttp.onreadystatechange = handler;
return xmlhttp;
}
function myHandler2() {
if (myRequest.readyState == 4 && myRequest.status == 200) {
e = document.getElementById("contenitoredinamico");
e.innerHTML = myRequest.responseText;
vettore=new Array;
vettore[0]= document.getElementById("via").value;
vettore[1]= document.getElementById("nome").value;
var lng= document.getElementById("lng").value;
var lat= document.getElementById("lat").value;
mytabs(vettore,lng,lat);
}
}
// permette di eseguire la query impostata in lecce.php e poi richiama myHandler2() dove verranno recuperati i risultati
function myclick(nome,lng,lat) {
myRequest = CreateXmlHttpReq(myHandler2);
myRequest.open("POST","components/com_map/lecce.php","false");
myRequest.setRequestHeader("content-type", "application/x-www-form-urlencoded");
myRequest.setRequestHeader("connection", "close");
myRequest.send("id=" + nome + "&database=" + database + "&host=" + host + "&user=" + user + "&password=" + password + "&prefix=" + prefix + "&lng="+ lng + "&lat=" + lat);
}
In teoria io volevo recuperare $array per poi passarlo a mytabs(vettore,lng,lat), ma utilizzano la funzione myHandler2() non riuscivo ad utilizzarlo, quindi ho dovuto usare document.getElementById("via").value; per recuperare i valori, metterli in vettore e passarli alla funzione mytabs.
Spero di essere stato un po' più chiaro.
Se hai altri suggerimenti sono ben graditi.
-
Tu stai lavorando con 2 tecnologie diverse, JS e PHP, che hanno ambienti di esecuzione differenti. E devi tenerne conto.
Tramite JS devi recuperare i valori del form (ossia testo puro) ed inviarli allo script PHP, anche via GET.
Non devi passare alcun dato sensibile di connessione al db!
Dopodichè lo script PHP, riceve i valori via GET, li elabora e fornisce un risultato, che è una stringa.
Poi sta a te gestire la stringa come meglio credi, utilizzando il formato che preferisci.
Ad esempio potresti restituire i valori separati da un separatore: VALORE1|VALORE2|VALORE3|...
O in alternativa trasferire oggetti veri e propri, serializzati mediante JSON.
-
Non riesco ad includere il file configuration.php
come faccio a darli il percorso assoluto?
posso passarli la cartella in cui è stato installato joomla come facevo prima o è pericolosa anche questa soluzione?
-
Non riesco ad includere il file configuration.php
come faccio a darli il percorso assoluto?
<?php
require_once("../configuration.php");
?>
Ovviamente devi inserire il percorso relativo, in base a dov'è il tuo script.
-
Grazie di tutto.
Ora funziona perfettamente.