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

[JS] php.js: porting javascript di svariate funzioni PHP

Tramite il bloggatore mi è capitato sottomano questa interessante libreria che propone il porting di numerose funzioni PHP per javascript.
Ad una superficiale analisi gli svantaggi consistono nella pesantezza della libreria stessa (quasi 240 KB!) e la interdipendenza fra alcune funzioni che potrebbero render difficile l'utilizzo di una sola parte della libreria.
Intanto me la tengo nel cassetto, potrebbe sempre servire :-)


Technorati tags: ,

Powered by ScribeFire.

[PHP] Utilizzare la classe MDB2 con o senza aver installato PEAR

Supponendo che non possiate (o vogliate) installare Pear per utilizzare un suo solo package, è possibile selezionare soltanto i files di nostro interesse per l'utilizzo del suddetto package.

In questo caso vogliamo utilizzare MDB2:

PEAR MDB2 is a merge of the PEAR DB and Metabase php database abstraction layers. It provides a common API for all support RDBMS. Actually MDB2 is the second major version of MDB. The main differences between the new MDB2 and the old MDB version is that the API has been drastically refactored to clean up the API and improve performance.

Grazie a questa classe insomma, possiamo imparare solo alcune funzioni per le solite operazioni CRUD a prescindere dal DBMS utilizzato (a patto di aver installato i driver relativi), senza quindi doverci ricordare, ad esempio, come si effettua una connessione a MySQL piuttosto che a PostgreSQL: ci sarà un modo univoco specificando solamente il nome del DBMS a cui ci stiamo rivolgendo.

Inoltre è possibile definire lo schema di un database in formato XML in maniera tale da esser portabile per vari DBMS. Tale schema viene poi parsato da uno script PHP che si preoccuperà di creare database e tabelle, popolandole con i dati di nostro interesse.

Installazione tradizionale con Pear

Nel caso abbiate già installato Pear sul vostro computer, sarà sufficiente digitare i seguenti comandi da shell:

$ pear install MDB2
$ pear install MDB2#mysql
$ pear install MDB2#pgsql
...

Il primo comando installerà il package MDB2, mentre i seguenti installeranno i driver specifici per il vostro DBMS di riferimento.

Installazione manuale senza Pear

Se vogliamo utilizzare MDB2 senza installare tutto il sistema Pear, sarà sufficiente:

  • Creare una directory contenitore come riferimento, ad esempio TEST;
  • Scaricare il package PEAR (vers. stabile 1.7.1): una volta scaricato l'archivio, estrarre solamente il file PEAR.php e porlo in TEST;
  • Scaricare il package MDB2: all'interno dell'archivio troverete una directory MDB2-* (dove * indica la versione, quella stabile è la 2.4.1), entrate in questa directory ed estraete il file MDB2.php e TUTTA la directory MDB2 in TEST;
  • Scaricate i driver di vostro interesse: nel caso di MySQL, scaricate MDB2_Driver_mysql (la cui versione stabile è la 1.4.1). A questo punto entrate nella directory MDB2_Driver_mysql-* (dove * indica la versione), poi estraete in TEST/MDB2/Driver il file MDB2/Driver/mysql.php e poi estraete i singoli file mysql.php nelle directory  Datatype, Function, ecc  presenti nell'archivio in quelle rispettive di TEST/MDB2/Driver.

Riassumendo avremo la seguente gerarchia finale di files in TEST:

  1. TEST (dir)
    1. MDB2 (dir)
      1. Driver (dir)
        1. Datatype (dir)
          1. Common.php
          2. mysql.php
        2. Function (dir)
          1. Common.php
          2. mysql.php
        3. Manager (dir)
          1. Common.php
          2. mysql.php
        4. Native (dir)
          1. Common.php
          2. mysql.php
        5. Reverse (dir)
          1. Common.php
          2. mysql.php
        6. mysql.php
      2. Date.php
      3. Extended.php
      4. Iterator.php
      5. LOB.php
    2. MDB2.php
    3. PEAR.php
    4. file_di_test.php

file_di_test.php sarà il nostro file in cui testeremo l'efficacia delle classi (vedi sezione seguente). Nel caso in futuro voleste installare altri driver, sarà necessario porre il la classe principale sotto Driver e poi mettere le singole classi dedicate nelle directory di Driver (dove ci sono i vari mysql.php).

