Archive

Archive for the ‘MySQL’ Category

MySqlHotBackup Tool


This class can backup a MySQL database copying records of updated tables to another database.

It can access the MySQL database to be backed up and recreates its tables in a backup database on the first run.

Later in can update the backup by just just updating the records of the tables that were changed in the origin database.

The class can skip some tables to be backed up. The number of records to be committed in the backup database can be limited.

http://www.phpclasses.org/package/8424-PHP-Backup-a-MySQL-database-copying-tables-to-another.html

Thanks to everybody who will use it and mostly rate it

Categories: MySQL, PHP

DBPersister version 1.0 stable


dbpersister logo

DBPersister (Open Souce – LGPL licence)

I released the first stable version of this new library written for php that will easy you life with your classes and most mysql operations.

DBPersister will let you simply call CRUD methods like insert, update, delete, replace or simply “save” to persist data into database.

Moreover give you a lot of others possibility with all posted data by forms
or other infinite ways.

Download and try it
http://www.dbpersister.com

Follow the project on facebook at:
https://www.facebook.com/dbpersister

Categories: Classes, MySQL

Verify EAN 13 in MySql

23 March 2012 6 comments

To verify the correct structure of an EAN13  with MySql we can create a function as the follow.

DROP FUNCTION IF EXISTS FNC_IS_VALID_EAN13;

DELIMITER $$
CREATE FUNCTION FNC_IS_VALID_EAN13(_ean VARCHAR(13)) RETURNS tinyint(4)
READS SQL DATA
BEGIN
DECLARE _correct_ean TINYINT;
DECLARE _even_sum SMALLINT;
DECLARE _odd_sum SMALLINT;
DECLARE _check_digit SMALLINT;
DECLARE _check_number SMALLINT;
IF LENGTH(_ean) 13 THEN RETURN 0; END IF;
IF NOT _ean REGEXP ‘^[0-9]+$’ THEN RETURN 0; END IF;
SELECT SUBSTR(_ean, 0, 1)+SUBSTR(_ean, 2, 1)+SUBSTR(_ean, 4, 1)+SUBSTR(_ean, 6, 1)+SUBSTR(_ean, 8, 1)+SUBSTR(_ean, 10, 1) INTO _even_sum;
SELECT SUBSTR(_ean, 1, 1)+SUBSTR(_ean, 3, 1)+SUBSTR(_ean, 5, 1)+SUBSTR(_ean, 7, 1)+SUBSTR(_ean, 9, 1)+SUBSTR(_ean, 11, 1) INTO _odd_sum;
SELECT ( (10-(3*_even_sum + _odd_sum)%10)%10 ) INTO _check_digit;
SELECT SUBSTR(_ean, 13, 1) INTO _check_number;
SELECT IF(_check_number=_check_digit,1,0) INTO _correct_ean;
RETURN _correct_ean;
END$$
DELIMITER ;

 

To use it simply just type into your queries something like this:

SELECT ean, FNC_IS_VALID_EAN13 (ean) as isValid FROM MY_TABLE;

That’s it

Conversione data in formato MySql


Formatta una data nel formato di MySql partendo da una stringa
Il formato della data deve essere una delle seguenti con opzionale l’ora:
dd/mm/yyyy hh:mm:ss
dd/mm/yy hh:mm:ss
d/mm/yy hh:mm:ss

 

 

function getMySqlFormattedDateString($data, $separatoreInput = "/", $separatoreOutput = "-") {
    //Verifica che la data non sia già in formato mysql
    //e quindi con le prime 4 cifre come anno tra il 2000 ed il 2100

    if(strpos($data, $separatoreInput) === false) {
        return null;
    }

    $tmp = substr($data, 0, 4);
    if($tmp >= 2000 && $tmp <= 2100) {
        return $data;
    }

    //Prima si verifica che siano presenti almeno gli slashes
    $pos_slashes = strpos($data, $separatoreInput);
    if($pos_slashes === false) {
        return "";
    }



    //Divisione della data dall'ora
    $arrDataOra = explode(" ", $data);

    //Determinazione del giorno, mese, anno
    $arrData = explode($separatoreInput, $arrDataOra[0]);

    //Se non ci sono 3 valori almeno si restituisce ""
    if(count($arrData) != 3) {
        return "";
    }

    $giorno = str_pad($arrData[0], 2, "0", STR_PAD_LEFT);
    if(preg_match("/[\D]/",$giorno)) return "";
    $mese = str_pad($arrData[1], 2, "0", STR_PAD_LEFT);
    if(preg_match("/[\D]/",$mese)) return "";
    $anno = str_pad($arrData[2], 2, "0", STR_PAD_LEFT);
    if(preg_match("/[\D]/",$anno)) return "";

    //Restituisco l'ora se presente
    if(!is_array($arrDataOra)) {
        return $anno.$separatoreOutput.$mese.$separatoreOutput.$giorno." ".$arrDataOra[1];
    }
    else {
        return $anno.$separatoreOutput.$mese.$separatoreOutput.$giorno;
    }

}
Categories: Functions, MySQL, PHP

Cambiare l’engine di una o più tabelle di MySql

13 July 2011 2 comments

Qualora si volesse cambiare l’engine di una o più tabelle di un database MySql

o si fa a mano oppure potete utilizzare questo script 🙂




echo "\n\n";
set_time_limit(1000);

$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;


//Connection variables :
$h = 'localhost';
$u = @$argv[1];
$p = @$argv[2];
$database = @$argv[3];
$engine = @$argv[4];
$table = @$argv[5]; //Facoltativo

