php

Mattepuffo's logo
Usare PHPExcel con CodeIgniter

Usare PHPExcel con CodeIgniter

PHPExcel è un'ottima libreria per creare file excel con PHP.

Ne ho già parlato in passato, ed ora useremo questa libreria dentro al framework CodeIgniter.

Prima di tutto scaricate la libreria da qua.

Dentro al file zip identificate la cartella Classes; il suo contenuto mettetelo dentro application/third_party.

A questo punto create un file nominato excel.php dentro a application/libraries:

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

require_once APPPATH . '/third_party/PHPExcel.php';

class Excel extends PHPExcel {

    public function __construct() {
        parent::__construct();
    }

}

Questo sarà il file che noi richiameremo nel controller, e altro non fa che richiamare la classe PHPExcel.

A questo punto procediamo nella creazione del model che eseguirà la query su db, e che richiameremo nel controller; ad esempio:

<?php

class Excel_model extends CI_Model {

    public function getEntrate() {
        $this->db->select('entrata_valore, causale_nome, conto_nome, entrata_data, entrata_note');
        $this->db->from('entrate');
        $this->db->join('causali', 'entrate.causale_id = causali.causale_id');
        $this->db->join('conti', 'entrate.conto_id = conti.conto_id');
        $this->db->order_by('entrata_data', 'desc');
        $this->db->limit(50);
        $query = $this->db->get();
        return $query->result();
    }

}

Se non volete prendere tutte le colonne della tabella, dovete specificare quali volete, altrimenti ve le ritroverete tutte nel file excel.

Mattepuffo's logo
Android Spinner da JSON

Android Spinner da JSON

Oggi vediamo un altro componente importante, lo Spinner, e come riempirlo prendendo i dati dal server in formato JSON.

Lo Spinner è un menu a tendina che ci permette di scegliere tra una serie di valori.

Cominciamo con la richiesta al server per ottenere i dati:

public class Service {

    private final String remote = "http://www.sito.com/service/";
    
    public String getCausali() throws ClientProtocolException, IOException, JSONException {
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(remote + "get_causali.php");
        HttpResponse response = client.execute(post);
        HttpEntity entity = response.getEntity();
        BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append("\n");
        }
        reader.close();
        return sb.toString();
    }
    
}

Tramite HttpClient ci connettiamo al server e con HttpPost inviamo una richiesta POST al file specifico (che in questo caso è in PHP).

Il file sul server esegue la query e restituisce i dati in JSON (guardate qua per un esempio).

Prendiamo il contenuto e lo aggiungiamo a un oggetto StringBuffer.

A questo punto creiamo una classe wrapper che rappresenta la nostra tabella sul db; nel mio caso ho solo due campi:

  • id
  • nome

Ecco il mio esempio:

public class Causali {
    
    private int id;
    private String nome;

    public Causali(int id, String nome) {
        this.id = id;
        this.nome = nome;
    }
    
    public int getId() {
        return this.id;
    }
    
    public String getNome() {
        return this.nome;
    }
    
    @Override
    public String toString() {
        return this.nome;
    }
    
}

Questa classe ci servirà come contenitore.

Mattepuffo's logo
Trovare ed eliminare duplicati in MySQL

Trovare ed eliminare duplicati in MySQL

Articolo aggiornato il 31-05-2015

Il problema dei duplicato c'è sempre, soprattutto quando i db sono belli pieni di record e stanno li da anni.

Grazie a semplici operazioni però possiamo trovari i recod duplicati e cancellarli.

Ovviamente prima di cancellare dei record solo perchè doppi/tripli/ecc fate accertatevi che sia giusto e fate un bel backup.

Prima di tutto vediamo come trovare i record duplicati.

Collegatevi al vostro db ed eseguite una query del genere:

SELECT author_name, COUNT(*) as Num FROM book GROUP BY author_name HAVING Num > 1 ORDER BY Num DESC;
+-------------------------------+-----+
| author_name                   | Num |
+-------------------------------+-----+
| stephen king                  |  15 |
| christian jacq                |  13 |
| clive cussler                 |  10 |
| deitel - deitel               |   3 |
| clive cussler, paul kemprecos |   3 |
| tolkien                       |   3 |
| arthur c. clarke              |   2 |
| no autore                     |   2 |
| arthur schopenauer            |   2 |
| pirandello                    |   2 |
+-------------------------------+-----+

Questo è un esempio reale preso da un mio db.

Ho cercato quante volte lun autore fosse ripetuto (che in questo caso vuol anche dire quanti libri un autore ha scritto).

Come vedete ho usato la clausola HAVING, con la quale prendiamo solo quei valori che hanno un conteggio superiore a 1.

Mattepuffo's logo
Google Maps dentro finestra modale

Google Maps dentro finestra modale

A volte è più comodo mettere Goole Maps dentro una finestra modale, soprattutto quando in una stessa pagina ci stanno diverse mappe.

Di come usare GMaps con Javascript ne ho parlato in questo articolo.

Partiamo da li con qualche modifica.

Preparate una pagina php (o in altro linguaggio lato server; ci serve per raccogliare i parametri passati in GET dalla pagina principale):

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
#tooltip {
color: black;
font-family: Arial;
}

#tooltip a {
color: blue;
text-decoration: underline;
}
</style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true&language=it"></script>
<script type="text/javascript" src="gmap.js"></script>
</head>
<body onload="maps(, );"> // PURTROPPO NON SI LEGGE CHE C'E DENTRO ALLE PARENTESI
<div id="map_canvas" style="width: 590px; height: 590px;"></div>
</body>
</html>

Purtroppo non si vede che c'è dentro maps(); in pratica dovete fare echo delle due variabili passate in GET (echo $_GET['lat'], echo $_GET['lng']).

Ho messo un evento onload dentro al body in modo da caricare la pagine con latitudine e longitudine che gli passeremo dalla pagina principale.

Così facendo possiamo usare sempre lo stesso file senza crearne uno per ogni mappa.

Il file map.js sarà una cosa del genere:

function maps(lat, lng) {
var latlng = new google.maps.LatLng(lat, lng);
var myOptions = {
zoom: 13,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
var marker = new google.maps.Marker({
position: latlng,
map: map
});
var tooltip = '<div id="tooltip">'+
'<a href="http://maps.google.it/maps?q="'+lat+','+lng+'" target="_blank">Indicazioni stradali</a>' +
'</div>';
var infowindow = new google.maps.InfoWindow({
content: tooltip
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map,marker);
});
}

Come vedete adesso latitudine e longitudine sono parametrizzati.

A questo punto dobbiamo creare la pagina che richiamerà la finestra modale con la roba sopra caricata al suo interno.

Per la finestra modale ho scelto di usare il plugin per jQuery Thickbox.

Potete scaricare il tutto da qua.

Mattepuffo's logo
Conoscere il sistema operativo del web server con PHP

Conoscere il sistema operativo del web server con PHP

Ho visto che molti siti/blog mostrano informazioni riguardo al web server su cui gira la loro applicazione web.

Ottenere informazioni sul server non è complicato; in generale basta usare una delle costanti predefinite di PHP: PHP_OS.

Creeremo una piccola funzione in modo da poterla richiamare dove e quando vogliamo.

Mattepuffo's logo
Ti amo in tutti i linguaggi del mondo

Ti amo in tutti i linguaggi del mondo

Oooooo, ogni tanto un link carino.

Questo sito mostra come dire "Ti amo" in tantissimi linguaggi, ambienti e architetture.

Ce ne sono veramente una quantità infinita.

Nomi che neanche sapevo esistessero!