Visualizzazione post con etichetta guide. Mostra tutti i post
Visualizzazione post con etichetta guide. Mostra tutti i post

venerdì 7 giugno 2019

Leggi il post

Risolvere problema accentate negli ics calendar (ASP)

L'altro giorno ho fatto una breve guida su come creare un ics in asp/php, grazie alla quale ho potuto aggiungere questa interessante funzionalità ad un sito internet.
Sembrava funzionare tutto alla perfezione, ma alla fine ho scoperto un antipatico bugs con le accentate sull'ics.
Praticamente, la prima volta che ho utilizzato la mia bella pagina asp per generare un ics, nel titolo dell'evento c'era un'accentata, che in fase di import del file calendar in outlook ha dato come risultato di avere una lettera in meno nel titolo.

Subito allarmato dalla sparizione della lettera accentata, ho aperto il file ics con il blocco note (notepad++ in realtà), ed ho notato che in realtà l'accentata era scritta correttamente.
Andando però a guardare il formato del file, ho visto che il charset indicato era ANSI, ed ho subito intuito che in realtà microsoft outlook avrebbe gradito un charset diverso, ovvero il più universale utf8.

Vediamo quindi come risolvere questo problemino con l'ics e le accentate non visualizzate in outlook.



Come risolvere il problema delle accentate nei file ics calendar in ASP


Premessa: la seguente soluzione, anche se ovviamente con sintassi diversa a seconda del linguaggio di programmazione utilizzato, può risolvere in maniera generale il problema accentate ics outlook (ed altri client ovviamente).

Per fixare il bug delle accentate nell'apertura dei file calendar ics con outlook o altri client di posta, basta agire sulla pagina asp ed impostare come charset utf-8.

Bisogna dunque aggiungere all'inizio del file asp, prima di ogni cosa, queste due righe:

<%
@LANGUAGE="VBSCRIPT" CODEPAGE="65001"
Response.CharSet = "UTF-8"
%>

Successivamente per completezza, ma potrebbe non servire, si può aggiungere all'interno del file ics la riga con la specifica del charset usato, che in questo caso è:

CHARSET:UTF-8
Quindi rifacendomi all'esempio dell'altro giorno, lo script finale verrebbe così:

<%
@LANGUAGE="VBSCRIPT" CODEPAGE="65001"
Response.CharSet = "UTF-8"

response.buffer=true
Response.ContentType = "text/calendar"
response.AddHeader"content-disposition","inline;filename=appuntamento.ics"
ris="BEGIN:VCALENDAR"
ris=ris&VBcrlf&"CHARSET:UTF-8"
ris=ris&VBcrlf&"VERSION:2.0"
ris=ris&VBcrlf&"BEGIN:VEVENT"
ris=ris&VBcrlf&"DTSTART;TZID="&stato&"/"&citta&":"&dataorainizioo
ris=ris&VBcrlf&"DTEND;TZID=Italia/Milano:"&dataorafine
ris=ris&VBcrlf&"SUMMARY:"&titolo
ris=ris&VBcrlf&"LOCATION:"&luogo
ris=ris&VBcrlf&"DESCRIPTION:"&titolo&VBcrlf&descrizione
ris=ris&VBcrlf&"PRIORITY:3"
ris=ris&VBcrlf&"END:VEVENT"
ris=ris&VBcrlf&"END:VCALENDAR"
response.write(ris)
%>


Ed ecco che magicamente tutte le accentate ed i caratteri speciali presenti nel file ics calendar generato dalla pagina asp, si apriranno tranquillamente anche su outlook.

giovedì 6 giugno 2019

Leggi il post

Creare un ICS Calendar in ASP o PHP

Oggi farò una guida multi language, che spiega come creare un file ics calendar, ovvero quel tipo di file che i vari client di posta, quali outlook ad esempio, interpretano come un memo da mettere in agenda.
I file ics sono molto comodi per salvarsi nel proprio calendario personale i dati di un appuntamento, in modo tale da potersi anche far avvisare poco prima dell'incontro con una notifica su cellulare.
Un buon sito web che si rispetti dunque, che sia sviluppato in asp o php, a seguito dell'iscrizione ad un evento da la possibilità di creare un file ics da scaricare o da mandare in automatico via email all'iscritto.
Tale file poi, una volta aperto fa partire, ad esempio, outlook in automatico, il quale chiederà all'utente se vuole salvarsi i dati dell'appuntamento presenti nel file calendar, facilitando di fatto la vita a chi si iscrive ad un evento, che non deve scriversi a mano il titolo dell'appuntamento, la data e ora, ed il luogo dell'incontro.

Fatta questa doverosa premessa, vediamo subito come creare un file ics con asp e php.


Come creare un ICS Calendar in ASP


La sintassi da utilizzare per creare un file calendar in asp classic (e non) è la seguente:

<%
response.buffer=true
Response.ContentType = "text/calendar"
response.AddHeader"content-disposition","inline;filename=appuntamento.ics"
ris="BEGIN:VCALENDAR"
ris=ris&VBcrlf&"VERSION:2.0"
ris=ris&VBcrlf&"BEGIN:VEVENT"
ris=ris&VBcrlf&"DTSTART;TZID="&stato&"/"&citta&":"&dataorainizioo
ris=ris&VBcrlf&"DTEND;TZID=Italia/Milano:"&dataorafine
ris=ris&VBcrlf&"SUMMARY:"&titolo
ris=ris&VBcrlf&"LOCATION:"&luogo
ris=ris&VBcrlf&"DESCRIPTION:"&titolo&VBcrlf&descrizione
ris=ris&VBcrlf&"PRIORITY:3"
ris=ris&VBcrlf&"END:VEVENT"
ris=ris&VBcrlf&"END:VCALENDAR"
response.write(ris)
%>


Direi che questo script non necessita di particolari spiegazioni, in quanto basterà sostituire dinamicamente le varie variabili quali luogo, ora, ecc... per avere una pagina asp che una volta chiamata consentirà al visitatore di scaricare un file calendar ics.


Come creare un file Calendar ics in PHP


Per poter creare un file ics in php, facendolo scaricare dall'utente tramite apposito link, basta utilizzare il seguente script:

<?
header('Content-Type: text/csv; text/calendar');
header('Content-Disposition: attachment; filename=calendar.ics');
$dstartc=date("Y", strtotime($data_inizio)).date("m", strtotime($data_inizio)).date("d", strtotime($data_inizio))."T".date("H", strtotime($data_inizio)).date("i", strtotime($data_inizio))."00";
$dendc=date("Y", strtotime($data_fine)).date("m", strtotime($data_fine)).date("d", strtotime($data_fine))."T".date("H", strtotime($data_fine)).date("i", strtotime($data_fine))."00";
$ris="BEGIN:VCALENDAR\n";
$ris.="VERSION:2.0\n";
$ris.="BEGIN:VEVENT\n";
$ris.="DTSTART;TZID=".$stato."/".$citta.":".$dstartc."\n";
$ris.="DTEND;TZID=".$stato."/".$citta.":".$dendc."\n";
$ris.="SUMMARY:".$titolo."\n";
if ($luogo!="") $ris.="LOCATION:".$luogo."\n";
$ris.="DESCRIPTION:".$titolo."\n".$descrizione."\n";
$ris.="PRIORITY:3\n";
$ris.="END:VEVENT\n";
$ris.="END:VCALENDAR\n";
echo $ris;
?>


Come per la versione asp, si produrrà un output con una sintassi prestabilita standard (che non è il caso di analizzare e va presa per buona), alla quale dovremo passare le varie variabili che compongono i dati del nostro appuntamento (luogo, data, titolo evento, ecc...).