Esempio: file_di_test.php

Ecco il contenuto di questo file per testare una query su un database di MySQL denominato "sito" (e nello specifico si fa una select sulla tabella voto, la quale contiene un campo di tipo text con dei nomi di persona):

<?php

require_once 'MDB2.php';
// dbms://user:pass@host/db
$dsn = 'mysql://root:root@localhost/sito';
//$options = array ('persistent' => true);
$mdb2 =& MDB2::factory($dsn); //, $options);
$mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);

// execute a query

$sql = 'select distinct autore from voto';
$result = $mdb2->query($sql);


echo "<h2>Lista dei nomi nella tabella "voto\"</h2>";
echo "<ul>";


/* Every time you call fetchRow(), it will move to the next record and will give you a reference to the data contained in it. */

while ($row = $result->fetchRow()) {
echo "<li>".$row['autore']."</li>"; 
}

echo "<ul>";


// release resources

$result->free();

echo '<hr />Affected rows: ';

echo $mdb2->exec($sql);


// close connection*/
$mdb2->disconnect();
?>

[JS] Cos'è JSON?

Javascript, Ajax, Prototype sono tutti argomenti nuovi e interessantissimi per me e devo colmare questi vuoti per riuscire a capire e a contribuire allo sviluppo di Visual Path.
Nel leggere il tutorial di Prototype mi sono imbattutto per l'ennesima volta sull'acronimo JSON e per quel che ne sapevo, costituisce una particolare notazione usata per lo scambio di dati. Vediamo di approfondire un po'.

Definizione e descrizione

JSON (JavaScript Object Notation) è un formato leggero per lo scambio di dati, di facile lettura ed interpretazione sia per gli uomini sia per i computer.
E' basato su un sottoinsieme di Javascript.
JSON è un formato testuale completamente indipendente dal tipo di linguaggio utilizzato anche se utilizza convenzioni sintattiche familiari ai programmatori C++, Java e Javascript.

JSON è basato su due strutture:

  • Una collezione di coppie nome/valore. In vari linguaggi ciò viene realizzato come un oggetto, un array, un hash table e così via.
  • Una lista ordinata di valori, che nei vari linguaggi si realizza con un array, un vettore, una sequenza e così via.

In JSON:

  • un oggetto è un set di coppie nome/valore non ordinato. Tale oggetto viene definito all'interno di parentesi graffe, in cui ogni nome viene seguito da i due punti mentre le coppie nome/valore sono separate da virgole.
  • un array è ordinato come una collezione ordinata di valori. Il suo contenuto viene definito fra parentesi quadre dove i valori vengono separati da una virgola;
  • Un valore può essere una stringa fra virgolette, un numero, un valore booleano, null o un oggetto. Queste strutture possono essere innestate.
  • Una stringa è una collezione di zero o più caratteri Unicode, racchiusi fra virgolette, in cui si utilizzano i backslash come caratteri di escape.
Fonte: www.json.org

JSON e PHP



Ecco un esempio di script che sfrutta la funzione json_encode, disponibile di default dalla versione 5.2 di PHP.


/* JSON: ritorno rappresentazioni */

class foo {
private $a;
public $b = 1;
public $c;
private $d;
static $e;

public function test() {
// http://it2.php.net/manual/en/function.get-object-vars.php
var_dump(get_object_vars($this));
}
}

$test = new foo;
echo "Oggetto: ".json_encode($test)."
";
// un oggetto -> {"b":1,"c":null} si noti che le variabili private e // statiche non vengono codificate

[JS / PHP] Dump di un oggetto/array

Per un debugging veloce di un oggetto o un array, in PHP tornano sempre utili le classiche funzioni print_r e var_dump.

Binny V A ci mette a disposizione una funzione in PHP e una in javascript per il dumping degli oggetti e degli array.
Per quanto concerne la parte PHP abbiamo:


/********************************************
* Version : 1.01.B
* Author : Binny V A(binnyva (at) hotmail (dot) com : http://www.geocities.com/binnyva)
********************************************/
function dump($data) {
if(is_array($data)) {
print "<pre>-----------------------\n";
print_r($data);
print "-----------------------</pre>";
} elseif (is_object($data)) {
print "<pre>==========================\n";
var_dump($data);
print "===========================</pre>";
}
else {
print "=========> ";
var_dump($data);
print " <=========";
}
}

