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

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ì 18 ottobre 2018

Leggi il post

Rimuovere separatore di troppo in php

Ti è mai capitato di generare una sorta di file csv tramite php e di dover utilizzare un contatore per capire quale è l'ultimo valore di un loop, e non mettere così alla fine il punto e virgola?
A me si, e spesso anche :p
Bene, e se ti dicessi che c'è una funzione php che può farti risparmiare qualche riga di codice? Una funzione che nasce per altri scopi e che può servire anche per rimuovere caratteri specifici alla fine di una stringa.

Bene allora, bando alle ciance e vediamo subito con un po' di codice di capire di che cosa sto parlando.


Come rimuovere un separatore di troppo con il php


Prendiamo il caso sopraccitato.
Se ad esempio con un loop hai generato una lista di nomi separata da un punto e virgola, o più in generale una lista di valori, e non ti sei preoccupato di piazzare il separatore anche all'ultimo valore in elenco, e questo può essere un problema per successivi loop after explode, ecco cosa devi fare per risolvere subito la questione:

<?
    $stringa="nome;cognome;stato;regione;telefono;";
    echo rtrim($stringa,";");
?>


La funzione php che con un colpo solo rimuove l'ultimo separatore indesiderato è la potentissima rtrim.
In pratica con questo comando, a cui passi la stringa da pulire ed il carattere (anche stringa) da eliminare, puoi far sparire l'ultimo punto e virgola di destra.
Tutto molto più semplice, no?

Se invece vuoi far sparire il primo separatore presente in una stringa, ti basta un ltrim ed il gioco è fatto.

lunedì 8 ottobre 2018

Come connettersi ad oracle da php

Il database per eccellenza di chi sviluppa in php è sicuramente il mysql, questo lo sanno tutti.
Ma se vi dicessi che mysql è una sorta di versione free ridotta di oracle? :p
Bene, se nella vostra azienda non sono solo opensourcisti ed avete a disposizione anche questo signor database, potrebbe capitarvi la necessità di dover pescare dati dal php ad oracle, direttamente, senza server linkati o diavolerie simili (che alla lunga possono dare problemi).

Vediamo dunque come fare per potersi collegare ad oracle da php, in modo tale da poter inserire / modificare / cancellare dati su un database oracle presente su un altro server.


Come connettersi ad oracle da php


Prima di passare al codice da utilizzare per effettuare questa connessione, occorre agire sul php.ini per poter abilitare un'estensione necessaria per far parlare oracle con il php, trattasi della php_oci8.

Come connettersi ad oracle da php

A seconda della versione di oracle con cui dovete parlare, dovrete abilitare/installare una dll piuttosto che un'altra (es. php_oci8_11g o php_oci8_12c).
Diciamo che in linea di massima la versione 12c dovrebbe essere quella corretta per le più recenti versioni di oracle.
Ad ogni modo, se avete wamp, per abilitare le estensioni basta un click, altrimenti basta andare nel php.ini ed al paragrafo Extensions, scommentare (togliendo il punto e virgola prima della stringa) o aggiungere (se non presente) la seguente riga:
extension=php_oci8_12c.dll
poi riavviare il webserver (o wamp) per rendere effettive le modifiche.

Adesso che la parte di configurazione è terminata, vediamo subito il codice necessario per potersi collegare ad oracle da una pagina php:

<?php
$conn=oci_connect('username','password','server/database');
if(!$conn)
{
$e=oci_error();
trigger_error(htmlentities($e['message'],ENT_QUOTES),E_USER_ERROR);
}
else
{
$stid = oci_parse($conn, 'SELECT campo FROM tabella_oracle WHERE condizione');
oci_execute($stid);
while(($row=oci_fetch_array($stid, OCI_BOTH))!=false)
{
echo $row['campo'];
}
}
?>


Da queste poche righe di codice si evince che la funzione necessaria per collegarsi ad oracle è la oci_connect.
Superata la connessione senza errori, si può sfogliare la tabella del database ed ottenere tutti i campi che si vuole, utilizzando più o meno la sintassi a cui si è abituati per ottenere i risultati delle query con il php.

Da tenere presente inoltre che potrebbe essere necessario specificare il nome esatto dei campi, compreso di maiuscole e minuscole (case sensitive).

La sintassi per eseguire query su oracle da php è la oci_excecute, che ovviamente può utilizzata anche per insert ed update, oltre che per sfogliare tabelle.
Inutile dire che anche per dialogare con oracle è vitale parsare le variabili da passare al db, per evitare il rischio del terribile sql injection.

Che altro dire sull'agomento?
Niente direi, a parte il fatto che se dovete connettervi ad una versione vecchia di oracle (ad esempio la 9), da una macchina con su un php nuovo, potreste faticare non poco per riuscire a reperire le giuste dll della oci (idealmente la 11c), senza le quali a video nella vostra bella pagina php avrete il seguente messaggio d'errore: "Call to undefined function oci_connect()".
Io ho perso più tempo ad aggiustare l'aspetto sistemistico della cosa, piuttosto che a fare uno script complesso per fare una migrazione da oracle a mysql!
Ad ogni modo, per i posteri, io ho risolto questo errore di connessione scaricando l'oracle instant client per la mia versione di windows (https://www.oracle.com/database/technologies/instant-client/downloads.html) e copiando i file oci.dll, oraociei12.dll (o versione scaricata) e oraons.dll nella cartella bin di apache del mio wamp.

