Leggere da db e metodi asincroni:vorrei capire

VAik

Utente Attivo
16 Apr 2016
117
3
18
Ciao a tutti ragazzi
in questi giorni sto studiando i metodi asincroni di Javascrippt/Jquery però non riesco a capire come possano mai essere collegati con un file .php.
Non riesco a capire come posso collegarli e sfruttare i dati In altre parole non capisco come:
1) Inviare i dati ad un file .php e memorizzarli in un db (cosa che con solo linguaggio php e html so fare)
2)leggere i dati memorizzati in un db tramite un file .php (cosa che con solo linguaggio php e html so fare)

Ho per esempio creato questa cosa che funziona
Codice:
 $('article').click(function(evt) {
        evt.preventDefault();
 var idart = $(this).find('a').attr('href');
            showarticolo(idart);       
     });

   function showarticolo(idarticolo) {
                        articolovisibile = true;
                        var h = ($(window).height()-$('#dettaglio').height())/2;
                        var w = ($(window).width()-$('#dettaglio').width())/2;
$('#dettaglio').css({'display':'block', 'top': h + $(document).scrollTop(),'left': w + $(document).scrollLeft()})
                        .load('articoli.htm ' + idarticolo).hide().fadeIn();
$('#velo').css({'display':'block', 'top': $(document).scrollTop()});
                    }
questo mi permette di far apparire in una finestra di popup (che è un <div id="dettaglio"> inizialmente vuoto) parti del file "articoli.htm". Queste parti che vengono visualizzate sono scelte, tra le altre, grazie al fatto di prelevare l'attributo href nel codice html della mia pagina e determinare così quale pezzo effettivamente visualizzare.

Io vorrei collegare a questa pagina delle informazioni che non sono nel file "articoli.htm", ma dei dati che sono in un db, tramite quindi la chiamata ajax ad una pagina .php che interroghi appunto il db.
E non vorrei usare il metodo .load(), ma appunto il metodo $.ajax visto che è quello più completo, gli altri sono derivazioni.



Per esempio questo è un file .php che ho scritto tempo fa per leggere i dati di iscritti presenti in un db (che è costituito da queste colonne (id_iscritto,nome,cognome,email,indirizzo) )
e che mostra oltre la riga con tutti i dati dell'iscritto in base a dei criteri, anche un form con i vari dati dell'iscritto inseriti nei vari campi.
PHP:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>filtro i dati dal db db_prova con tabella "iscritti"</title>
</head>

<body>
<h1>filtro i dati dal db  db_prova con tabella "iscritti"</h1>



<?php


require_once('configurazione_credenziali_esterno.php');
$link = @mysqli_connect(DB_HOST, DB_USERN, DB_PSW) or die("Errore connessione: ". mysqli_connect_error());
$dbw = @mysqli_select_db($link, DB_PROVA) or die("Errore apertura database: " . mysqli_error($link));



$strsql= "SELECT * FROM iscritti WHERE provincia<>'NA' and dataisc>='2014'";
$rs = @mysqli_query($link, $strsql) or die("Errore query database: " . mysqli_error($link));

while ($riga = mysqli_fetch_array($rs)) {
    $str_id = $riga['id_iscritto'];
    $str_nome = $riga['nome'];
    $str_cognome = $riga['cognome'];
    $str_email = $riga['email'];
    $str_indirizzo = $riga['indirizzo'];
    $str_provincia = $riga['provincia'];
    $str_iscrizione = $riga['dataisc'];
    echo "Riga:  $str_id -> Nome: $str_nome - Cognome: $str_cognome - Email: $str_email - Indirizzo: $str_indirizzo
    - Provincia: $str_provincia- Iscrizione: $str_iscrizione<br>";
    ?>
        <form >
        ID: <input type="text" size="10" name="id" value="<?= $str_id ?>"><br>
        Nome: <input type="text" size="10" name="nome" value="<?=  $str_nome?>"><br>
        Cognome: <input type="text" size="10" name="cognome" value="<?= $str_cognome?>"><br>
        Email: <input type="text" size="10" name="email" value="<?= $str_email?>"><br>
        Indirizzo: <input type="text" size="10" name="indirizzo" value="<?= $str_indirizzo?>"><br>
        Provincia: <input type="text" size="10" name="provincia" value="<?= $str_provincia?>"><br>
        Iscrizione: <input type="text" size="10" name="iscrizione" value="<?= $str_iscrizione?>"><br>
        </form>
        <br>
    <?php
    }
 
 
    ?>
  
    </body>
    </html>