Mentre per la parte javascript:

function dump(arr,level) {
var dumped_text = "";
if(!level) level = 0;

//The padding given at the beginning of the line.
var level_padding = "";
for(var j=0;j<level+1;j++) level_padding += " ";

if(typeof(arr) == 'object') { //Array/Hashes/Objects
for(var item in arr) {
var value = arr[item];

if(typeof(value) == 'object') { //If it is an array,
dumped_text += level_padding + "'" + item + "' ...\n";
dumped_text += dump(value,level+1);
} else {
dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
}
}
} else { //Stings/Chars/Numbers etc.
dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
}
return dumped_text;
}

[PHP] Effettuare dinamicamente trasformazioni XSL a file XML

Breve post per illustrare come usare le funzioni XSL in PHP5. L'architettura di riferimento è LAMP (con Ubuntu come distro) per cui tutto è già automagicamente disponibile, poichè l'estensione XSL è già inclusa in PHP5.

Sia dato il seguente file, collection.xml:


<collection>
<cd>
<title>Fight for your mind</title>
<artist>Ben Harper</artist>
<year>1995</year>
</cd>
<cd>
<title>Electric Ladyland</title>
<artist>Jimi Hendrix</artist>
<year>1997</year>
</cd>
</collection>
e il suo foglio di stile, collection.xsl, deputato al parsing del documento XML per la generazione del codice HTML:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="owner" select="'Nicolas Eliaszewicz'"/>

<xsl:output method="html" encoding="iso-8859-1" indent="no"/>
<xsl:template match="collection">
Hey! Welcome to <xsl:value-of select="$owner"/>'s sweet CD collection!
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="cd">
<h1><xsl:value-of select="title"/></h1>
<h2>by <xsl:value-of select="artist"/> - <xsl:value-of select="year"/></h2>
; <hr />
</xsl:template>
</xsl:stylesheet>
Vediamo il codice PHP che ci serve per effettuare dinamicamente la trasformazione:

$doc = new DOMDocument();
$xsl = new XSLTProcessor();

$doc->load('collection.xsl');
$xsl->importStyleSheet($doc);

$doc->load('collection.xml');
echo $xsl->transformToXML($doc);
Il risultato dovrebbe essere simile al seguente:

[PHP/SQL] Generare grafici a partire dallo schema SQL di un database

Può esser sicuramente interessante avere una visualizzazione grafica di uno schema SQL, in grado di evidenziare i legami fra le varie tabelle a colpo d'occhio. Infatti non sempre creiamo noi delle basi di dati e alle volte abbiamo a disposizione solo un dump del database.

Fonte immagine: A Ovest di Paperino SQL

Ho visto che MySQL Workbench è in grado di importare uno script SQL e di generare il grafico che evidenzia le tabelle e i legami fra di esse.

In aggiunta ho trovato uno script PHP, Visualize, il quale facendo uso di Graphviz, può generare grafici in formato PNG degli script SQL rappresentanti lo schema di un database.
Sul sito è possibile scaricare uno screencast che mostra tale script in funzione, per comodità ho eseguito l'upload di tale filmato su Youtube e ve lo mostro di seguito (quanto l'autore scrive nella shell è maggiormente visibile nel filmato originale).

[CRM] Ricerche globali in vTiger

Leggendo il manuale di CRMVillage (che fa riferimento alla versione 5.04 di vTiger), mi accorgo che vi è un'inesattezza alla pagina 16:

Nota:
Il carattere % può essere usato come “jolly” per la funzione di ricerca. Per esempio, per cercare due contatti come "Meyer" e "Mayer" è possibile digitare "M%yer".

Tuttavia inserendo ad esempio Ma% (e avendo a disposizione i dati di default di vtiger), non ottengo alcun risultato (sebbene ci siano contatti che iniziano con Ma). Non credo quindi sia fattibile quanto scritto nel manuale, alla luce anche di come è strutturata la funzione deputata al controllo del valore di query_string passata alla funzione seguente in include > utils > utils.php:

function formatForSqlLike($str, $flag=0) {
if (isset($str)) {
$str = str_replace('%', '\%', $str);
$str = str_replace('_', '\_', $str);

if ($flag == 0) {
$str = '%'. $str .'%';
} elseif ($flag == 1) {
$str = '%'. $str;
} elseif ($flag == 2) {
$str = $str .'%';
}
}
return mysql_real_escape_string($str);
}

Tuttavia è possibile impostare il flag a 2 di modo che sia possibile ricercare le parole che iniziano in un certo modo e rendere più efficace la ricerca di oggetti nel CRM.

[PHP] Installare classi PEAR in fase beta

Puuò capitare di voler installare delle classi PEAR le cui ultime versioni sono in fase beta.
Ora, di default PEAR installa solo package in versione stable se non erro, ma è possibile forzare la cosa senza dover smanettare fra i file di configurazione.

Ammettiamo si voglia installare la classe Spreadsheet_Excel_Writer per creare in PHP dei report in Excel. Tale classe ha delle dipendenze e l'ultima release è in fase beta.

Per installare sia la classe sia le dipendenze in automatico, basta digitare:

orion@orion$: pear install --alldeps Spreadsheet_Excel_Writer-beta

L'opzione --alldeps provvede a scaricare tutte le dipendenze necessarie mentre l'aggiunta del suffisso -beta permette di scaricare l'ultimissima versione della classe, senza dover riconfigurare il livello di accettabilità dei package per PEAR.

[Apache] Protezione .htaccess ed autenticazione

Ammettiamo di voler proteggere una parte del nostro sito tramite la classica autenticazione di base di .htaccess e .htpasswd, ma di voler richiedere l'autenticazione solo per chi si connette con IP diversi da quelli che acconsetiamo:

Order Deny,Allow
Deny from all
# permettiamo gli indirizzi privati,localhost e
# alcuni IP, protezione htaccess per gli altri

Allow from 172.16. # lan privata...
Allow from 127.0.0.1 # locale...
Allow from 87.65.65.65 # ip statico a caso...
AuthType Basic
AuthUserFile /percorso/al/file/.htpasswd
AuthName "AREA RISERVATA"
Require valid-user
Satisfy any
Come da esempio, permettiamo di entrare senza autenticazione ai range CIDR 192.168.0.0/16 ,172.16.0.0/16 e 10.0.0.0/8. In aggiunta permettiamo all'IP statico 87.65.65.65 di entrare senza autenticarsi.

Per tutti gli altri ci affidiamo al file .htpasswd che sarebbe bene posizionare al di fuori della directory pubblica (di solito www o htdocs a seconda che Apache sia su Linux o Windows).

Per costruire le coppie username:password presenti in .htpasswd potete usare l'eseguibile omonimo presente nell'installazione di Apache (vedere la documentazion online), potete usare uno dei tanti generatori online come .htpasswd Content Generator oppure si può ricorrere ad uno script PHP come il seguente:

if(isset($_GET['pass'])){
// prendiamo il parametro dalla query string...
$clearTextPassword = $_GET['pass'];
// criptazione
$password = crypt($clearTextPassword, base64_encode($clearTextPassword));
echo "Valore da immettere nell'.htpasswd: ";
// se viene fornito l'utente...
if(isset($_GET['user']))
echo $_GET['user'].":".$password;
else echo $password;
echo "
";
}
Nell'esempio qui sopra si assume di richiamare uno script PHP nel seguente modo: http://localhost/htpass.php?user=Chris&pass=p4ss.

[PHP-MySQL] Connettersi a diversi DB su host diversi attarverso una sola funzione

Se avete a che fare con DBMS su host differenti e volete uno script che sia in grado di connettersi dinamicamente a ciascuno di essi, ci si può basare sull'indirizzo del server su cui risiede il DBMS. L'esempio seguente dovete immaginarlo come il costruttore della classe DBconnect che imposta i campi dbhost (host in cui gira MySQL), dbuser (utente con cui si si collega al DB), dbpassword (password utente) e database.
In quest'esempio si fa uso di preg_match e di espressioni regolari per riconoscere l'indirizzo del server.