Nello script d'esempio viene anche illustrato come l'ics si aspetta che sia formattata la data, sintassi che ovviamente vale anche per la versione asp.

Bene, è tutto.
Grazie a queste poche righe di codice, che potrete ovviamente standardizzare in una funzione, potrete creare file ics calendar tramite linguaggio di programmazione php o asp, ed inserire così una comoda funzionalità all'interno dei vostri siti internet.

venerdì 31 maggio 2019

Come far vibrare il telefono (App Inventor 2 / Thunkable)

Se sei uno sviluppatore di app per android, una delle cose che prima o poi ti capiterà di dover fare è capire come far vibrare il telefono a seguito di un'azione dell'utente.
Può essere il caso in cui si sta creando un'app che manda delle notifiche, oppure un'applicazione per android che genera un allarme, o perchè no, la famosa app che simula le chiamate per il cellulare.

Quale che sia l'app in questione, grazie a Mit App Inventor 2 (o thunkable) è possibile far vibrare il telefono cellulare con un semplice componente nativo, senza bisogno di estensioni esterne.
Vediamo subito come fare.


Come far vibrare il telefono con App Inventor 2 e Thunkable


Partendo da un progetto vuoto al quale basta aggiungere un bottone per generare l'azione, per ottenere la vibrazione del telefono basta utilizzare il componente Player.
Trascinare dunque il componente player nel viewer e poi andare subito a lavorare nei blocchi (blocks).

Basterà infatti associare all'azione del click del bottone, l'azione del player (app inventor o thunkable) denominata call player vibrate (esegui player vibra), alla quale basterà poi associare il numero di millisecondi per i quali si vuol far vibrare il telefono.

Come far vibrare il telefono (App Inventor 2 / Thunkable)

Ed ecco che una volta lanciata la nostra app, al click del bottone il telefono vibrerà come per magia.
Tutto questo con un solo blocco di codice, facile no?

Un paio di note utili per la corretta riuscita di questa operazione:
  • 1000 millisecondi sono un secondo, quindi per calcolare quanti secondi si vuole far vibrare il telefono basta fare x*1000
  • Per poter far vibrare il telefono con la vostra app sviluppata con thunkable o app inventor, comunque bisogna avere abilitato la vibrazione delle notifiche.
    Sembra una banalità, ma se si lascia il telefono silenzioso senza vibrazione, questo componente non fa niente... io non lo sapevo e ci ho perso un secolo per capire come mai non funzionava la vibrazione su appinventor / thunkable, passando dal semplice componente player ad anche estensioni esterne, nulla funzionava fino a quando non ne ho scoperto il motivo :p

E' tutto sull'argomento vibrazione cellulare tramite appinventor / thunkable.
A questo link trovate il semplice progetto .aia da scaricare, nel caso vi servisse.

Tornare all'elenco delle lezioni

giovedì 23 maggio 2019

Leggi il post

MYSQL: cancellare record su più tabelle con i trigger

Tempo fa avevo spiegato come utilizzare i trigger in mysql, sia da codice sql, sia utilizzando l'interfaccia grafica di phpmyadmin.
Oggi invece vediamo un esempio concreto su una delle casistiche più ricorrenti, il delete after delete.

Quando capita di dover cancellare i record presenti in delle tabelle figlie, soprattutto se si sta sviluppando una nuova applicazione e si fanno molte prove, a volte può risultare scomodo andare ad eliminare a mano tutti i record di sottotabelle per evitare di lasciare righe orfane nel database mysql.
Ed è proprio in questi casi che torna utile saper utilizzare al meglio i trigger mysql.

Vediamo subito con un esempio pratico come ripulire in automatico il nostro database.


Come cancellare automaticamente record su più tabelle con i trigger di MYSQL


La sintassi sql da utilizzare per rimuovere automaticamente da una tabella mysql tutti i record legati ad una tabella non più esistente è la seguente:

CREATE TRIGGER `nome-trigger` AFTER DELETE ON `tabella-padre` 
FOR EACH ROW 
DELETE FROM tabella-figlia WHERE tabella-figlia.id-chiave=old.id;

La sintassi sopra indicata si spiega da sola, ma vediamo comunque di andare ad analizzare cosa ho appena scritto.
Il comando sql CREATE TRIGGER serve ovviamente a creare il nostro trigger, al quale bisogna dare un nome, bisogna indicare un'azione (in questo caso dopo l'operazione di cancellazione, ovvero AFTER DELETE), e bisogna dire qual'è la tabella dalla quale parte il comando.

C'è poi una sintassi che serve per indicare che l'operazione sql che andremo a fare sarà effettuata su tutte le righe della tabella bersaglio, ovvero: FOR EACH ROW.

Infine basta indicare la sintassi mysql desiderata per compiere l'azione, in questo caso la DELETE, mettendo nel WHERE un legame tra un id chiave della tabella bersaglio, con l'id della tabella padre, indicata con la sintassi old.

Tutto molto semplice no?
Da ora in poi quindi, cancellando una riga della tabella padre, verranno rimosse in automatico dal database tutte le righe della tabella figlia che rispondono ai requisiti indicati nel nostro trigger.

mercoledì 22 maggio 2019

Come fare il backup di Instagram

Dopo aver caricato milioni di foto e video su instagram ed aver ottenuto miliardi di like ti stai preoccupando pensando a che cosa accadrebbe se il social delle foto chiudesse?
Beh, ho una buona notizia per te, se lo desideri su instagram è possibile fare il backup delle foto, ma non solo, anche di tutti i video e dei commenti ricevuti e fatti sul proprio canale.

A parte la premessa un po' troppo utopistica, potrebbe comunque tornarti utile sapere come scaricare le foto del tuo profilo instagram.
Non si sa mai ad esempio che tu voglia per qualche motivo caricarle su un altro social, o semplicemente salvare foto e video ritoccati dal social, suo tuo computer di casa.

Vediamo dunque come fare questa semplice quanto importante operazione.


Come fare il backup di Instagram


Per poter fare il backup dei contenuti di instagram basta procedere nel seguente modo:
  1. Apri instagram sul tuo cellulare
  2. Clicca sull'icona dell'omino in basso a sinistra
  3. Clicca sulle 3 linee orizzontali in alto nella pagina
  4. Clicca su Impostazioni
  5. Clicca su Privacy e sicurezza
  6. Clicca su Scarica i dati
  7. Inserisci una mail sulla quale vuoi che arrivi il link per scaricare il tuo backup
  8. Clicca su Richiedi il download

Come fare il backup di Instagram

Tutto qui.
Se avrai fatto tutto correttamente in poco tempo riceverai via email un link per poter scaricare il tuo backup di instagram.
La tua pagina insta è ora salvata ed archiviata sul tuo computer e le tue foto e video saranno sempre disponibile anche nel caso tu decidessi di cancellarti dal social.

Nel caso questa procedura scritta non fosse sufficientemente chiara, includo qui sotto il link video tutorial su youtube:
https://youtu.be/pqRBkRNIjR4

lunedì 13 maggio 2019

Leggi il post

Importare un dump mysql da riga di comando

Oggi mi sono trovato a dover superare un antipatico problema durante l'importazione di un file dump su un database mysql.
Praticamente avevo questo file sql contenente tutte le tabelle ed i dati del mio nuovo database mysql, ma quando andavo ad importare tramite la comodissima funzionalità del phpmyadmin mi dava il seguente errore: "Stai probabilmente cercando di caricare sul server un file troppo grande" (You probably tried to upload a file that is too large. Please refer to documentation for a workaround for this limit).
Vediamo subito come risolvere questo problema con un metodo alternativo.