if(empty($u)) die("\nSpecificare l'username come parametro 1\n");
if(empty($p)) die("\nSpecificare la password come parametro 2\n");
if(empty($database)) die("\nSpecificare il database come parametro 3\n");
if(empty($database)) die("\nSpecificare il database come parametro 4\n");
if(empty($engine)) die("\nSpecificare il tipo di engine da impostare sulle tabelle come parametro 4\n");



/* The php->mysql API needs to connect to a database even when executing scripts like this.
  If you got an error from this(permissions),
  just replace this with the name of your database */

$db_link = mysqli_connect($h, $u, $p, "information_schema");


$sql = "SELECT * FROM `TABLES`
        WHERE TABLE_SCHEMA = '".addslashes($database)."'
        AND `ENGINE`  '".addslashes($engine)."' ";
if(!empty($table)) {
    $sql .= " AND `TABLE_NAME` = '".addslshes($table)."' ";
}


$rs = mysqli_query($db_link, $sql);

echo "Modifica engine a ".mysqli_num_rows($rs)." tabelle\n";

$sql_to_execute = array();
while($row = mysqli_fetch_object($rs))
{
    $sql_to_execute[] = "alter table `".$row->TABLE_SCHEMA."`.`".$row->TABLE_NAME."` engine = ".$engine.";";
}

foreach($sql_to_execute as $sql)
{
    echo "$sql\n";
    mysqli_query($db_link, $sql);
}

mysqli_close($db_link);

$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 6);
echo 'Parsed in ' . $total_time . ' secs' . "\n\n";


Questa funzione è molto semplice e semplicemente può essere lanciata dal seguente comando su una shell, tenete presente che i parametri possono essere

1 = username
2 = password
3 = database
4 = nuovo engine
5 = nome di una singola tabella da modificare

Volutamente non è stato inserito l’host in quanto si presuppone che operazioni così delicate vengano fatte da localhost. Diversamente basterà modificare
l’impostazione nello script.

Es comando:

[root@principe home]# php mysql_change_engine_tables.php "username_test" "password_test" "database_test" "InnoDB"

Categories: Bash scripting, MySQL, PHP

Ottimizzare le tabelle di MySql


Molti spesso necessitano di ottimizzare le tabelle di MySql,
attenzione a non farlo con le InnoDB in quanto non avreste nessun risultato 🙂

Questa funzione è molto semplice e semplicemente può essere lanciata dal seguente comando su una shell: [root@principe home]# php mysql_optimize_tables.php "database_test" "username_test" "password_test"



set_time_limit(100);

$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;


//Connection variables :
$h = 'localhost';
$u = 'xxx';
$p = 'xxxx';

if(!empty($argv[2])) {
    $u = $argv[2];
    echo "Param 2: $u\n";
}
if(!empty($argv[3])) {
    $p = $argv[3];
    echo "Param 3: $p\n";
}
if(!empty($argv[1])) {
    $database = @$argv[1];
    echo "Param 1: $database\n";
}


$dummy_db = 'mysql';

/* The php->mysql API needs to connect to a database even when executing scripts like this.
  If you got an error from this(permissions),
  just replace this with the name of your database */

$db_link = mysql_connect($h, $u, $p);


$sql = 'SHOW DATABASES';
if(!empty($database)) {
	$sql .= " WHERE `Database` = '".addslashes($database)."' ";
}

$res = mysql_db_query($dummy_db, $sql, $db_link) or die('Could not connect: ' . mysql_error());
echo 'Found ' . mysql_num_rows($res) . ' databases' . "\n";
$dbs = array();
while ($rec = mysql_fetch_array($res)) {
    $dbs [] = $rec [0];
}

foreach ($dbs as $db_name) {
    echo "Database : $db_name \n\n";
    $res = mysql_db_query($dummy_db, "SHOW TABLE STATUS FROM `" . $db_name . "`", $db_link) or die('Query : ' . mysql_error());
    $to_optimize = array();
    while ($rec = mysql_fetch_array($res)) {
        if ($rec['Data_free'] > 0) {
            $to_optimize [] = $rec['Name'];
            echo $rec['Name'] . ' needs optimization' . "\n";
        }
    }
 
    echo "To optimize: ".count($to_optimize)." tables\n";
    if (count($to_optimize) > 0) {
        foreach ($to_optimize as $tbl) {
            mysql_db_query($db_name, "OPTIMIZE TABLE `" . $tbl . "`", $db_link);
        }
    }
}

$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 6);
echo 'Parsed in ' . $total_time . ' secs' . "\n\n";

Categories: Bash scripting, MySQL

Esportazione dati MySql


Spesso molti mi chiedono uno script per l’esportazione dei dati su files separati per le tabelle contenute su MySql.

A tal proposito ecco un semplice ma efficace scripts bash.

#!/bin/bash
db=$1
user=$2
pswd=$3
desturl=$4

if [ “$db” = “” ]; then
echo “Usage: $0 db_name”
exit 1
fi
mkdir $desturl
mkdir $desturl$db
cd $desturl$db
clear

for table in `mysql -u $user –password=$pswd $db -e ‘show tables’ | egrep -v ‘Tables_in_’ `; do
echo “Dumping $table”
mysqldump -v -l -u $user –password=$pswd –opt -Q $db $table > $table.sql
tar cjf $table.tar.bz2 $table.sql
rm -f $table.sql
done

if [ “$table” = “” ]; then
echo “No tables found in db: $db”
fi

chmod -R 777 $desturl

Per utilizzare questo script basta semplicemente lanciare il comando:

[orazio@principe scripts]# ./mysql_backup.sh “test” “root” “pass” “backup”

Categories: Bash scripting, MySQL
%d bloggers like this: