JavascriptProva

giovedì 10 maggio 2018

Pulsante che attiva sul server il download personalizzato a seconda della transazione.

Ecco: ho creato un file dataselector.php, che ha a che fare con il database.
<?php
$servername="localhost";
$username="XXXX";
$password="XXXX";
$database="id3147737_db";

$conn=new mysqli($servername,$username,$password,$database);

if($conn->connect_error){
    die("Connessione non riuscita" . $conn->connect_error);
}

$sql="SELECT * FROM Transazioni WHERE id=" .$_POST['id'];
$result=$conn->query($sql);
if($result->num_rows >0){
    while($row = $result->fetch_assoc()){
        echo "id: " . $row["id"] . " - nome: " . $row["nome"] . "
"; } }else{ echo "Nessun record trovato"; } $conn->close(); ?>
... e nel file index.php (che in futuro sarà la e-mail mandata al cliente) ci metto il form:
<form action="dataselector.php" method="POST">
<input type="hidden" name="id" value=1>
<input type="submit"> 
Nel file dataselector.php ho scritto così l'istruzione sql:
$sql="SELECT * FROM Transazioni WHERE id=" .$_POST['id'];
in modo da selezionare nel database Transazioni il record dove il campo id equivale a quello inviato dal form sotto forma di input type="hidden" (cosa che un giorno farà la e-mail mandata al cliente per lo scaricamento) E così con un input type="hidden" name="id" value=1 ho ottenuto il valore corrispondente a ID = 1:
id: 1 - nome: Downloads/gerbert.png


Ma basta cambiare il valore dell'input di nome "id":
<form action="dataselector.php" method="POST">
<input type="hidden" name="id" value=2>
<input type="submit"> 
e ottengo:
id: 2 - nome: Downloads/abruzzo.png

e invece con il valore 3:
<form action="dataselector.php" method="POST">
<input type="hidden" name="id" value=3>
<input type="submit"> 
...ottengo:
id: 3 - nome: Downloads/bovino.jpg
Perfetto! Adesso devo trovare il modo migliore per fare il download.

Trovato. il link è questo Ho fatto il copia-incolla e sono riuscito a downloadare i files che avevo nella cartella sul server.
Domani mi studio meglio il codice.

mySQLi: SELECT con clausola WHERE.

<?php
$servername="localhost";
$username="XXXX";
$password="XXXX";
$database="id3147737_db";

$conn=new mysqli($servername,$username,$password,$database);

if($conn->connect_error){
    die("Connessione non riuscita" . $conn->connect_error);
}

$sql="SELECT * FROM Transazioni WHERE id=2";
$result=$conn->query($sql);
if($result->num_rows >0){
    while($row = $result->fetch_assoc()){
        echo "id: " . $row["id"] . " - nome: " . $row["nome"] . "
"; } }else{ echo "Nessun record trovato"; } ?>
E funziona:
id: 2 - nome: Downloads/abruzzo.png


lunedì 7 maggio 2018

Connessione e creazione di tabelle database MySqli in php

Ho individuato il codice giusto per connettersi al database:
<?php

$servername = "localhost";
$username = "XXXXXX";
$password = "XXXXXXXX";
$database = "id3147737_questodatabase";

// Create connection
$conn = new mysqli($servername, $username, $password, $database);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
Ora dovrei inserire il codice per la creazione di una tabella.

La parola chiave fondamentale sarebbe $msqli_query.

$sql="CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";

if ($conn->query($sql) === TRUE) {
    echo "Table MyGuests created successfully";
} else {
    echo "Error creating table: " . $conn->error;
}

$conn->close();
E' tutto copia-incollato, giusto per vedere se funziona. E in effetti funziona!

mercoledì 2 maggio 2018

Ordinamento degli array indicizzati e associativi in php

Per l'ordinamento degli arrays non ho ben capito la differenza che c'è tra sort() e rsort() da una parte, e asort() e arsort() dall'altra.

Ecco: sort() e rsort() sono due funzioni che servono per gli arrays indicizzati.
Ordinano secondo il valore e basta.
Invece asort() e arsort(), ksort() e krsort() servono per gli arrays associativi.

Torno a creare un array associativo...

Intanto lo creo senza ordinamento:
<?php
$dei = array("Zeus"=>"Fulmine","Ares"=>"Guerra","Afrodite"=>"Amore","Dioniso"=>"Vino","Atena"=>"Sapienza");

foreach($dei as $n=>$value){
    echo "$n : $value<br>";
}

?> 
Zeus : Fulmine
Ares : Guerra
Afrodite : Amore
Dioniso : Vino
Atena : Sapienza



Ora ordino secondo il valore con asort().
<?php
$dei = array("Zeus"=>"Fulmine","Ares"=>"Guerra","Afrodite"=>"Amore","Dioniso"=>"Vino","Atena"=>"Sapienza");
asort($dei);

foreach($dei as $n=>$value){
    echo "$n : $value<br>";
}

?> 
Ho usato asort() che ordina secondo il valore:
Afrodite : Amore
Zeus : Fulmine
Ares : Guerra
Atena : Sapienza
Dioniso : Vino


Ora ordino secondo la chiave con ksort().
<?php
$dei = array("Zeus"=>"Fulmine","Ares"=>"Guerra","Afrodite"=>"Amore","Dioniso"=>"Vino","Atena"=>"Sapienza");
ksort($dei);
foreach($dei as $n=>$value){
    echo "$n : $value<br>";
}

?> 
Afrodite : Amore
Ares : Guerra
Atena : Sapienza
Dioniso : Vino
Zeus : Fulmine
Perfetto!

Array indicizzati e associativi, e costrutti iterativi applicabili, in php

Ci sono dunque tre tipi di array in php:
  • indexed
  • associativo
  • multidimensionale

Cominciamo con gli indexed...

Vado a memoria nel creare un array:
<?php
$nani=array("Mammolo","Gongolo","Cucciolo","Pisolo","Brontolo","Dotto","Eolo");

echo "I nani di Biancaneve sono ".count($nani)."<br>";

echo "I loro nomi sono: ";
for($n=0;$n<count($nani);$n++){
    echo "$nani[$n],";
}

?> 
I nani di Biancaneve sono 7
I loro nomi sono: Mammolo,Gongolo,Cucciolo,Pisolo,Brontolo,Dotto,Eolo,

E ho usato la funzione count() e un ciclo for per contare gli elementi dell'array e navigarci in mezzo.


Ora la cosa più difficile: degli array che non hanno un indice numerico ma una variabile.
Per prima cosa, mi rivedrei i cicli foreach, che qui vanno senz'altro applicati.
Applico foreach a un array indicizzato.
<?php
$matrice=array("uno","due","tre","quattro");

foreach($matrice as $value){
    echo "$value<br>";
}


?> 
uno
due
tre
quattro



Se voglio far apparire anche l'indice:
<?php
$matrice=array("uno","due","tre","quattro");

foreach($matrice as $x=>$value){
    echo "$value<br>";
}
?> 
uno
due
tre
quattro
Così l'indice non appare, ma dal momento che ho eguagliato $matrice a $x=>$value posso far apparire anche l'indice:
<?php
$matrice=array("uno","due","tre","quattro");

foreach($matrice as $x=>$value){
    echo "$x $value<br>";
}
?> 
0 uno
1 due
2 tre
3 quattro
Ecco: eguagliando $matrice a $x=>$value ho compreso in essa anche l'indice.
Stessa cosa posso fare per un array associativo.

Creo un array associativo (in questo tipo di array sarebbe il caso di far apparire anche l'indice)
$dei = array("Zeus"=>"Fulmine","Ares"=>"Guerra","Afrodite"=>"Amore","Dioniso"=>"Vino","Atena"=>"Sapienza");
Ora voglio elencarli tutti, facendo apparire anche l'indice che in questo caso è il nome del dio.
<?php
$dei = array("Zeus"=>"Fulmine","Ares"=>"Guerra","Afrodite"=>"Amore","Dioniso"=>"Vino","Atena"=>"Sapienza");

foreach($dei as $nome=>$competenza){
    echo "$nome: $competenza<br>";
}
Zeus: Fulmine
Ares: Guerra
Afrodite: Amore
Dioniso: Vino
Atena: Sapienza

Ecco, appunto, come volevo.
Il for è applicabile solo agli array indicizzati perché hanno come indice un numero, mentre il foreach è applicabile sia agli array indicizzati che a quelli associativi.

Parametri opzionali in php (con una digressione in Java)

A proposito delle funzioni, il primo argomento che mi salta all'occhio è quello dei parametri opzionali con un valore di default.
In Java non mi pare che esista questa funzione, mentre esiste (se ricordo bene) in C.
No, infatti non esiste.
Andiamo in php:
<?php
function funzione($a,$b=3){
    echo "$a<br>";
    echo $b;
}
funzione(3);
?> 
Il default è 3.
3
3

Se invece metto un secondo parametro diverso dal valore di default:
<?php
function funzione($a,$b=3){
    echo "$a<br>";
    echo $b;
}
funzione(3,5);
?> 
3
5
Funziona!
A questo punto faccio una digressione perché non so come si crei un parametro di default in Java.
Ecco: mediante l'overloading del metodo:
    private void funzione(int parametro1, int parametro2){
        System.out.println(parametro1 + " "+parametro2);

    }

    private void funzione(int parametro1){
        int defaultparam=7;
        funzione(parametro1,defaultparam);
    }
...dato che non esiste la possibilità di creare direttamente parametri opzionali.

Cicli while e for in php (sintassi uguale a quella del Java ecc.)

Cicli While e For in php.

<?php
$contatore=0;
while($contatore < 10){
    echo $contatore;
    $contatore++;
}
?>
0123456789

E così anche per:
<?php
$contatore=0;
do{
    echo $contatore;
    echo "<br>";
    $contatore++;
}while($contatore<10);
?>
0
1
2
3
4
5
6
7
8
9


Ciclo for:
<?php
for($n=0;$n<5;$n++){
    echo("Ciao, bello! <br>");
}
?> 
Ciao, bello! 
Ciao, bello! 
Ciao, bello! 
Ciao, bello! 
Ciao, bello! 

Il ciclo for è praticamente uguale a quello degli altri linguaggi OOP, con la differenza che essendo il php poco tipizzato non bisogna inserire alcun tipo della variabile.

C'è poi il ciclo foreach, che lavora sugli array, e così sarà un'occasione per ripassare gli array.
Creo un array in php:
<?php
$nani=array("Gongolo","Mammolo","Pisolo","Brontolo","Eolo","Dotto","Cucciolo");

foreach($nani as $value){
    echo "$value <br>";
}
?> 
Gongolo 
Mammolo 
Pisolo 
Brontolo 
Eolo 
Dotto 
Cucciolo 

Ricordare sempre che le variabili del php possono andare anche tra virgolette!.

Strutture decisionali in php: verifico se la sintassi è uguale a quella del Java.

Proviamo a vedere se le istruzioni condizionali sono simili a quelle del Java...

Ho una variabile: se la variabile contiene il nome "Mario" verrà scritto "Rossi", se contiene il nome "Ciccio" verrà scritto "Molliccio", se contiene un altro nome verrà scritto "Altro cognome".
<?php
$nome="Ciccio";

if($nome=="Mario"){
    echo "Rossi";
}elseif($nome=="Ciccio"){
    echo "Molliccio";
}else{
    echo "Altro cognome";
}
?> 
Funziona perfettamente!
Ora vediamo con lo switch:
<?php
$nome="Ciccio";

switch($nome){
    case "Mario":
        echo "Rossi";
        break;
    case "Ciccio":
        echo "Molliccio";
        break;
    default:
        echo "Altro cognome";
        break;
}
?> 
E funziona perfettamente anche questo!
La sintassi è uguale a quella del Java.

Costanti in php

Le costanti in php...
Vediamole!

La parola chiave è define.
Creo una costante e la visualizzo fuori e dentro una funzione (le costanti dovrebbero essere visibili dappertutto).
<?php
define("PAROLACCIA","Vaffanculo");
echo PAROLACCIA;
echo "<br>";
function funzione(){
    echo PAROLACCIA." dentro la funzione";
}
funzione();
?> 
Vaffanculo
Vaffanculo dentro la funzione

Perfetto!

Ora faccio il confronto con una variabile.
<?php
define("PAROLACCIA","Vaffanculo");
$variabile="Stronzo";
echo PAROLACCIA;
echo "<br>";
echo $variabile;
echo "<br>";
function funzione(){
    echo PAROLACCIA." dentro la funzione";
    echo "<br>";
    echo $variabile;
}
funzione();
?>
Vaffanculo
Stronzo
Vaffanculo dentro la funzione

Notice: Undefined variable: variabile in /storage/ssd3/737/3147737/public_html/index.php on line 11
Per rendere leggibile la variabile (ripasso) ho due possibilità:

parola chiave global:
<?php
define("PAROLACCIA","Vaffanculo");
$variabile="Stronzo";
echo PAROLACCIA;
echo "<br>";
echo $variabile;
echo "<br>";
function funzione(){
    global $variabile;
    echo PAROLACCIA." dentro la funzione";
    echo "<br>";
    echo $variabile;
}
funzione();
?>
Vaffanculo
Stronzo
Vaffanculo dentro la funzione
Stronzo



attingendo all'array $GLOBALS.
<?php
define("PAROLACCIA","Vaffanculo");
$variabile="Stronzo";
echo PAROLACCIA;
echo "<br>";
echo $variabile;
echo "<br>";
function funzione(){
    echo PAROLACCIA." dentro la funzione";
    echo "<br>";
    echo $GLOBALS['variabile'];
}
funzione();
?>
Vaffanculo
Stronzo
Vaffanculo dentro la funzione
Stronzo

Perfetto!
Resta da vedere quel "case insensitive"...

Provo a scrivere in minuscolo il nome della costante:
<?php
define("PAROLACCIA","Vaffanculo");
echo PAROLACCIA;
echo "<br>";
function funzione(){
    echo parolaccia." dentro la funzione";
}
funzione();
?> 
E ottengo:
Vaffanculo

Notice: Use of undefined constant parolaccia - assumed 'parolaccia' in /storage/ssd3/737/3147737/public_html/index.php on line 6
parolaccia dentro la funzione

Ora definisco la costante con un true come terzo parametro, che rende il nome case insensitive:
<?php
define("PAROLACCIA","Vaffanculo",true);
echo PAROLACCIA;
echo "<br>";
function funzione(){
    echo parolaccia." dentro la funzione";
}
funzione();
?>
Vaffanculo
Vaffanculo dentro la funzione

ed ecco che il nome della costante non è più case sensitive ma si può scrivere anche in minuscolo.

martedì 1 maggio 2018

Alcune operazioni sulle stringhe in php.

Devo passare per le stringhe.
Vediamo... se ricordo bene, ci sono delle funzioni per contare il numero di caratteri di una stringa e il numero di parole contenute in essa.
strlen()
str_word_count()
Provo ad applicarle...

<?php
$stringa="Ciao bello vai a quel paese";
var_dump($stringa);
?>
string(27) "Ciao bello vai a quel paese"

Applichiamo le funzioni di cui sopra:
<?php
$stringa="Ciao bello vai a quel paese";
var_dump($stringa);
echo "<br>";
echo "Numero di caratteri della stringa ".strlen($stringa);
echo "<br>";
echo "Numero di parole della stringa ".str_word_count($stringa);
?> 
string(27) "Ciao bello vai a quel paese" 
Numero di caratteri della stringa 27
Numero di parole della stringa 6

Perfetto!
C'è anche una funzione che inverte la stringa, strrev().
Più una curiosità, direi... Proviamo:
<?php
$stringa="Ciao bello vai a quel paese";

echo "<br>";
echo "Numero di caratteri della stringa ".strlen($stringa);
echo "<br>";
echo "Numero di parole della stringa ".str_word_count($stringa);
echo "<br>";
echo "Stringa al contrario ".strrev($stringa);
?> 
Numero di caratteri della stringa 27
Numero di parole della stringa 6
Stringa al contrario eseap leuq a iav olleb oaiC
Sì, una simpatica curiosità!
Più interessanti sono le funzioni che cercano un testo all'interno di un altro testo e sostituiscono testo con altro testo.
Ne ho due, strpos() e str_replace().
Le provo...

<?php
$stringa="Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura che la diritta via era smarrita";

echo strpos($stringa,"cammin");
?>
14

Sì, corrisponde.
Ora con str_replace voglio sostituire alcune parole della frase.
<?php
$stringa="Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura che la diritta via era smarrita";

echo str_replace("selva oscura","cazzo di foresta buia che non si vedeva una minchia",$stringa);
?>
Nel mezzo del cammin di nostra vita mi ritrovai per una cazzo di foresta buia che non si vedeva una minchia che la diritta via era smarrita

Perfetto (chiedo perdono al Sommo...)

Overriding di un metodo e uso dell'operatore di scope per eseguire il metodo della classe base in php

Vediamo di fare un overriding di un metodo di una classe, e quindi di accedere al metodo della classe genitrice.

Inventiamo una classe...

Non ho ancora indagato se esistano in php le classi astratte.
Comunque, facciamo che la classe triangolo sia derivata della classe rettangolo, anche se ci starebbe meglio una classe astratta...

<?php

class rettangolo{
    private $area;
    private $base;
    private $altezza;
    
    function __construct($b, $a){
        $this->base=$b;
        $this->altezza=$a;
    }
    
    public function get_area(){
        return $this->base * $this->altezza;
    }
}

class triangolo extends rettangolo{
    function __construct($b,$a){
        $this->base=$b;
        $this->altezza=$a;
    }

    public function get_area(){
        return ($this->base * $this->altezza)/2;
    }
}

$myrect=new rettangolo(4,5);
echo "Area del rettangolo ".$myrect->get_area();
echo "<br>";
$mytrg=new triangolo(4,5);
echo "Area del triangolo ".$mytrg->get_area();
?> 
I risultati sono come mi attendo:
Area del rettangolo 20
Area del triangolo 10

Dunque ho overridato il metodo get_area().
Ora voglio usare l'operatore di scope (non so se anche in php si chiama così) per accedere al metodo della classe base.
<?php

class rettangolo{
    protected $base;
    protected $altezza;
    function __construct($b,$a){
        $this->base=$b;
        $this->altezza=$a;
    }
    
    public function get_area(){
        return $this->base * $this->altezza;;
    }
}

class triangolo extends rettangolo{

    function __construct($b, $a){
        $this->base=$b;
        $this->altezza=$a;
    }

    public function get_area(){
        return rettangolo::get_area();
    }
}

$myrect=new rettangolo(4,5);
echo "Area del rettangolo ".$myrect->get_area();
echo "<br>";
$mytrg=new triangolo(4,5);
echo "Area del triangolo ".$mytrg->get_area()
?> 
Area del rettangolo 20
Area del triangolo 20

Perfetto!

Classi in php: modificatori di accesso ed ereditarietà

Ecco, anche in PHP ci sono i modificatori di accesso public, private e protected.
Ma forse mi conviene vederli in blocco con l'ereditarietà.
Questo è il link di riferimento.

Eseguo pedissequamente o quasi...

Molto semplice e banale: questo è l'esempio che ho trovato sul tutorial
<?php
class person{
    var $name;
    public $height;
    protected $social_insurance;
    private $pinn_number;
    
    function __construct($persons_name){
        $this->name=$persons_name;
    }
    
    function set_name($new_name){
        $this->name=$new_name;
    }
    
    function get_name(){
        return $this->name;
    }
}

$stefan=new person("Stefan Mischook");
echo "Stefan's full name ".$stefan->get_name();
echo "Tell me private stuff: ".$stefan->pinn_number;
?> 
La variabile private non può venir letta da fuori della classe.
Comportamento del tutto analogo a ciò che accade in altri linguaggi OOP.

Ora vediamo l'ereditarietà.
<?php
class person{
    var $name;
    public $height;
    protected $social_insurance;
    private $pinn_number;
    
    function __construct($persons_name){
        $this->name=$persons_name;
    }
    
    public function set_name($new_name){
        $this->name=$new_name;
    }
    
    public function get_name(){
        return $this->name;
    }
}

class employee extends person{
    function __construct($employees_name){
        $this->name=$employees_name;
    }
}

$stefan=new person("Stefan Mischook");
$james=new employee("Johnny Fingers");

echo "----->".$james->get_name();

?>
----->Johnny Fingers

Bene. Abbiamo visto l'ereditarietà e i modificatori di accesso.
L'ultima cosa che devo vedere è l'overriding dei metodi (che comunque è uguale a quello che conosco da altri linguaggi OOP).

Mi introduco alle classi in PHP

Facciamo un po' di prove con il tipo di variabile Object, vale a dire il corrispettivo delle classi in altri linguaggi...

Le classi possono contenere in esse delle funzioni.
Ecco, ho trovato il modo di creare una classe con getter e setter di una proprietà.
Ci riprovo.
<?php
class Persona {
    var $nome;
    function set_name($newName){
        $this->nome=$newName;
    }
    
    function get_name(){
        return $this->nome;
    }
}

$Uomo=new Persona();
$Uomo->set_name("Mario");
echo $Uomo->get_name();

?> 
E funziona:
Mario

Vediamo se è possibile usare pure un costruttore...

<?php
class Persona {
    var $nome;
    function Persona($myName){
        $this->nome=$myName;
    }
    
}

$Uomo=new Persona("Joe Fetecchia");

echo $Uomo->nome;

?> 
Joe Fetecchia

Sì, si può usare anche il costruttore come negli altri linguaggi.
Ma il costruttore si può usare anche con questo costrutto:
<?php
class Persona {
    var $nome;
    function __construct($newName){
    $this->nome=$newName;
    }
}

$Uomo=new Persona("Pippo");

echo $Uomo->nome;

?> 
Pippo

Scope delle variabili in php

Mi sono esercitato su altri blog con le variabili php, ma è meglio che lo faccia qui perché per me il php è una novità, più che una cosa su cui esercitarsi.
L'ho già toccato distrattamente in passato, ma adesso lo scopro come una necessità piuttosto impellente.

Ho visto i tipi di variabili, perlomeno alcuni tipi di variabili, ma adesso è il caso che faccia uno studio generale.

Lo Scope è fondamentale.
Anche qui, come in JavaScript, esistono le funzioni.
Scrivo una funzione la chiamo, banalmente.
<?php

function funzione(){
    echo "Questa è una funzione";
}

funzione();
?> 
Sì, funziona esattamente come il JavaScript.

Detto questo, analizziamo lo scope.
<?php
$variabile=123;
function funzione(){
    echo $variabile;
}

funzione();
?>

Notice: Undefined variable: variabile in /storage/ssd3/737/3147737/public_html/index.php on line 4

La variabile dichiarata fuori dalla funzione non viene letta nella funzione.

variabile letta al di fuori di una funzione:
<?php
$variabile=123;
function funzione(){
    echo "funzione";
}

funzione();
echo $variabile;
?> 
funzione123



Allo stesso modo, la variabile dichiarata nella funzione non dovrebbe poter essere letta al di fuori.
Proviamo:
<?php

function funzione(){
    $variabile=123;
}

funzione();
echo $variabile;
?> 

Notice: Undefined variable: variabile in /storage/ssd3/737/3147737/public_html/index.php on line 8


...e dovrebbe venir letta all'interno della funzione:
<?php

function funzione(){
    $variabile=123;
    echo $variabile;
}

funzione();

?> 
123



Come faccio a leggere una variabile globale all'interno di una funzione?
Credo di aver capito che ci sono due modi:
  • mediante la parola chiave global;
  • mediante l'array $GLOBALS[index] in cui sono immagazzinate le variabili globali (in index va il nome della variabile).
Proviamo...

<?php
$variabile=123;
function funzione(){
    global $variabile;
    echo $variabile;
}

funzione();

?> 
123



Proviamo l'altro metodo:
<?php
$variabile=123;
function funzione(){
    
    echo $GLOBALS['variabile'];
}

funzione();

?> 
123

Perfetto!