Come importare un dump mysql da riga di comando


La prima cosa che si fa in questi casi, quando si ha questo genere d'errore, è di andare ad aumentare la dimensione massima dei file caricabili tramite php, nel php.ini per l'appunto.
Tuttavia, stanco di andare a dover modificare parametri di configurazione solo per gestire delle eccezioni, ho deciso di risolvere questo problema di file troppo grossi per essere importati in mysql, scegliendo un altro approccio.
Ho infatti scelto di provare a bypassare questo problema passando da riga di comando, tramite prompt dei comandi di dos (si, siamo sotto windows).

Ecco dunque cosa bisogna fare per superare i limiti delle configurazioni del php o del phpmyadmin:

  1. Aprire il prompt di dos
  2. digitare:  mysql -u username -p nomedatabase < dump.sql
  3. Premere Invio

Ovviamente, occorre sostituire username con il nome di un utente in grado di compiere queste operazioni (idealmente un amministratore), mettere il giusto nome del database bersaglio (da creare quindi prima) ed inserire il path completo del file dump contenente tutte le query d'importazione dati.

Grazie a questo semplice script dos, che lancia direttamente il comando mysql (bisogna dunque essere posizionati nel giusto percorso del binario di mysql, o averlo mappato come variabile d'ambiente) passandogli già tutti i parametri per la connessione e per fare l'operazione, sarà possibile importare in un colpo solo e anche molto velocemente un intero database mysql compreso di tabelle e viste.

Tra l'altro ho notato che questo metodo di import sql da linea di comando sembra essere più veloce dello script usato dalla pagina del phpmyadmin, e questo non può che non essere una cosa positiva.

lunedì 6 maggio 2019

Come fare i conti con Google

Era da un po' di tempo che non parlavo del potentissimo motore di ricerca google.
Anzi, a dire il vero ormai, chiamarlo motore di ricerca è davvero riduttivo, dato che google consente di fare davvero una marea di cose.

Oggi in particolare volevo parlarvi di questa cosa che ho scoperto or ora, ovvero la possibilità di usare la calcolatrice di google.
Ebbene si, tra le sue mille funzionalità, google consente anche di fare i calcoli online, all'interno del proprio browser, tramite motore di ricerca.
Vediamo subito come fare.

Come usare la calcolatrice di Google


Io personalmente ero già a conoscenza del fatto che se su google si scrive un calcolo da fare, lui come risultato di ricerca riporta il risultato del calcolo effettuato.
Quello che però non sapevo, è che ora è possibile fare i calcoli con la calcolatrice di google direttamente dal proprio browser, grazie ad una specifica funzionalità del motore di ricerca più potente del mondo.

Ecco come fare per usare la calcolatrice di google:

  1. Aprire il sito https://www.google.it
  2. Digitare la parola calc
  3. Premere Invio
  4. Nella calcolatriche che apparirà a video, scrivere il calcolo da effettuare (es. 5*5)
  5. Premere Invio
Ed ecco che come per magia, google avrà fatto il calcolo matematico al posto nostro, utilizzando una potentissima calcolatrice scentifica direttamente integrata nel browser.

Come fare i conti con Google

Si lo so, qualsiasi pc ha il programma calcolatrice installato, però è indubbio che poter fare i calcoli direttamente all'interno del browser con una calcolatrice virtuale è una cosa davvero originale.
E poi in alcuni casi se già ci si trova nel browser, è più veloce usare google che lanciare il programma della calcolatrice di windows :)

venerdì 3 maggio 2019

Leggi il post

get_object_vars PHP ottenere le proprietà di un oggetto

Tra le cose che prima o poi potrebbe capitare di dover fare, c'è anche la necessità di ottenere le proprietà di un oggetto specifico in php.
Che sia una classe o un oggetto di qualsiasi altro tipo, il php mette a disposizione una funzione in grado di ricavare le proprietà degli oggetti.
Vediamo subito come.


get_object_vars PHP


Come si può ben capire dal titolo di questo articolo, la funzionalità php in questione è la get_object_vars.

Vediamo subito di capire come funziona questa funzionalità con un semplice esempio:

<?php
class prova
{
    private $a=4;
    public $b=1;
    public $c="x";
    private $d="y";
}
$classe=new prova;
print_r(get_object_vars($classe));
?>


Il risultato ricavato da questo semplice script, stampato a video sarà:

Array ( [b] => 1 [c] => x )

Grazie a get_object_vars infatti, abbinata alla funzione print_r, sarà possibile stampare a video tutte le variabili pubbliche presenti nella classe prova, comprese di nome variabile e valore.
Ad un osservatore attento poi, non sarà comunque sfuggito il fatto che le variabili stampate a video nell'esempio citato, sono la b e la c, questo perchè appunto, get_object_vars può mostrare solo le proprietà pubbliche degli oggetti, e quindi le varibile private a e d non sono riportate a video.

Tutto molto semplice no?
Con questa funzionalità php si possono dunque ricavare tutte le variabili pubbliche contenute in una classe php.

lunedì 29 aprile 2019

Leggi il post

Stampare a video tutte le costanti PHP

Oggi vediamo un'esigenza un po' insolita ma che prima o poi può capitare a tutti, ovvero il dover stampare a video tutte le costanti presenti/usabili in sito php.
Grazie alla semplice funzione che andrò ad illustrare infatti, potremo sapere in un attimo quali costanti sono state definite a sistema, ed anche il loro contenuto.

Vediamo subito un esempio pratico per capirci meglio.


Come stampare a video tutte le costanti PHP


Innanzitutto, se per caso non sapete come definire una costante in php, basta rileggersi questo post.
Una volta compreso quindi cosa sono le costanti, come di definisco e come si richiamano, ecco che possiamo subito andare ad analizzare il seguente codice per ricavare l'elenco delle costanti php:

<?php
define("server","localhost");
define("tabella","test");
print_r(get_defined_constants(true));
?>


La funzione che fa quello che ci serve è la potentissima get_defined_constants, che può essere valorizzata a true o false per suddividere le costanti ricavate in categorie, in quanto questa funzione php non andrà solo a ricavare quelle definite da noi nel codice, ma anche tutte quelle di sistema.

Se quindi scriviamo get_defined_constants(false), il risultato sarà un array associativo contenente tutti gli array con key il nome della costante e come value il suo valore.
Se invece scriviamo get_defined_constants(true) il risultato sarà una suddivisione di costanti in core (costanti di sistema) e costanti user (ovvero le costanti definite da noi nella nostra applicazione).

Se quindi volessimo ricavare solo le costanti che abbiamo definito noi, ecco cosa potremmo scrivere:

<?php
define("server","localhost");
define("tabella","test");
print_r(get_defined_constants(true)["user"]);
?>


Ed ecco che a video avremo una cosa del genere:
Array ( [server] => localhost [tabella] => test )

Al momento non mi viene in mente nessun esempio valido, ma di sicuro saper come ricavare tutte le costanti usate in un sito/applicazione, prima o poi può sempre tornare utile.

venerdì 26 aprile 2019

Leggi il post

PHP: come avere informazioni su una variabile

Le variabili in php sono un qualcosa di imprescindibile da qualsiasi sito o app, che si tratti di una banale pagina che ha come output semplice html o di un programma complesso, di sicuro si finirà per far gran uso delle variabili.