function DBconnect() {

// esecuzione su una LAN privata
if(preg_match("/^10\./",$_SERVER['SERVER_ADDR'])) {

$this->dbhost = "10.10.234.89";
$this->dbuser = "lan1";
$this->dbpassword = "lan1";
$this->database = "lan1";

// esecuzione su un'altra LAN privata
} else if (preg_match("/^192\./",$_SERVER['SERVER_ADDR'])) {

$this->dbhost = "192.168.9.134";
$this->dbuser = "lan2";
$this->dbpassword = "lan2";
$this->database = "lan2";

} else { // esecuzione in locale

$this->dbhost = "localhost";
$this->dbuser = "locale";
$this->dbpassword = "locale";
$this->database = "locale";

}
}

[PDF] Librerie e applicazioni utili

Nel ricercare un tool su SourceForge che mi permettesse di esportare le immagini da un PDF, ho trovato interessanti librerie che mi propongo di analizzare nel medio-lungo periodo (il tempo è tiranno e gli impegni molti):

  • PDFBox [Java]: PDFBox is an open source Java PDF library for working with PDF documents. This project allows creation of new PDF documents, manipulation of existing documents and the ability to extract content from documents. PDFBox also includes several command line utilities.
  • PHP PDF Factory [PHP]: PDFLib-free PDF creation using PHP. It has interface compatible with php pdf creator (pdf-php library). Implements most of Adobe recommended features like PageTrees, Outlines, and so on.
  • XML-PDF Transformation GUI [Java]: This is a Java Swing GUI for popular XML tools from the Apache Group. It uses Xerces for XML validation, Xalan for XSLT, FOP for XML to PDF and iText for adding security features to the PDF. Can produce FO, HTML and PDF. I personally use it for my DocBook.
  • QPDF [C++]: QPDF is a command-line program that [...] is capable of creating linearized [...] files and encrypted files. It is also capable of converting PDF files with object streams [...] to files with no compressed objects or to generate object streams from files that don't have them (or even those that already do). QPDF also supports a special mode designed to allow you to edit the content of PDF files in a text editor. For more details, please see the documentation links below.
  • PDF Edit [C++,XPDF, QT3,QSA]: Free (and open source) editor for manipulating PDF documents. GUI version + commandline interface. Scripting is used to a great extent in editor and almost anything can be scripted, it is possible to create own scripts or plugins. Target platform are operating systems of Unix type (Linux, BSD).
  • [PHP]: Want to create dynamic pdf documents with PHP, but don't want to (or can't) install any of those required modules? Wll we could have the solution.. for you, a PHP class which will allow the easy production of simple pdf documents.
  • Inno-PDF, iText, PDF4J [Java]: librerie Java per la generazione di PDF;
  • TCPDF, PC4P, PHP PDF Creation [PHP]: classi per la generazione di documenti PDF;
  • PDML [PHP]: PDML is an informal markup language written in 100% PHP, allowing to create complex PDF documents very easily for people already familiar with HTML. People familiar with PHP can also use it as a way to define templates for dynamic PDF documents. PDML is built on top of FPDF, and is licensed under the GPL;
  • Peters PHP PDF Report: A PHP5 class, which capable to generate PDF report (w optional sections like pageheader, reportheader, content etc..) based on fpdf class. The report is defined in xml, groups' definitions and variable replacement from any database are supported.
  • WP2PDF: it is a script that converts the content of one or more entries of the Blog-Software WordPress to PDF. It is based on FPDF, a free PDF library and written in PHP. It requires a working WordPress installation and PHP 4.x.

[Link] Raccolta di cheet sheet

Qui di seguito una raccolta di "bigini" online :)

Raccoglitori di cheet sheet e altro materiale

Ecco una lista di ottimi siti web che raccolgono liste di memorandum in formato PDF in merito a svariati argomenti:

[PHP] Quanti tag <li> ci sono nella pagina?

Per chi non lo sapesse, ho iniziato una fruttuosa collaborazione con il sito Web Master Point, grazie a Guido (sono praticamente il suo braccio destro). Solitamente traduco articoli tecnici dall'inglese all'italiano, presto forse comincerò a trattare guide un po' più lunghe.

In questa pagina sono elencati, tramite una lista non ordinata, gli articoli che ho scritto fino ad oggi. Ma se volessi tenerne il conto? Di certo non mi metto a contarli a mano, quindi mano al codice.

La pagina in questione è strutturata per mezzo di fogli di stile con classi che si applicano alle liste non ordinate per creare menu dinamici. E' quindi importante parsare il contenuto del file PHP e non il suo output HTML per conteggiare il numero di tag <li> presenti, poichè i menu e gran parte della struttura della pagina vengono creati dinamicamente da PHP.

Ecco il codice semplice semplice:

$url = basename($_SERVER["PHP_SELF"]);
$input = file_get_contents($url) or die(Non riesco a leggere il file: $url');
if(preg_match_all("/<li>/i", $input, $matches))
echo count($matches[0])-1; // non contiamo quello usato per l'espressione regolare

Questo semplice codice ha l'effetto di costruire un array contenente tutte le occorrenze del tag <li>. Nell'ultima riga stampiamo la dimensione dell'array decrementandola di uno per non considerare il tag <li> presente nell'espressione regolare. Questo ci darà il numero di articoli scritti.

Un po' di link interessanti

  • Hosting Java: è un servizio offerto dallo studio ILZ,offre un account sul loro sito per quegli sviluppatori che hanno l'esigenza di testare applicazioni JSP senza affidarsi ad un hosting professionale a pagamento. Come specificato qui,si hano 40 MB a disposizione.
  • Ajax poller: script che fa uso di PHP e MySQL. Mostra un istogramma con le percentuali dei voti (qui la demo).
  • Unicode character ranges for Web designer: tabella con tutti i codici Unicode. Ricordo che comunque anche l'applicazione charmap su Windows mostra i codici Unicode (Start > Esegui > digitare charmap);
  • Working with text: tutorial in java riguardante la formattazione del testo, la normalizzazione e l'uso di diversi charset;
  • SACK: framework per AJAX incluso in Wordpress 2.0. Non l'ho provato perchè non ho assolutamente tempo,ma rientrerà nelle cose da fare post laurea.

[PHP] Script per mostrare il codice sorgente di una pagina,includendo codice lato server

Introduzione

Questo tema che vado a trattare non è certo dei più nuovi:

  • ho scritto a suo tempo quest'articolo su Delfins Blog,mostrando alcune tecniche per visualizzare il codice sorgente;
  • ho scritto quest'altro che mi è stato molto utile per mostrare il codice qui su Blogger;

Mi mancava l'esplorazione delle funzioni native di PHP: highlight_string e highlight_file.

Gli script

Il codice che ho creato/modificato/copiatoETincollato fa uso di:

  1. un suggerimento di un lettore di php.net, per quanto concerne l'evidenziazione del codice php attraverso la funzione highlight_file mostrando il numero di linee usando una tabella e il commento di quest'altro per una funzione che usa invece una lista ordinata,distinguendo tra la funzione precedentemente menzionata e highlight_string, più conveniente nel caso vogliate mostrare il codice di poche righe o una riga soltanto;
  2. l'uso modificato di questo script javascript per aprire una finestra con il codice evidenziato. Notare che lo script originale così com'è,è piuttosto pericoloso perchè permette l'esecuzione arbitraria di una qualsiasi funzione passandogli dei parametri,il tutto via GET;
  3. in questo caso ho usato la direttiva $_SERVER['PHP_SELF'] perchè interessato a mostrare il codice del file correntemente letto. Nel caso si voglia leggere un altro file,considerate l'uso di funzioni quali fopen / fread,file_get_contents e file. Leggiti quest'articolo che spiega con degli esempi pratici l'uso di queste funzioni;

Quindi se vi intyeressa,bando alle ciance e recatevi su questa pagina per vedere la demo,cliccando sul link in fondo.

Zippare una directory con PHP

Avrei voluto utilizzare le zip file functions (di cui trovate un ottimo tutorial su Zend Developer Zone) ma guardando il phpinfo di Aruba si nota che non hanno compilato PHP usando l'ozione di configurazione --with-zip[=DIR].

Ad ogni modo leggebndo fra i commenti presenti in corredo alle zip file funcions,incappo in questo commento di Lennart Poot: l'idea è usare la librearia di "zippaggio" di phpMyAdmin,un semplice file denominato zip.lib.php nella directory "libraries".

A questo punto ecco il codice che crea un archivio al volo specificando la cartella contenente i files e settando gli header per spedirlo direttamente al browser. Il seguente codice NON archivia le directory (if (!is_dir($file) && $file != "." && $file != ".." ) {) e non crea una cartella nell'archivio contenente i files  ma semplicemente archivia tutti i files che trova.

Ecco il codice,con qualche modifica rispetto al commento e con l'aggiunta di ciò che altri lettori di php.net han fatto notare:

require_once('zip.lib.php');
$zipfilename = 'chris_sorgentic++.zip'; // nome del file da creare
$ad_dir = 'sorgenti'; // path alla directory contenete i files

$zipfile = new zipfile();

if ($handle = opendir($ad_dir)) { // apre la direcotry
while (false !== ($file = readdir($handle))) {
if (!is_dir($file) && $file != "." && $file != ".." ) {
$f_tmp = @fopen( $ad_dir . '/' . $file, 'r'); // apre in lettura il file

if($f_tmp){
$dump_buffer=fread( $f_tmp, filesize($ad_dir . '/' . $file)); // prende il contenuto
$zipfile -> addFile($dump_buffer,$file); // aggiunge il file allo zip
fclose( $f_tmp );
}
}
}
} else {
echo "Non riesco ad aprire la directory $ad_dir.";
exit;
}

$dump_buffer = $zipfile -> file(); // dump del file
// write the file to disk:
/*
$file_pointer = fopen('newzip.zip', 'w');
if($file_pointer){
fwrite( $file_pointer, $dump_buffer, strlen($dump_buffer) );
fclose( $file_pointer );
}
*/

// response zip archive to browser:
header('Pragma: public');
header('Content-type: application/zip');
header('Content-length: ' . strlen($dump_buffer));
header('Content-Disposition: attachment; filename="'.$zipfilename.'"');

echo $dump_buffer; // stampo il contenuto del file

Win-get: uso e creazione di un repository

Introduzione

Win-get è un packet manager a linea di comando per windows che sfrutta le funzionalità di wget,un porting per Windows del programma omonimo per Linux.

wget

Presenta una lista di programmi via Web (quelli accessibili anche dall'applicazione) e se ci si registra si ha il vantaggio di poter cliccare su dei "+" a fianco dei nomi dell'applicazione e associare l'applicazione stessa al nostro account. In questa maniera sfrutando l'opzione "restore" di win-get,è possibile installare tutti i programmi associati al nostro profilo (specificando le credenziali di autenticazione o nel file di configurazione o come opzioni da linea di comando).
Esiste anche un ' estensione per Firefox (non ancora provata quindi non vi so dire nulla in termini di utilità e compatibilità tra le varie versioni) che permette di segnalare un'applicazione. Fate attenzione che il server non è configurato per le estensioni firefox quindi vi verrà chiesto di scaricarla. Dovrete poi installare tale estensione con "Apri con" e scegliendo Firefox o da linea di comando "firefox estensione.xpi".

Trovate un'altra recensione di questo software su newstechnology.

Funzionamento tecnico

Questo è un pogetto open source,quindi sono disponibili i sorgenti per poterci creare il nostro repository, ma NON l'interfaccia amministrativa e "perlustrativa" del sito ufficiale (in attesa di chiarimenti).

Win-get farà delle query come questa ad uno script PHP (notate i parametri inviati via GET) e si otterrà un file XML descrittivo che verrà poi gestito da Win-get e presentato nel prompt dei comandi.

xml

Come illustra questa query e quella nella foto,sembra che questo progetto sia un repository di collegamenti alle applicazioni da scaricare e che sul server Sourceforge non abbiano messo alcun software (molto probabilmente perchè non si può nemmeno fare). Quindi se guadate al file XML ritornato dalla precedente query,l'indirizzo del file zip verrà dato in pasto a wget presumo.

Creazione di un proprio repository

Ho intenzione di creare un repository su Aruba sfruttando i files forniti,ma permettendo anche di scaricare direttamente dal server Aruba i software,dal momento che godo di spazio illimitato :-D (ma non banda illimitata presumo!). Chi è su Aruba sa che si hanno a disposizione solitamente 5 database predefiniti per un hosting da 30 sacchi l'anno (mi pare,a me hanno regalato il sottodominio quindi non ricordo :-D). Quindi l'istruzione CREATE DATABASE `w154283_winget` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; non sarà possibile. Possiamo:

  • rinominare uno dei database predefiniti,azione possibile dal pannello di controllo selezionado "Operazioni";
  • semplicemente modificare USE w154283_winget; con il nome del nostro database e cancellare o commentare la creazione del database.

Prendiamo quindi il dump del database e imbocchiamolo a PHPMyAdmin presente su Aruba. Il database è composto da 5 tabelle:

  • applications: contiene i dati generali di un'applicazione e il link dove risiede;
  • dependencies: le dipendenze per una determinata applicazione;
  • errors: gli errori in riferimento alle applicazioni;
  • mirrors: eventuali mirrors per una certa applicazione;
  • requests: identica ad applications,mi è ancora sconosciuto il significato della sua ridondante esistenza;

Fatto questo basta caricare i file winget.php e db.php sul proprio server. L'indirizzo del proprio repository sarà quello rappresentato dalla locazione del file winget.php.

A questo punto manca tutta l'interfaccia amministrativa che il sito ufficiale presenta. Ho chiesto a Ryan se è possibile avere tali files,dal momento che su CVS di sourceforge presenta solo i 3 files menzionati.

Nel caso non fosse possibile ne costruirò una mia non appena avrò tempo :)

[PHP]Listato di una directory e sua dimensione

Siccome gestisco un sito d'appunti in cui sono presenti molti sorgenti liberamente scaricabili e raggruppati in directory,sarebbe carino poterli elencare tutti insieme in una pagina sola. A tal fine ho combinato e modificato alcune funzioni dei commentatori di php.net al mio scopo. Ecco le funzioni: la prima permette di dare un output più umanamente leggibile al numero di bytes forniti in input come parametro alla funzione.


function size_readable($size, $retstring = null) {
// adapted from code at http://aidanlister.com/repos/v/function.size_readable.php
$sizes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
if ($retstring === null) { $retstring = '%01.2f %s'; }
$lastsizestring = end($sizes);
foreach ($sizes as $sizestring) {
if ($size < 1024) { break; }
if ($sizestring != $lastsizestring) { $size /= 1024; }
}
if ($sizestring == $sizes[0]) { $retstring = '%01d %s'; } // Bytes aren't normally fractional
return sprintf($retstring, $size, $sizestring);
}


La seconda funzione scansiona una directory e fornisce in output i files e directory ivi contenuti,omettendo la directory corrente (".") e quella superiore (".."). Dà altresì come risultato il numero di files la loro dimensione,così come la dimensione totale dei files che occupano la cartella. Usiamo la funzione precedente per l'output sulla dimensione dei files.

function scan_dir($path) {
$dir = $path;
$counter_files = $size = 0;
$string = "";
// Open a known directory, and proceed to read its contents
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if($file == "." || $file == "..") continue;
$counter_files++;
$string.= "- $file - ".filetype($dir."/".$file)." ".filesize($dir."/".$file)." bytes
";
$size+=filesize($dir."/".$file);
}
closedir($dh);
}
echo "Directory contenente $counter_files files e occupante ".size_readable($size)."
Lista:
";
echo $string;
}
}