Come devo modificare il codice $.ajax per avere uno collegamento con questo db.
per esempio inviando una query ( data: {'provincia':'na'})

Codice:
$.ajax({  //fai richiesta ajax al file
               url: 'file.php',
               dataType: "....",
               data: {'query':'argomento'}
               success: function(dati) {
                  
                   }
               });
 
Ultima modifica:

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, un semplice esempio può schiarirti le idee
pagina chiamante
HTML:
<!DOCTYPE html>
<html>
    <head>
        <title>AJAX</title>
        <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
        <script>
            $(document).ready(function () {
                $("select[name='provincia'],select[name='anno']").change(function () {
                    iscritti();
                });
            });
            function iscritti() {
                $.ajax({
                    url: 'iscritti.php',
                    dataType: "HTML",
                    data: $("#form_iscritti").serialize(),
                    success: function (dati) {
                        $("#risposta_iscritti").html(dati);
                    }
                });
            }
        </script>
    </head>
    <body>
        <form id="form_iscritti">
            Provincia <select name="provincia">
                <option value=""></option>
                <option value="NA">Napoli</option>
                <option value="RM">Roma</option>
            </select>
            Anno  <select name="anno">
                <option value=""></option>
                <option value="2000">2000</option>
                <option value="2001">2001</option>
            </select>
        </form>
        <div id="risposta_iscritti"></div>
    </body>
</html>
la pagina ha un form con dei filtri, richiama con ajax la pagina iscritti.php passandole i parametri del form. Prende il risultato dalla variabile 'dati' e lo inserisce nel div indicato #risposta_iscritti.
La pagina php riceve i parametri e prepara la query
PHP:
<?php

$strsql = "SELECT * FROM iscritti WHERE 1 ";
if (isset($_REQUEST['provincia']) && !empty($_REQUEST['provincia'])) {
    $strsql .= "&& provincia = '" . $_REQUEST['provincia'] . "' ";
}
if (isset($_REQUEST['anno']) && (int) $_REQUEST['anno'] > 0) {
    $strsql .= "&& dataisc = " . (int) $_REQUEST['anno'] . " ";
}

echo $strsql;
Mi limito a stampare la query con echo ma il succo è che tutto quello che la pagina iscritti.php manda in echo viene inserito nel div indicato.
 
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
18
Ti ringrazio tantissimo Cricic per avermi dato una simile cosa.

ti vorrei chiedere delle cose sul file php:

1)
Cosa DEVE FARE questo file .php? cosa fa con il database se io ci invio i dati dal file html che mi hai postato?
va a stampare oltre ai vari dati memorizzati nel database (come nome, cognome etc etc) anche &&provincia=napoli&&dataisc=2001

quindi avrei in $strsql Nome,Cognome,Città&&provincia=napoli&&dataisc=2001

2)
Da questo vedo che il criterio della query da eseguire nel db è giù impostato di partenza (WHERE 1

PHP:
$strsql = "SELECT * FROM iscritti WHERE 1 ";
Con un semplice file html ed il php, sono in grado di settare grazie ad un form la scelta del criterio di ricerca nel db (nel tuo esempio WHERE 1).
In questo caso con la chiamata del metodo $.ajax può avvenire lo stesso?ed in che modo?

3)
non ho mai incontrato prima $_REQUEST [] ed empty() .

Vedendo dal manuale capisco che:
empty() controlla se la variabile è vuota oppure no , che si differenzia da isset () che invece controlla se la variabile è stata impostata.

$_REQUEST [] è un array associativo e ciò che ci può essere dentro viene ad essere il contenuti di $ _GET , $ _POST e $ _COOKIE. Che cosa vuol dire in relazione al codice che hai messo??



4)

In queste due righe
PHP:
$_REQUEST['provincia']

$_REQUEST['anno']
"provincia" ed "anno" vengono ad essere il name del campo <select>?