Ebbene, in alcuni casi, per esigenze di codice, potrebbe anche essere necessario avere informazioni sulle variabili che ci si trova tra le mani, magari perchè inizializzate o valorizzate da classi, oggetti o funzioni dinamiche che non sempre possono dare degli output chiari ed univoci.

Vediamo subito quindi come fare per ricavare le informazioni sulle variabili php, in modo da capirne il tipo ed il contenuto.


Come avere informazioni su una variabile in PHP


Se il vostro scopo è quello di scoprire che tipo di variabili avete tra le mani e quale è il loro contenuto, ecco che vi viene incontro la funzionalità php var_dump.

Il suo funzionamento è molto semplice, ecco un codice d'esempio:

<?php
$a="Ciao";
$b=2.7;
$c=true;
$d=array("Cane","Gatto");
var_dump($a, $b, $c, $d);
?>


Il risultato a video sarà niente poco di meno che:

string(4) "Ciao" float(2.7) bool(true) array(2) { [0]=> string(4) "Cane" [1]=> string(5) "Gatto" }

Ovvero, grazie alla potentissima funzione php var_dump, avremo ricavato per ogni variabile il tipo, la lunghezza ed i valori in essa contenuti.

Nell'esempio appena citato abbiamo una variabile di tipo string di 4 caratteri, un numero di tipo float, una variabile bolean segnata a true ed un array con dentro due valori.
Che altro si può desiderare da questa funzione?
Con un po' di parsing questa funzionalità var_dump può di sicuro regalare gran belle soddisfazioni allo sviluppatore php.

venerdì 15 marzo 2019

Come creare un sito PHP sicuro


Se si sviluppano siti internet utilizzando il php, uno degli aspetti che sicuramente bisogna prendere in considerazione è quello riguardante la sicurezza.
Molti siti web infatti, pur risultando gradevoli da vedere e comodi da utilizzare, potrebbero essere violabili da parte dei malintenzionati, i quali potrebbero addirittura entrare in possesso delle credenziali degli utenti del sito, o peggio ancora di quelle degli amministratori.

In questo tutorial, che aggiornerò man mano che scoprirò metodi più performanti per aumentare la sicurezza di un sito internet, andrò ad indicare tutte le best practice da applicare per poter avere siti php sicuri ed inviolabili... o quantomeno per aumentarne il grado di sicurezza, dato che si usa spesso dire che non esiste in natura niente che prima o poi non possa venir violato.

Iniziamo dunque con l'elenco delle attività da svolgere a livello di programmazione, ma anche di configurazione del php.ini o di apache / nginx, o di database mysql, per poter proteggere un sito web fatto in php ed aumentare il livello generale di sicurezza informatica.



1) Controllare le variabili prima di fare le query


Se il proprio sito internet deve poter dialogare con un database, che sia mysql, oracle, sql server, o qualsiasi altro db, occorre fare il parsing delle variabili che si passano nelle query.
La maggior parte dei siti internet infatti, utilizza query dinamiche, con una parte di condice sql scritto in maniera fissa, al quale vengono passate 1 o più variabili, magari ricevute da una form (metodo POST) o da una url (metodo GET).

Per prevenire quello che viene chiamato sql injection occorre dunque, prima di eseguire una query sul database, controllare le variabili che gli vengono passate.
Questo perchè se un malintenzionato modifica a mano una variabile inserendo un apice ('), questa variabile può generare un errore nella query, e da lì il malintenzionato può capire che è possibile scrivere e far eseguire (utilizzando la giusta sintassi) del codice sql, andando addirittura a leggere o peggio ancora a cancellare l'intero database.

Per proteggersi dall'sql injection quindi, bisogna controllare tutte le variabili che vengono passate ad una query.
Nel caso di numeri interi, basta convertirli con la funzione intval, altrimenti bisogna aggiungere uno slash agli apici presenti nella variabile, tramite la funzione php addslashes.

Ecco un esempio di query sicura:

$sql="SELECT var FROM tabella WHERE var1=".intval($var1)." AND var2='".addslashes($var2)."'";



2) Controllare le variabili prima di stamparle a video


La seconda regola fondamentale da rispettare per evitare problemi con il proprio sito web, è quella di controllare le varabili prima di stamparle a video, soprattutto quelle che ci vengono fornite tramite browser.
Per evitare infatti di incappare nella vulnerabilità nota come Cross-Site Scripting (XSS), che consiste nella possibilità da parte di malintenzionati di far eseguire involontariamente all'utente del codice (tipicamente javascript), occorre parsare le variabili prima di stamparle a video.

In questo caso specifico, quello che vogliamo evitare è che venga eseguito dell'html in variabili che di fatto non contemplano l'html, quindi basta utilizzare la funzione htmlentities per rendere ineseguibile qualsiasi script a livello di browser.

Se poi la variabile in questione contempla l'html, magari possiamo decidere di far sparire solo qualche tag specifico, come lo <script>, con una semplice str_replace.

Ecco un'esempio pratico di queste due funzioni all'opera:

<?php
    $var1="<script>alert('ciao');</script>";
    $var1=htmlentities($var1);
    $var2="<script>alert('ciao 2');</script>";
    $var2=str_replace("<script>","",$var2);
    $var2=str_replace("</script>","",$var2);
    echo "$var1 $var2";
?>



3) Criptare le password salvate nel database


Sia per via della terribile GDPR, ma anche in generale in meri termini di sicurezza informatica, non bisogna mai salvare le password in chiaro nel database.
A livello di php quindi, prima di salvare su mysql una password, occorre convertirla con qualche apposito algoritmo.
Così facendo, un malintenzionato che entrerà in qualche modo in possesso delle credenziali del nostro database, non potrà in alcun modo conoscere le password d'accesso memorizzate nel db.

Se poi vogliamo complicare ulteriormente la vita agli hacker (o forse crackers è meglio), prima di generare la nostra password criptata, possiamo aggiungere un valore random alla parola segreta scelta dall'utente, in modo che nessuno possa mai risalire alla password, anche se in possesso di un database di password criptate con cui fare bruteforce.

Questo secondo metodo si chiama salt, mentre la funzione per criptare le password in php è la crypt.
La funzione crypt può essere utilizzata scegliendo vari algoritmi di criptazione, come ad esempio: DES, MD5, SHA-256 e SHA-512.

Ecco un semplice esempio di generazione di password criptata con il php:

<?php
    $password="pippo";
    $salt=rand(10000,99999);
    $password=crypt($password,$salt);
    echo $password;
?>



4) Cambiare la chiave di sessione dopo la login


Un errore comune e forse meno noto, quindi potenzialmente sfruttabile da qualche malintenzionato, è quello di non far rigenerare un nuovo valore di chiave di sessione dopo la login ad un sito php.
Questa problematica, nota come Session Fixation, può essere sfruttata dai malintenzionati che hanno accesso allo stesso pc della persona che si logga con la nostra applicazione, oppure da chi ha accesso alla rete ed è in grado di utilizzare la tecnica nota come Man-in-the-Middle.

Praticamente funziona così.
Quando si prova ad accedere ad un sito web verificando il valore di una sessione, il php genera in maniera random il cosiddetto PHPSESSID.
Purtroppo però, quando si effettua la login, questo valore di default non viene rigenerato, quindi se qualche malintenzionato riesce ad ottenere questo valore semplicemente aprendo (dal pc della vittima) l'applicazione senza loggarsi, quando poi questa si logga, il malintenzionato può usare questo session id per risultare loggato con le credenziali della vittima.

Per evitare questa (abbastanza remota) problematica, basta rigenerare il sessionid dopo ogni login, in modo tale che nessuno possa sapere il valore della nostra sessione.
Per fare ciò in php basta utilizzare la funzione session_regenerate_id.

Ecco un esempio pratico di come rigenerare una sessione php:

<?php
    session_start();
    echo session_id();
    session_regenerate_id();
    echo "<br>".session_id();
?>



5) Abilitare l'https


Ormai è una cosa che si da per scontata la connessione sicura su un sito web.
Quello che bisogna fare per attivare l'https su un sito è innanzitutto acquistare un certificato ssl da installare sul server, oppure cercarne uno gratuito online.
Una volta entrati in possesso del certificato, bisogna copiare i file necessari sul server e configurare apache (o nginx, o iis) in modo tale che il sito in prima battuta faccia in automatico la redirect dall'http all'https.
Ecco un esempio di configurazione del file httpd-vhosts.conf:

<VirtualHost *:80>
    ServerName sito.it
    ServerAlias sito.it
    Redirect / https://sito.it/
    <Directory  "C:\wamp64\www\sito">
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Adesso bisogna andare a modificare il file httpd-ssl.conf (tipicamente nel percorso conf/extra), ad esempio in questo modo:

<VirtualHost *:443>
    ServerName sito.it
    ServerAlias sito.it
    SSLEngine On
    SSLCertificateFile C:\percorso\certificato.crt
    SSLCertificateKeyFile C:\percorso\chiave-certificato.key
    DocumentRoot C:\wamp64\www\sito

    <Directory  "C:\wamp64\www\sito">
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>


Abilitando l'https tra l'altro, si evita che il browser dica all'utente che il sito non è sicuro, messaggio non propriamente incoraggiante.


6) Proteggere i cookie e le sessioni


Per evitare / ridurre il rischio che qualche aggressore possa intercettare e manipolare cookie e sessioni, è bene abilitare due attributi del php, l'attributo Secure e l'attributo HttpOnly.
Il primo attributo implica che il cookie può essere trasmesso solo tramite un canale di comunicazione sicuro (es. l'https, che quindi va preventivamente abilitato sul sito), riducendo così il rischio che sia intercettato da parte di un malintenzionato in grado di monitorare il traffico di rete.
Il secondo attributo invece, impedisce al codice client-side, tipo il javascript, di accedere al contenuto del cookie, impedendo così che un eventuale codice malevolo possa rubare dati sensibili, riducendo così il rischio di furto della sessione tramite Cross-Site Scripting (XSS).

Entrambi questi attributi possono essere abilitati direttamente dal php.ini, andando a proteggere le sessioni ed in particolare il cookie legato al PHPSESSID, semplicemente settando queste righe:

session.cookie_secure = 1
session.cookie_httponly = 1

Se invece si vuole assegnare questi attributi anche ai cookie generici, basta farlo direttamente quando si crea il cookie con il php, con questa sintassi:

setcookie("nome-cookie","valore",strtotime("+1 year"),"","",true,true);

Gli attributi Secure e HttpOnly sono rispettivamente, il penultimo e l'ultimo valore settato nel cookie, che in questo caso sono semplicemente indicati a true.
Grazie a questa accortezza si riduce il rischio di session hijacking.


7) Utilizzare password sicure


Dando per scontato che lato amministrativo si utilizzino solo password complesse, bisognerebbe anche muoversi per sensibilizzare l'utente finale sull'importanza di avere delle password d'accesso robuste.
Questo potete farlo lato codice, obbligando gli utenti a scegliere password sicure, che rispettano i seguenti requisiti:
  1. Lunghezza di almeno 8 caratteri
  2. La password deve contenere sia numeri che lettere
  3. La password deve contenere almeno un carattere speciale
  4. La password deve avere almeno una maiuscola

Se tutti gli utenti utilizzassero questi criteri quando impostano la loro password personale, i malintenzionati di turno farebbero molta più fatica a rubare le credenziali alla gente, anche con il terribile bruteforce.

Volendo poi esagerare, lato codice si potrebbe far scadere la password d'accesso ogni 3/6 mesi, obbligando l'utente a cambiarla all'accesso.
Se poi avete rispettato la best practice di non salvare le password in chiaro nel database, ed avete usato un buon algoritmo di criptazione più il salt, allora potete stare ancora più tranquilli.


8) Abilitare i controlli con il CAPTCHA


