© Marco Olivo <me@olivo.net>, luglio 2001

  1. Ho programmato un sito interamente in ASP, ma ora vorrei passare al PHP. Cosa faccio? Riscrivo tutto il codice da zero?

    No. Esiste un programma, chiamato ASP2PHP che esegue la traduzione in maniera automatica per te. Lo trovi all'indirizzo Internet http://asp2php.naken.cc/

  2. Posso eseguire uno script PHP dalla shell, cioè senza farlo girare sotto il webserver? (cioè come in Perl, o come se fosse un programma C)

    Se sei in ambiente Unix/Linux c'è una possibilità per fare quello che chiedi. Prova a digitare da shell il comando "php -v". Se otterrai un output allora questo significa che il PHP è compilato come CGI e puoi quindi eseguire i tuoi scripts come se fossero degli scripts di shell.
    Sarà sufficiente che tu digiti il comando:
    php nomescript.php
    dal prompt della shell per eseguire il tuo programma
    NOTA: magari il PHP è stato compilato come CGI ma il suo percorso non è contenuto nel PATH. Ti consigliamo di fare una ricerca sul filesystem più accurata (magari con il comando Unix "find") oppure chiedere direttamente al tuo amministratore di sistema (se non lo sei tu)

  3. Con quale programma posso scrivere uno script PHP?

    Con un qualunque editor di testo. Uno script PHP è un file di testo (ricordi? viene interpretato, non compilato) e pertanto puoi usare qualunque programma come il Notepad di Windows o vi su sistemi Unix. Consigliamo comunque programmi che facciano la colorazione della sintassi, come ad esempio TextPad su sistemi Windows o Emacs su sistemi Unix/Linux

  4. Vorrei avere qualche informazione sulla versione del PHP, sui moduli, su come è compilato, etc. etc. etc.

    C'è una funzione che ti viene in aiuto (talvolta, specie su spazi gratuiti, viene disabilitata dagli amministratori): si tratta della chiamata phpinfo() che restituisce una pagina di informazioni su tutto l'ambiente in cui gira il tuo interprete. Queste informazioni possono essere molto utili se vuoi sapere qualche dettaglio che non riesci a scoprire altrimenti, come ad esempio se MySQL accetta connessioni persistenti, se sono supportati i tags <? e ?>, etc.
    Prova a scrivere questo script e a vederlo con il tuo browser, troverai tantissime informazioni:
    <?PHP
    phpinfo();
    ?>
    
  5. Voglio che lo script, lanciato dall'utente, finisca di eseguire anche se questi ha cliccato sul pulsante "stop" nel suo browser. Come faccio?

    Puoi usare la chiamata ignore_user_abort() che permette di ignorare azioni dell'utente. Lo script continuerà ad eseguire fintantoché non terminerà per conto suo o non verrà "killato" dall'amministratore o da chi ha i privilegi per farlo.
    Utile nel caso il tuo script esegua alcune query che devono assolutamente essere portate a termine pena l'inconsistenza dei dati salvati nel DBMS.

  6. Eseguendo il mio script ottengo un errore di timeout. Che faccio?

    Nel file di configurazione del PHP (php.ini) è presente una direttiva che permette di impostare la durata massima di esecuzione di uno script scritto in PHP. Questo è utile per prevenire che eventuali script buggati (o maligni) consumino risorse preziose al webserver girando all'infinito e consumando pertanto preziosi cicli di CPU e ingenti quantitativi di RAM.
    Nella maggior parte degli ambienti (tranne che in alcuni ambienti particolari) puoi impostare la durata dell'esecuzione di uno script tramite la chiamata set_time_limit($time_amount); dove $time_amount è una variabile intera che specifica il numero di secondi massimo di esecuzione di uno script PHP.
    Solitamente tale valore è settato a 30 dall'amministratore di sistema, ma puoi aumentarlo con la chiamata appena vista nel caso di script molto complessi e che molto probabilmente richiederanno più di 30 secondi per essere eseguiti. Impostando $time_amount a 0 otterrai invece l'esecuzione dello script fino a che non termina per conto suo (estremamente pericoloso, specie se nello script c'è anche una chiamata ignore_user_abort() in quanto potresti lanciare uno script che non riesci più a fermare e dovrebbe intervenire l'amministratore di sistema)

  7. Come faccio a trasformare una stringa da maiuscolo a minuscolo e viceversa?

    Puoi usare rispettivamente le funzioni strtolower() e strtoupper() passandogli come argomento la stringa da convertire. E' ovvio che se la stringa è già minuscola/maiuscola rimarrà come tale (ti viene restituita dalla chiamata).
    Es.
    <?PHP
    echo strtolower('Pippo');	/* scrive pippo */
    echo strtolower('pippo');	/* scrive ancora pippo (la stringa era già minuscola) */
    ?>
    
  8. Installazione PHP: come modulo di Apache o come CGI?

    Ci sono vantaggi e svantaggi ad entrambi gli approcci (non avrebbero senso di esistere entrambi altrimenti)
    Nel primo caso la risposta del webserver sarà migliore in quanto ad ogni richiesta non verrà creato un nuovo processo dato che il modulo - statico o dinamico - sarà caricato insieme ad Apache e pertanto risponderà lui alla interpretazione degli scripts. Tuttavia in questo caso non potrai eseguire scripts PHP da shell, come visto invece prima.
    Nell'altro caso, a scapito delle performances (ogni script che gira sarà un nuovo processo), avrai la possibilità di eseguire gli scripts anche da shell, il che può essere utile in certi casi.
    Ti consigliamo comunque di reperire maggiori informazioni prima di installare il PHP come modulo CGI: infatti in questa "versione" il PHP è maggiormente soggetto a pericolosi problemi di sicurezza (vedi in particolare le risorse sul sito ufficiale, ed in special modo l'ottimo manuale)

  9. Come posso conoscere l'indirizzo IP del visitatore? E il suo browser? E...

    Per conoscere tutte queste informazioni devi anzitutto sapere che tutti questi valori altro non sono che variabili d'ambiente che il webserver mette a disposizione degli scripts.
    Conoscendo il nome della variabile che ci interessa (quasi qualunque cosa tu voglia sapere è presente in una specifica variabile), il modo per accedervi è usare la chiamata getenv() passandole come argomento il nome della variabile da recuperare (senza il dollaro iniziale ed avendo cura di passarla come stringa, cioè con gli apici iniziali e finali)

    Due variabili comunemente usate sono REMOTE_ADDR (indirizzo del visitatore) e HTTP_USER_AGENT (nome del browser dell'utente)
    Per avere una lista completa ti consigliamo di sfogliare la documentazione di Apache, partendo dall'indirizzo http://www.apache.org/

    Es.
    <?PHP
    /* stampa il contenuto della variabile di ambiente di nome REMOTE_ADDR (contiene l'IP del visitatore) */
    echo getenv('REMOTE_ADDR');
    ?>
    
  10. Ho accesso ad un DBMS ma mi sembra difficile usarlo negli script, preferisco usare un file di testo. Che vantaggi/svantaggi ci sono?

    Diciamo così: solo svantaggi. In effetti è vero, non ha senso utilizzare un file di testo per salvare i tuoi dati nel caso tu abbia un database a tua disposizione. Anzitutto perchè i privilegi con cui gira il server web (e quindi solitamente anche gli script PHP) sono differenti rispetto a quelli delle directory dove vorrai scrivere i tuoi dati, e quindi potresti avere non poche difficoltà a leggere (ma soprattutto a scrivere!) in quelle directories.

    In secondo luogo, dimenticandoci delle difficoltà appena presentate, la gestione di un file è computazionalmente più pesante e pertanto i tuoi script impiegheranno lunghi tempi per essere eseguiti e fare quel che devono (i database usano strutture dati sofisticate per accedere ai dati)

    E ancora, dovrai gestire il controllo della concorrenza degli accessi al file tramite la chiamata flock() che blocca un file per permetterne l'accesso esclusivo/condiviso: infatti ogni utente che sarà connesso, richiamando quegli script, genererà nuovi processi che dovranno essere in un qualche modo semaforizzati per non corrompere i dati.

    Infine - dimenticando efficienza, facilità d'uso, concorrenza e permessi - non è affatto facile immagazzinare strutture complesse su un file. Perchè reinventare la ruota, quando si può fare tutto con un sistema di basi di dati a cui hai accesso e che risolve già da solo tutti questi problemi? Il gioco vale la candela, e se non conosci l'SQL (il linguaggio per fare le query nei databases) questo è decisamente il momento migliore per imparare ad usarne uno.

  11. Come faccio a togliere i tags HTML?

    E' un problema serio a cui bisogna sempre pensare. E' infatti possibile, per una persona che abbia la possibilità di inserire del testo, inserire del codice HTML "maligno" che forzi, ad esempio, una redirezione verso una ben precisa pagina web (tanto per fare un esempio)
    Il metodo più usato è quello di passare l'input dell'utente alla funzione htmlentities() che tradurrà i codici ASCII in codici HTML e permetterà pertanto una visualizzazione "sicura" al riparo da pericolosi trucchi.
    In questo modo il novello (ma non affatto provetto) hacker ci rimarrà piuttosto male.
    Es.
    <?PHP
    echo htmlentities('Questa è una prova');	/* scrive in output: Questa &egrave; una prova */
    echo htmlentities('<HTML>');			/* scrive in output: &lt;HTML&gt; */
    >
    
  12. A che cosa servono le funzioni addslashes() e stripslashes()?

    Rimanendo sempre in tema di sicurezza, queste due funzioni sono una vera e propria manna dal cielo per proteggere input maligni da parte degli utenti.Supponiamo di essere nel seguente scenario: abbiamo accesso ad un DBMS dove noi immagazziniamo un testo che è stato recuperato facendo leggere al nostro script una pagina web il cui indirizzo ci è stato passato dall'utente.
    Per far ciò supponiamo di usare la seguente query:
    INSERT INTO tabella (testo) VALUES ('$testo');
    dove $testo è una variabile PHP che contiene il testo della pagina HTML letta.
    Se $testo contenesse la stringa
    prova'); DELETE FROM tabella WHERE (testo LIKE '%' OR testo = ';
    rischieremmo danni al nostro DBMS. Infatti quell'apice dopo "prova" chiuderà il primo apice della nostra query e potrebbe causare pertanto danni perché la query risultante (così come la vedrà il PHP) sarà:
    INSERT INTO tabella (testo) VALUES ('prova'); DELETE FROM tabella WHERE (testo LIKE '%' OR testo = ';');
    
    che cancellerà tutti i valori contenuti nella tabella di nome "tabella"

    Come ovviare a questo spiacevole inconveniente? Semplicemente utilizzando la funzione addslashes() che tramuta magicamente tutte le occorrenze di ' in \' (in gergo si dice che la stringa viene "escapata"), evitando quindi che i problemi suddetti si presentino.
    La funzione stripslashes() esegue l'opposto.

  13. Vorrei inviare un header HTTP particolare. Come faccio?

    Per inviare un header HTTP puoi far ricorso alla funzione header() del PHP. Ti ricordiamo che, salvo utilizzo di altre istruzioni particolari di caching dell'output, non deve ancora essere stato spedito alcun testo al client. Pertanto le chiamate header() devono essere tra le prime righe nello script. In caso contrario verrà inserito dall'interprete un warning nel tuo output

  14. Vorrei controllare che non ci siano errori nei miei scripts: come faccio?

    Oltre a consigliarti un attento debugging, una revisione del codice a tavolino e un controllo di tutti i casi particolari e delle eccezioni che si possono verificare, ti consigliamo di utilizzare la seguente chiamata, da inserire possibilmente all'inizio dello script:
    error_reporting(63);
    
    Questa chiamata, con il parametro 63, ti permetterà di ottenere in output tutti i warnings del PHP, anche quelli meno importanti.

  15. Le stringhe vanno incluse sempre tra doppi apici?

    No, non sempre. Ci sono due metodi per specificare una stringa in PHP: il primo è quello già visto ampiamente di inserire la stringa tra doppi apici, il secondo è quello di inserirla tra apici singoli.
    Nota che le due notazioni non sono sempre alternative. Infatti, mentre racchiudendo una stringa tra doppi apici otterrai una interpretazione delle variabili e dei metacaratteri (come ad esempio "a capo"), nel secondo caso (cioè racchiudendo una stringa tra apici singoli) le variabili eventualmente contenute al suo interno non verranno interpretate, e nemmeno i metacaratteri.

    Es.
    <?PHP
    $var = "prova";
    echo "faccio una $var";	/* stampa la stringa: faccio una prova */
    echo 'faccio una $var';	/* stampa la stringa: faccio una $var */
    echo "\n";	/* stampa un "a capo" */
    echo '\n';	/* stampa la stringa: \n (infatti il metacarattere \n non viene interpretato) */
    ?>
    
    E allora quale è il vantaggio di usare gli apici? Semplice, la velocità. Se non hai stringhe da interpretare ti consigliamo vivamente di utilizzare gli apici singoli per dichiarare le tue stringhe.

  16. Vorrei scrivere la data corrente, possibilmente formattata. Come faccio?

    E' molto semplice. Per scrivere le date usa la funzione date(). Questa funzione accetta un numero elevato di combinazioni possibili di parametri; infatti con essa puoi stampare una data nella maniera che più ti aggrada, come ad esempio AAAA-MM-GG all'americana, oppure GG-MM-AAAA all'italiana, e ancora inserire una miriade di altri valori come ore, minuti, secondi, giorno della settimana, etc.

    Es.
    <?PHP
    /* stampa il numero corrente del giorno in questo anno solare, numerando con 1 il primo gennaio, etc. */
    echo "Oggi e' il giorno numero " . date('z') . " di quest'anno\n";
    ?>
    
    Per vedere tutti i possibili valori - sono veramente tanti, troppi da elencare qui - ti rimandiamo al manuale che trovi sul sito http://www.php.net/ (una volta trovatolo, clicca la voce "Date and Time functions" e poi "date")