venerdì 17 agosto 2018

Leggi il post

Valore massimo / minimo in array php

Oggi torniamo a parlare ancora una volta degli array php.
Argomento da me molto apprezzato perchè consente un po' di fare tutto quello che serve per le varie web app, gli array sono diventati molto potenti e versatili nel corso degli anni.

Premesso che con l'uscita di sempre nuove versioni del php è possibile fare la stessa cosa con metodi e funzioni diverse, in questo post spiegherò come ottenere il valore massimo e minimo di un array, necessità che prima o poi capita un po' a tutti.

Vediamo subito come fare.


Come ottenere il valore massimo in array php


Se si ha un array php con molti valori, magari neanche ordinati, e si vuole ottenere in un colpo solo il valore massimo di un array, la funzione che fa al caso nostro si chiama max, ed è utilizzabile anche per altri tipi di variabili.

Ecco un esempio pratico:

<?
    $array=array("A"=>"Asso","B"=>"Brescia","C"=>"Como","D"=>"Domodossola");
    echo max($array);
?>


Chiamando dunque max($array) otterremo il valore / value più alto in esso contenuto, che si tratti di numeri o anche lettere.


Come ottenere il valore minimo di un array php


A rigor di logica dunque, per pescare il valore più basso contenuto in un array, occorre utilizzare la funzione php min.

Ecco un altro esempio pratico:

<?
    $array=array(3,21,2,33,1,12,4);
    echo min($array);
?>


Tutto qui, molto semplice e veloce.
Grazie a min e max è possibile dunque estrapolare il valore più piccolo e più grande presente in un array php.

venerdì 3 agosto 2018

Leggi il post

Ricavare le chiavi di un array php

Oggi vediamo un'insolita richiesta che riguarda gli array php.
Poniamo ad esempio che, per qualche oscuro motivo tu fossi interessato solo alle chiavi presenti in un'array, mettiamo caso quindi che il tuo scopo sia quello di ottenere un array con al suo interno (come valore) solo le chiavi di un array d'origine... bè, con le funzioni native del php puoi fare anche questo.

Vediamo subito come ottenere l'elenco delle chiavi di un array php, tramite una sola e semplice funzione.


Come ricavare le chiavi di un array php


Per poter ottenere un array di chiavi partendo da un array originale di chiavi e valori, puoi utilizzare la seguente sintassi:

$array_chiavi=array_keys($array_originale);

Grazie alla utilissima array_keys php infatti, potrai generare un nuovo array di keys partendo da una lista originale.

Ecco un esempio pratico:

<?
    $array=array("A"=>"Asso","B"=>"Brescia","C"=>"Como");
    $array_chiavi=array_keys($array);
    foreach ($array_chiavi as $chiave=>$valore) echo "$valore<br />";
?>


Un osservatore attento ovviamente noterà subito che il nuovo array così creato avrà in realtà a sua volta delle chiavi, che però non saranno più quelle originali (che sono finite come valore), ma dei nuovi valori che partono da zero.

A cosa può servire tutto ciò?
Mmm, ad esempio se per qualche motivo ci serve l'elenco di chiavi presenti in un array separato da virgola, prima usiamo la array_keys, e poi la funzione spiegata in questo post.

mercoledì 1 agosto 2018

Leggi il post

Da array a stringa (implode php)

Ti è mai capitato di dover trasformare il contenuto di un array in una stringa?
Si, magari hai la tua bella lista e non è tua intenzione sfogliare l'array php per accingere ai vari risultati, magari hai salvato una lista di id e vuoi averli separati da virgola.
Ecco che con il metodo che ti sto per spiegare, potrai trasformare un array in una stringa di testo, con una sola e semplice funzione.
Vediamo subito come fare (cit.).


Come passare da array a stringa con l'implode php


Il titolo di questo post era già di per sè un bello spoiler, dato che tutto ciò che ci serve è la funzione php implode.

Ecco un esempio di codice:

<?
    $array=array("verde","rosso","giallo");
    $stringa=implode(",",$array);
    echo $stringa;
?>


Con la funzione implode, alla quale passiamo come primo parametro un delimitatore e come secondo l'array da tramutare in stringa, basta una sola riga di codice per fare quello che un tempo si faceva con un ciclo.

Il risultato a video sarà, in questo caso, la lista dei record presenti nell'array divisi da virgola.
Cambiando delimitatore ovviamente, sarà possibile ottenere la nostra stringa delimitata da punto e virgola, da spazi, o da qualsiasi altra cosa ci venga in mente.

Gli array php sono sempre più utili, soprattutto grazie a queste potenti funzioni che consentono di trasformare i dati ed ottenerli nel formato che più ci aggrada, oggi è stato da array a stringa, domani magari sarà da array a json... ma questo è un altro post (cit.)