Inserire la richiesta del CAPTCHA dopo enne volte che si sbaglia ad inserire la password è un qualcosa di ormai obbligatorio per combattere tentativi di forzatura della sicurezza tramite bruteforce.
Ci sono diversi siti che offrono il servizio di sicurezza CAPTCHA, il più famoso è sicuramente quello fornito da google, il famigerato recaptcha (https://www.google.com/recaptcha/).

Questo sistema può essere installato/configurato in modo che sia più o meno invasivo.
C'è infatti la versione che richiede solo la classica spunta alla voce "non sono un robot", oppure quella in cui ci viene chiesto di cliccare sulle strisce pedonali.
La modalità in cui viene chiesto di compiere delle azioni può essere più o meno invasiva a seconda dei casi, il mio consiglio è quello di posizionarsi in una via di mezzo, senza disturbare troppo l'utente finale con click eccessivi.

Il controllo tramite codice CAPTCHA tra l'altro, può essere inserito anche nelle form d'iscrizione, o in tutte quelle pagine in cui viene chiesto di compiere un'azione all'utente.
Se ad esempio si imbastisce un controllo che, dopo enne richieste nel giro di poco tempo da parte dello stesso indirizzo ip, richiede la verifica CAPTCHA, questo può aiutare a verificare se ci si trova davanti ad un attacco bot, e può ad esempio servire a mettere al riparo il nostro database da un inserimento massivo di dati indesiderati, o anche a non essere sommersi da email di spam provenienti dai nostri stessi form di contatto.


Il tema della sicurezza informatica, aka cyber security è sicuramente molto importante per chiunque sviluppi appicazioni web, che si utilizzi il php o anche qualsiasi altro linguaggio di sviluppo.
Occorre dunque non mostrare mai il fianco al cyber crime, anche perchè la GDPR ormai impone di rispettare alcuni requisiti minimi di sicurezza, altrimenti si rischia pure di non essere a norma di legge.

giovedì 7 marzo 2019

Ottenere i nomi dei file di una cartella (Windows)

Era da un po' di tempo che non facevo una guida per il computer, quindi eccomi qui oggi a farne una per windows 10.
Questo tutorial in realtà funziona anche sui windows meno recenti, dato che andremo ad operare con il potentissimo prompt dei comandi.

Nello specifico, l'esigenza è quella di poter esportare i nomi dei file contenuti in una cartella, in modo tale da averli tutti scritti in un file di testo (un txt per intenderci).
Tutto ciò può tornare utile in diverse occasioni, a me ad esempio è servito per avere l'elenco delle foto contenute in una determinata cartella di windows, e poi grazie a questo elenco scritto di nomi di file, ho potuto ricercarli e copiarli tutti in un'altra directory.
Avevo infatti un album di foto da rifare in alta definizione, quindi sapendo il nome dei file e dove prendere la loro versione HD, ho potuto agire velocemente grazie al tutorial che sto per andare ad illustrarvi.


Come ottenere i nomi dei file presenti in una cartella su Windows 10


Per poter ricavare l'elenco dei file e cartelle presenti in una determinata directory, e salvare questa lista in un semplice file di testo txt, bisogna agire nel seguente modo:

  1. Aprire il prompt di windows
  2. Entrare dentro la cartella dove sono contenuti i file da estrarre (con il comando cd nomecartella)
  3. Lanciare il comando: dir > lista.txt

Tutto qui.

Ottenere i nomi dei file di una cartella (Windows)

Con questa semplice sintassi infatti, avremo creato un file di testo chiamato lista.txt, contenente tutti i file (e le eventuali cartelle) presenti nella directory in cui abbiamo lanciato il comando dos dir.

Adesso con questo file di testo contenente l'elenco dei file della nostra cartella, potremo farci un po' quel che ci pare, anche elaborarlo per avere una lista più pulita ed operativa per altre batch dos automatiche.

Se per caso questa procedura non fosse abbastanza chiara, ecco qui il link al video tutorial su youtube su come esportare l'elenco dei file presenti in una cartella windows (10 e non):
https://youtu.be/RrWpYKtZ9Fo

martedì 15 gennaio 2019

Come mettere foto animate su Youtube

So cosa starete per dire dopo aver letto il titolo di questo post: ma che cavolo stai dicendo Willy? Da che mondo e mondo su youtube si caricano i video!
Ebbene si, è vero, ma da un po' di tempo a questa parte sul tubo è possibile caricare anche un altro tipo di contenuto.
E' infatti ora possibile mettere foto su youtube, che siano gif animate o semplici immagini, il tutto come se fosse un qualsiasi altro social.

In realtà questa funzionalità / possibilità è già da un po' che esiste, però un tempo questa preziosa opzione era preclusa ai soli creator che avevano almeno 10000 iscritti.
Da un po' di tempo a questa parte però, anche ai comuni normali è comparso il tab community nel proprio canale, un tab a dir poco indispensabile per poter caricare foto su youtube.

Ma bando alle ciance, vediamo subito come fare.


Come mettere foto animate su Youtube


Per poter caricare immagini / foto, animate o non, su youtube, basta seguire questi semplici ed elementari passaggi, validi sia da yt app, che da yt per computer:

  1. Loggarsi su youtube
  2. Accedere al proprio canale
  3. Cercare e cliccare sulla tab community
  4. Cliccare sul box di scrittura che comparirà a video
  5. Cliccare sull'icona che rappresenta le immagini (simbolo universale)
  6. Cercare l'immagine da caricare nel proprio dispositivo, o anche solo trascinarla se si utilizza un pc
  7. Scrivere un eventuale messaggio ai propri followers
  8. Cliccare sul tasto Pubblica

Come mettere foto animate su Youtube

Tutto qui.
L'immagine postata sarà ora disponibile a tutti i propri fans, ma potrebbe anche apparire nella home di youtube di anche altre persone, come suggerimento di visione diciamo.

Attenzione però.
Se da una parte questa funzionalità apre le porte a nuove forme di intrattenimento, anche più veloci e semplici della creazione di un video, dall'altra parte bisogna stare molto attenti a non caricare immagini protette da copyright.
Non vorremo mica farci chiudere il canale dopo che ci siamo sbattuti tanto per non caricare video con musica di altri o video di altri, no?

A grandi poteri corrispondono grandi responsabilità (cit.).

Ad ogni modo, qui di seguito la video spiegazione su come mettere le foto su youtube per chi ha android:
https://www.youtube.com/watch?v=C2ZaX1D5Yg8

martedì 25 dicembre 2018

Come nascondere un video su youtube

Se usi il tubo per pubblicare filmati, a volte potrebbe anche capitarti di voler non rendere disponibili i tuoi video a tutto il mondo, ma magari solo a te stesso o a qualche amico di fiducia.
Premesso che comunque youtube non è vimeo e che quindi la gestione della privacy e dei permessi di visualizzazione è un po' meno potente, comunque col tubo è possibile mostrare o nascondere i propri filmati a piacimento.

Vediamo subito le opzioni a nostra disposizione per nascondere video yoututbe al mondo intero, o solo ai nostri non amici.


Come nascondere un video su youtube


Per far sparire un video da youtube, a parte eliminarlo, come spiegato in questo post, è possibile cambiarne lo stato.
Per fare ciò basta:
  1. Loggarsi a youtube
  2. Entrare nel video desiderato
  3. Cliccare sul bottone Modifica
  4. Nella sezione di destra troverai la tendina degli stati, che sono: Pubblico, Non in elenco, Privato.
  5. Scegliere lo stato desiderato e poi cliccare su Salva modifiche

Come nascondere un video su youtube

Ecco fatto.

Ora però vediamo di capire nel dettaglio quali stati usare in base alle proprie necessità.
Lo stato Pubblico non ha neanche bisogno di spiegazioni, in quanto è lo stato in cui mettere un video per far sì che questo venga visualizzato da tutti online.

Lo stato non in elenco è lo stato youtube da utilizzare per condividere un video solo con i propri amici.
Tramite questo stato infatti, il video yt sarà accessibile solo per chi ne conosce l'indirizzo web.
Ora ovviamente il limite di sicurezza che salta all'occhio, è che se qualcuno spoilera il link in giro, il video di fatto non è più privato per pochi eletti.

Infine lo stato privato è quello che garantisce il 100% della privacy e riservatezza di un video.
Questo stato si usa infatti per rendere un video privato, ovvero visibile solo da sé stessi.

Bene, con gli stati dei video youtube direi che è tutto.
Non escludo che in futuro il tubo aggiunga qualche nuovo stato o funzionalità per gestire maggiormente la privacy dei video.

giovedì 20 dicembre 2018

Leggi il post

Come sapere se una variabile è un array (PHP)

Sempre a proposito di array php, argomento ormai un po' troppo abusato su questa sezione guide del mio sito, oggi spiegherò un'ulteriore funzionalità, tanto semplice quanto a volte importante.

Mettiamo ad esempio che per esigenze di vario tipo non si sa esattamente se una variabile è un array, ad esemio in quei casi in cui non si è certi dell'esito di un popolamento dinamico, ecco che avere una funzione php che ci dice esattamente questa cosa può sicuramente essere una cosa utile e gradita.
Vediamo dunque di scoprire come fare questa semplice verifica.


Come sapere se una variabile è un array (PHP)


Tra le tante funzionalità php per gestire gli array non poteva certo mancarne una che semplicemente ci dice se una variabile è un array.
Senza altri giri di parole, ecco la stringa necessaria per scoprire quanto appena accennato:

is_array($variabile);

Tutto qui.
La funzione php is_array infatti, passandogli una variabile di qualsiasi tipo, si limita a restituire true o false a seconda se ci si trovi davanti ad un array oppure no.

Ecco un esempio pratico:

<?php
$var1=array(1,2,3);
if(is_array($var1)) echo "var1 è un array<br>\n";
else echo "var1 NON è un array<br>\n";
$var2="pippo";
if(is_array($var2)) echo "var2 è un array<br>\n";
else echo "var2 NON è un array<br>\n";
?>


Nell'esempio (banale) qui sopra citato, grazie alla funzione is_array abbiamo scoperto che var1 è un array, mentre var2 non lo è.
Al momento non mi viene in mente nessun esempio più intelligente per dimostrare l'importanza di questa funzione, ma credetemi sulla parola, un giorno sicuramente potrà tornarvi utile :)

Buon coding.

giovedì 13 dicembre 2018

Come testare il php online

Facendo diversi tutorial sul php, spesso mi sono trovato a dover creare delle pagine php solo per testare quanto stavo per pubblicare sul sito, giusto per essere sicuro di non scrivere castronerie o commettere qualche errore di svista (cit.).

L'altro giorno però, ho avuto un'illuminazione.
Mi sono chiesto: ma non esisterà un sito per testare il php online?
E dopo una breve ricerca su google, con somma gioia ho scoperto che fortunatamente il sito in questione esisteva eccome.
Ed eccomi qui a fare un nuovo breve tutorial su come provare il php online.


Come testare il php online


Mettiamo caso di trovarci fuori casa e di non aver sottomano il nostro wamp o lamp di fiducia.
Mettiamo caso di non avere alcuno spazio online che supporta il php, o mettiamo caso di non aver neanche voglia di installare webserver come apache, nginx, il php e fare configurazioni varie.
Ecco che in questi casi ci viene in aiuto una sandbox online che consente di lanciare le php functions più famose (non tutte ovviamente per motivi di sicurezza).
Ecco il sito di cui sto parlando:

http://sandbox.onlinephpfunctions.com

Questo php editor online, anche se non è propriamente corretto chiamarlo così, consente di eseguire intere righe di codice, script interi, risultando quindi molto utile per testare online quanto si sta facendo, in maniera rapida ed immediata.

Il funzionamento di questo sito è molto semplice.
Basta scrivere nell'apposito box il codice php che si vuole eseguire, scegliere la versione del php desiderata, ed il formato d'output.
Infine basta cliccare sul bottone Execute code, per ammirare a video il risultato ottenuto.

Come testare il php online

Se poi si vuole salvare il codice scritto, per poi implementarlo in produzione sui propri server, basta cliccare sul bottone Save or Share your code.

Ovviamente questo utilissimo sito può essere tranquillamente utilizzato per testare semplici script o righe di codice php, ma non è certo pensabile utilizzarlo per sviluppare in toto una web application.
Però sicuramente, ad esempio, si può utilizzare questo sito per verificare al volo se una certa funzione è compatibile con diverse versioni del php, e scoprire ad esempio da che versione in poi una funzionalità php è disponibile.

Ed anche per oggi è tutto, buon divertimento con il php online :)

