MySQL disponde della funzione LAST_INSERT_ID() che restituisce l'ultimo valore AUTO_INCREMENT inserito nel database.

Ma non fa alcuna distinzione su quale tabella questo valore è stato inserito.

Il che, in uno caso molto specifico, mi creava diversi problemi.

Quello che vediamo oggi è come impostare il testo maiuscolo automaticamente in una JTextField.

In pratica dentro alla nostra casella di testo potremmo scrivere solo in maiuscolo.

Per prima cosa dobbiamo creare una classe apposita, che estenda DocumentFilter.

In breve, DocumentFilter è in grado di modicare il contenuto di un Document.

Questa la classe:

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class UppercaseFilter extends DocumentFilter {

    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
        fb.insertString(offset, text.toUpperCase(), attr);
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        fb.replace(offset, length, text.toUpperCase(), attrs);
    }
}

Il metodo insertString viene invocato prima dell'inserimento del testo.

Lo scenario è questo.

Inserisco i dati in una tabella e subito dopo devo fare un inserimento in un'altra tabella collegata alla prima.

Per fare questo mi serve ovviamente l'id (inteso come campo di raccordo tra le tue tabelle) in modo da passarlo alla seconda tabella.

Per fare questo PDO ci mette a disposizione la funzione lastInsertId().

Quindi, supponendo di aver creato una classe per la connessione, possiamo iniziare da questo:

$objConn = Connessione::getInstance();

$lastRist = $objAdminConn->addSomething($par1, $par2, $par3);

$objAdminConn->addSomething2($par1, $par2, $lastRist);

Alla prima riga istanziamo la classe (che è Singleton, ma non cambia).

In altri articoli ho già parlato di come fare l'upload di file, di come cancellarli, e di come visualizzarli.

Non ho mai tenuto in considerazione però la possibilità di affiancarci un db per l'ordinamento, eventuali didascalie, ecc.

Vediamo quindi come creare una galleria di immagini che ci permetterà di salvare il nome dei files e l'ordinamento su un db MySQL.

In questa prima parte vedremo la creazione del db e l'upload.

Prima di tutto dobbiamo creare un db e una tabella; la tabella che ci serve l'ho chiamata gallery e ha questa struttura:

  • id int auto increment primary key
  • nome varchar(100)
  • ordine int

Tutti sono not null.

Cominciamo con la parte PHP; considerate che io uso PDO sul quale potete vedere questi articoli:

Comunque potete usare anche le classiche funzioni mysql/mysqli.

Vi posto la mia classe per la connessione, così vi fate un'idea:

<?php


//config.php


class Config {

private $pdo;
private static $instance;

private function __construct() {
try {
$this->pdo = new PDO('mysql:host=host;dbname=db', "user", "pass", array(
PDO::ATTR_PERSISTENT => TRUE
));
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}

public static function getInstance() {
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}

public function __clone() {
trigger_error('Clone is not allowed.', E_USER_ERROR);
}

public function getPdo() {
return $this->pdo;
}

...............

}

Non ve la sto a spiegare; comunque è una classe Singleton che dovete istanziare in questa maniera:

include_once 'config.php';
$config = Config::getInstance();

La funzione di inserimento è questa qua:

function insertImg($nome, $ordine) {
global $config;
try {
$prepare = $config->getPdo()->prepare("INSERT gallery (nome, ordine) VALUES (?,?)");
$prepare->execute(array(
$nome,
$ordine
));
} catch (Exception $e) {
die($e->getMessage());
}
}

Dovo avere fatto la connessione e una classica interrogazione vediamo come aggiungere dati al nostro db.

Prima di tutto leggiamo l'articolo linkato e salviamoci quella classe.

Infatti non andremo creare una nuova classe, ma aggiungeremo solo una funzione riprendendo quella istanza di PDO.

Questo perchè, come detto nell'articolo, quella classe rappresenta il nostro db e li mettermo tutte le operazioni da fare.

Per l'inserimento useremo le istruzioni prepare.

Come vedete queste istruzioni posso essere usate in vari modi; io in genere uso i segnaposti ?.

Vediamo la funzione da aggiungere alla classe:

public function insert($nome, $cognome, $data_nascita, $cel, $tel, $fax, $soc, $carica, $email1, $email2, $sito, $casa, $uff) {
try {
$prepare = $this->pdo->prepare("INSERT INTO contatti (nome, cognome, data_nascita, cellulare, telefono, fax, societa, carica, email_1, email_2, sito_web, indirizzo_casa, indirizzo_uff) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");
$prepare->execute(array(
trim($nome),
trim($cognome),
trim($data_nascita),
trim($cel),
trim($tel),
trim($fax),
trim($soc),
trim($carica),
trim($email1),
trim($email2),
trim($sito),
trim($casa),
trim($uff)
));
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}

Come vedete la funzione richiede diversi parametri, che corrispondono alle voci da inserire nella tabella.