non ci vogliono delle variabili di appoggio per ciò che viene passato dalla chiamata $.ajax??
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Prima ti faccio due domande poi rispondo alle tue.
Hai provato il codice ? hai notato cosa cambia quando modifichi le select ?
 

VAik

Utente Attivo
16 Apr 2016
117
3
18
La verita?
non l'ho provato ieri, ma sai perchè? non è che non voglia provarlo , anzi....(oppure non scrivevo nemmeno su un forum di esperti), ma non ho capito ancora come incastrare un file .php completo collegato ad una tabella di un db. Perciò ho fatto quelle domande di prima.

cmq dal tuo stimolo, oggi ho provato e sai cosa mi era sfuggito??

-il fatto che stessi, con quell'esempio, stampando proprio la query che si fa al db, quindi provandolo esce ad esempio

"SELECT * FROM iscritti WHERE 1 && provincia = 'RM' && dataisc = 2001"



- e poi anche il fatto che non volevi considerare nessun collegamento con il db e perciò ho fatto la domanda 1)
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Capisco la teoria ma ci vuole anche la pratica.
1) come hai visto il php crea la query con i parametri ricevuti non ti resta che collegarti al database eseguire la query e mostrare i risultati in una tabella.
2) WHERE 1 è sempre vero, nel caso non arrivano paramtri ti mostra tutti i dati, questo si puo modificare in base al lavoro che devi fare, potresti per esempio mostrare un messaggio di errore se i dati non arrivano
3) nell'array $_REQUEST arrivano tutti i dati del modulo, empty() fa esattamente quello che hai detto
4) provincia e anno sono i name delle select, non devi fare altro
 
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
18
Grazie per avermi risposto.:)


Devo dire che il filo conduttore delle domande 2), 3), 4) è più o meno lo stesso punto.
Cioè
PHP:
  $_POST['provincia']
si può sostituire a
PHP:
$_REQUEST['provincia']
?


Dal mio corso di php ho appreso che i dati se vengono passati ad un file .php devono essere "catturati" così
(o anche con $_GET), per poi essere utilizzati nel codice php per fare appunto query rivolte al db dinamiche , cioè quello che dicevo io prima:

Con un semplice file html ed il php, sono in grado di settare grazie ad un form la scelta del criterio di ricerca nel db (nel tuo esempio WHERE 1).
In questo caso con la chiamata del metodo $.ajax può avvenire lo stesso?ed in che modo?

oppure, per scegliere dinamicamente cosa fare (nel caso ad esempio avessi due pagine php, ed una si collega all'altra tramite il link alla pagina caratterizzato da delle informazioni legate con query).

In altre parole, "appigli" per capire come sfruttare il php (collegamento con il db e visualizzazione dati da db) usando jquery asincrono



Capisco la teoria ma ci vuole anche la pratica.
Non lo dire a me.
Il mio metodo per capire la programmazione , ma penso che sia per tutti i lavori così, come il liutaio, il medico, il calzolaio, il muratore è vedere prima un esempio funzionante (o una persona che fa una determinata cosa), e quini capire passo passo cosa si è fatto e perchè.
Dalla mia esperienza di programmatore ed esercizi di ingegneria , invece, molto spesso però mi sento dire " studia,vedi il manuale, vuoi la pappa bella e pronta?" .Ma per me non è così, non voglio la pappa pronta ma voglio capire, cosa che con i manuali non è sempre possibile.
Io vedo distanza tra i manuali e la pratica e quel che serve. In poche parole il detto "tra il dire ed il fare c'è di mezzo il mare"
 
Ultima modifica:

VAik

Utente Attivo
16 Apr 2016
117
3
18
Provando il codice di $_POST al posto di $_REQUEST , posso dire che non funziona più .
Allora ti vorrei chiedere perchè si usa $_REQUEST?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
$_REQUEST legge sia il post che il get, io lo uso perchè la stessa pagina mi può capitare di richiamarla sia in post che in get.
Se vuoi utilizzarne uno specifico devi aggiungere il type alla chiamata ajax ( type : "POST" ) di default mi sembra che viene impostato il GET
 
  • Like
Reactions: VAik