mercoledì 12 dicembre 2018

Disattivare riproduzione automatica video Youtube Home

Tempo fa avevo fatto una prima guida su come disattivare la riproduzione automatica dei video su youtube, e da allora il mio telefono aveva risparmiato un sacco di traffico dati da tutti quei video che automaticamente partivano dopo il termine di un filmato che invece mi interessava vedere.

Da pochissimo invece youtube, ha aggiunto un'altra opzione di riproduzione automatica video, questa volta decisamente più invasiva, se vogliamo vederla così.
Infatti ora l'app di youtube per android (e non), quando si apre la home page del tubo, fa partire in automatico i video di cui prima si vedeva solo l'immagine di copertina.

Introducendo questa nuova funzionalità, quantomeno il tubo ha deciso di far partire i video senza l'audio, se no chissà che casino ogni volta che si apriva l'app per android. Tuttavia è scontato che questa nuova funzionalità consuma banda, quindi vediamo subito come fare per disattivarla.


Come disattivare la riproduzione automatica dei video nella home di youtube


Senza perdere ulteriore tempo in spiegazioni e preamboli, ecco come fare per disabilitare l'autoplay dei video nella home page dell'app di youtube per cellulare (android e non):

  1. Apri l'app di youtube per cellulare
  2. Clicca sull'icona del tuo account, in alto a destra
  3. Clicca su Impostazioni
  4. Clicca su Riproduzione automatica
  5. Clicca su "Riproduci automaticamente sulla home"
  6. Clicca su Disattiva

Disattivare riproduzione automatica video Youtube Home

Ed ecco fatto.
Da ora in poi, quando aprirai l'app di youtube, i video non partiranno in automatico, ma per lanciarli dovrai cliccarci sopra, come hai sempre fatto.

Qui di seguito la video spiegazione di quanto appena illustrato a parole:
https://youtu.be/cpeyBpouu7g



Se poi questa opzione invece ti piace e la trovi utile, nessun problema.
Se per caso hai disattivato l'autoplay dei video yt, ti basta rieseguire questa procedura dall'inizio, ed arrivato alla scelta finale optare per "sempre attiva" o su "solo wi-fi".

A me personalmente la riproduzione automatica di youtube non è mai piaciuta, preferisco scegliere io cosa e quando vedere qualcosa.
Però immagino che vedere l'anteprima di un video non sia esattamente come guardarlo aprendolo in alta definizione, quindi sì, un po' più di traffico dati lo si consuma, ma sempre in maniera ragionevole.
E poi se siete degli utenti navigati sicuramente sarete già incappati in altri siti dove invece l'autoplay video è attivo, se non altro al passaggio del mouse o al click del dito, quindi volendo guardarla così per youtube è comunque una funzionalità in più per stare al passo con la concorrenza... e non certo un metodo per far partire in automatico la pubblicità... e si, perchè anche quella parte da sola ;)

giovedì 6 dicembre 2018

Leggi il post

Come sapere se una chiave è presente in un array php

Era un po' che non facevo un post sul php, quindi eccomi qui con questa breve guida pratica su come scoprire se una chiave è presente in un array.
Può infatti capitare di non essere a conoscenza di uno specifico valore (value) di un array, ma di conoscerne invece la chiave (key). Ecco che quindi il php ci viene in contro con una specifica funzione che ci consente di riconoscere se una chiave è contenuta all'interno di un array.

Vediamo subito come fare


Come sapere se una chiave è presente / esiste in un array php


La sintassi che consente di scoprire se una key è presente in un array php, è molto semplice.
Eccola qui di seguito:

array_key_exists(chiave, array);

Grazie infatti alla funzione php array_key_exists è possibile, passando come primo parametro la chiave da ricercare e come secondo il nome dell'array in cui cercare, scoprire se una determinata key è presente in un array (exists, per l'appunto).

Questa funzione restituisce semplicemente true o false, quindi può essere utilizzata in tutti casi in cui si deve, ad esempio, verificare l'esistenza di un indice array prima di aggiungere un nuovo elemento ad un array.

Se invece si conosce il valore dell'array e non la key, basta utilizzare questo metodo per verificarne l'esistenza.

Bene, è tutto, buon coding con il key exist php array.

lunedì 26 novembre 2018

Leggi il post

Come collegarsi a Salesforce con il PHP

Se nella tua azienda è stato acquistato il potentissimo (e costosissimo) crm salesforce, devi sapere che oltre a porterlo usare in cloud dalla loro piattaforma online, è anche possibile accingere ai dati tramite delle api php.
Ci sono diversi script già fatti in rete, ma se vuoi avere pieno controllo di quello che fai, posso indicarti la sintassi da utilizzare per collegarsi a salesforce da php, in modo tale da poter fare query ed operazioni varie su quello che è ad oggi il crm numero uno al mondo (almeno credo).


Come collegarsi a Salesforce con il PHP


Prima di poter pensare di connettere una pagina php a salesforce, bisogna abilitare l'ip della macchina da cui ci si intende collegare (o farci abilitare, se non si è amministratori di sistema), ed ovviamente farci dare le credenziali d'accesso (più sotto meglio specificate).

Poi è necessario che il php.ini abbia abilitata/scommentata la seguente riga extension=php_openssl.dll, ed anche la extension=php_curl.dll.

Una volta soddisfatti questi requisiti, potremo iniziare a scrivere un po' di codice php, in modo tale da collegarci a salesforce senza per assurdo avere neanche l'utente a sistema (ma ovviamente è consigliatissimo averlo, per poter verificare che i dati estratti siano corretti).