Il risultato dell'uso di queste due funzioni lo potete vedere qui.
Se invece volete qualcosa di molto più fico,vi suggerisco snif (simple and nice index file). Potete vedere la demo qui e il suo codice sorgente qui.

Programmare con la libreria GD

PHP is not limited to creating just HTML output. It can also be used to create and manipulate image files in a variety of different image formats, including gif, png, jpg, wbmp, and xpm. Even more convenient, PHP can output image streams directly to a browser.
L'estensione GD è già presente nell'attuale versione di PHP,basta scommentare il ; nel file di configurazione per averla abilitata. Alcuni link utili:

PHP Guestbook per i nostri siti

Listuccia:


Io comunque continuo a domandarmi come mai sia così schifosamente difficile trovare le demo di applicazioni web. Non posso mica basarmi su una lapidaria descrizione,devo pur farmi un'idea vedendolo in azione! Per questo,questo e quest'artro motivo credo che sceglierò phpBook per il mio sito. Appena è pronto ve lo dico così potrete insultarmi... (cor cazzo! :-D).
EDIT: phpBook non si scarica direttamente dal loro sito,ma te lo inviano via mail (???!). Ergo: optp per qualche progetto di Sourceforge,che grazie alla sua funzione di filtraggio nella ricerca ho ridotto la scelta a due progetti,MGB e phpnix.

Byte Strike Blog - Designed by Posicionamiento Web | Bloggerized by GosuBlogger