Bene dunque, bando alle ciance, ed ecco il codice php per la connesione a salesforce:

<?php
    $curl=curl_init();
    curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
    $url="https://login.salesforce.com/services/oauth2/token";
    $param=http_build_query(
        array(
            'grant_type'=>'password',
            'client_id'=>'ID-CLIENTE',
            'client_secret'=>'CODICE-SEGRETO-CLIENTE',
            'username'=>'USERNAME',
            'password'=>'PASSWORD'
        ));
    curl_setopt($curl,CURLOPT_URL,$url);
    curl_setopt($curl,CURLOPT_POST,5);
    curl_setopt($curl,CURLOPT_POSTFIELDS,$param);
    $resp = curl_exec($curl);
    if(!curl_exec($curl))
    {
        echo 'Errore: "' . curl_error($curl) . '" - Codice: ' . curl_errno($curl);
    }
    else
    {
        $resArr=json_decode($resp);
        $token=trim($resArr->access_token);
        $newurl=trim($resArr->instance_url);
        if($token!=""&&$newurl!="")
        {
            $url=$newurl."/services/data/v42.0/query";
            $param="q=".urlencode("SELECT Name FROM Account ORDER BY Name");
            $url=$url."?".$param;
            curl_setopt($curl,CURLOPT_URL,$url);
            curl_setopt($curl,CURLOPT_POST,false);
            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
            curl_setopt($curl,CURLOPT_HEADER,false);
            curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
            curl_setopt($curl,CURLOPT_HTTPHEADER,array("Authorization: OAuth $token"));
            $json_response = curl_exec($curl);
            $status=curl_getinfo($curl,CURLINFO_HTTP_CODE);
            if ($status!=200)
            {
                die("Errore: " . curl_error($curl) . ", Codice " . curl_errno($curl));
            }
            else
            {
                $risultato=json_decode($json_response);
                $trovati=intval($risultato->totalSize);
                $completato=$risultato->done;
                $nexturl=$risultato->nextRecordsUrl;
                if($trovati>0)
                {
                    $lista=$risultato->records;
                    foreach($lista as $key=>$value) echo $value->Name."<br />";
                }
            }
        }
    }
?>


Vediamo di analizzare un po' meglio questo all'apparenza corposo codice.

Innanzitutto c'è da dire che per poter effettuare la chiamata da php a salesforce si utilizzano le potentissime curl.
I parametri da impostare in questo script d'esempio sono solo quelli d'accesso: grant_type (dove bisogna scrivere semplicemente la parola password), client_id, client_secret, username e password.

Effettuata con successo la login riceveremo indietro, tra le altre cose, un access_token ed un instance_url.
Il primo è ovviamente il token d'accesso per poter proseguire, mentre il secondo è l'indirizzo a cui bisogna reindirizzare la successiva chiamata curl.

Per pescare i record presenti di una tabella salesforce da php quindi, si effettuerà una seconda chiamata, alla quale verrà passata come parametro la query in formato soql.
L'soql è una sorta di sql di salesforce, molto simile all'originale per fortuna, con i classici comandi select, insert, update, delete, e le varie condizioni where e le possibilità di ordinamento con order.

Il risultato ottenuto, come per la prima chiamata, sarà in formato json, quindi andrà estrapolato da lì con le classiche funzioni php.

Come ultima precisazione importante c'è da dire che salesforce potrebbe avere impostato dei limiti alle chiamate delle varie api webservice php, come ad esempio il numero massimo di risultati settato a 2000 alla volta (se non ricordo male).
Quindi se la vostra intenzione è quella di mostrare a video tutti i record presenti in una tabella sf, dovrete creare una funzione ricorsiva da richiamare di volta in volta.
Per far questo vi vengono incontro i parametri json totalSize (vi fa capire il numero di record presenti), done (per capire se il risultato mostrato è totale (true) o parziale (false)), e nextRecordsUrl (ovvero l'url da passare alla funzione ricorsiva alla quale deve puntare la prossima chiamata della curl a salesforce).

Bene è tutto.
Se avrete fatto tutto correttamente, manipolando un po' il codice che vi ho illustrato, potrete fare tutte le api php salesforce che volete... o meglio, sempre nei limiti imposti dal crm.


Possibili errori / problemi nella connessione php -> salesforce


Già che ci sono riporto i possibili errori di connessione che potrebbero capitarvi.

{"error":"invalid_client","error_description":"invalid client credentials"}
In questo caso potreste aver sbagliato ad immettere uno dei parametri d'accesso richiesto, oppure potrebbe esserci anche qualche spazio di troppo, o non è stata rispettata la giusta sintassi.

[{"message":"unexpected token","errorCode":"MALFORMED_QUERY"}]
E' stata inserita la sintassi soql salesforce sbagliata.

[{"message":"INVALID_HEADER_TYPE","errorCode":"INVALID_AUTH_HEADER"}]
Probabili problemi con il token o con l'autentificazione, o nella formattazione dell'header inviato via curl a salesforce.

[{"message":"Session expired or invalid","errorCode":"INVALID_SESSION_ID"}]
Problema con il token e l'autentificazione, magari il codice è errato o c'è qualche spazio di troppo (oppure è scaduto).

Errore: "SSL certificate problem: unable to get local issuer certificate"
Questo può darlo quando i certificati sul server sono in scadenza o non sono configurati al meglio.
Essendo un errore specifico della chiamata curl, si può risolvere aggiungendo questa opzione:
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);

Bene, direi che per il momento è tutto sull'argomento salesforce php.
In caso di dubbi o problemi scrivetemi nei commenti.

giovedì 25 ottobre 2018

Leggi il post

Ridurre il peso di un file sqlite

Il database sqlite è molto utile per sviluppare app in python o anche per smartphone.
Con la sua sintassi simile all'sql, può consentire di effettuare query anche complesse tra varie tabelle, come un vero e proprio database relazionale.

Quello che però voglio spiegarvi oggi in questo breve post, è come ridurre il peso di un file sqlite.
Rispetto ai classici database tipo mysql infatti, in sql lite le dimensioni contano.
O per meglio dire, ci si fa più caso, dato che ci si trova a spostare fisicamente file su telefoni o altri dispositivi, cosa che di solito con altri tipi di database non capita molto spesso di fare.

Dopo aver fatto una delete di una tabella sqlite infatti, mi sono accorto che il peso del file del database non era calato, e questo era male dato che avevo svuotato la tabella proprio per risparmiare sullo spazio, visto che il buono e fido app inventor / thunkable, non consente di creare app troppo pesanti, e di sicuro neanche di caricare a progetto file che pesano più di cento mega.

Vediamo dunque di capire come superare questa difficoltà.


Come ridurre il peso di un file sqlite


Dopo tutti questi preamboli e premesse, in realtà poi il comando da lanciare per ottimizzare un database sqlite è uno solo.
Ecco cosa bisogna fare in soldoni: prima selezionare il database da ridurre, e poi digitare il comando sql:

VACUUM

Nonostante il nome un po' vodoo, questo comando non fa altro che riallocare lo spazio nel file del database sqlite, che dopo una delete potrebbe aver lasciato qualche buco e quindi non essersi ridotto di dimensioni.
Ho detto potrebbe, perchè se per caso il database è settato con l'impostazione di autovacuum, tutto quanto appena scritto non sarà più necessario.
Basterà infatti impostare la cosa utilizzando la seguente sintassi:

PRAGMA schema.auto_vacuum;

Ed ecco che il database sqlite sarà ora ottimizzato in automatico dopo ogni delete o cambio di dati.