Eseguire Query senza DB

Gli argomenti di questa pagina

  • Introduzione
  • Lo script di esempio senza selezionare il DB
  • Alcune Query di esempio comparate con istruzioni PHP

Introduzione

La tecnica di creare ed eseguire Query senza alcuna connessione a può risultare utile in alcuni casi particolari.
Eseguire veloci test su particolari funzioni MYSQL.
Usare delle funzioni MYSQL se quelle PHP non ci soddisfano.

Queste sono alcune istruzioni SELECT che potremmo usare così come sono, senza effettuare alcuna connessione al DB. Si noterà che nelle Query non sono utilizzati nè il nome di una tabella, nè il nome di nessuna colonna. Unico requisito su cui contare è avere l'ambiente MYSQL nello spazio che utilizziamo: un server locale o remoto.

1
2
3
4
<?php
$Query 
"SELECT CURDATE() AS date_curr
"
;
?>

1
2
3
4
5
6
7
8
9
<?php
$Query 
" SELECT '2014-02-15' AS data_esame, 
DATE_FORMAT('2014-02-15', '%Y-%m-%01') AS inizio_mese,
DATE_ADD( '2014-02-15', INTERVAL 1 MONTH ) AS mese_prossimo, 
DATE_SUB( '2014-02-15', INTERVAL 1 DAY ) AS giorno_precedente, 
DATE_SUB( DATE_ADD( DATE_FORMAT( '2014-02-15', '%Y-%m-%01' ) , INTERVAL 1 MONTH ) , INTERVAL 1 DAY ) 
AS FineM 
"
;
?>

Lo script di esempio senza selezionare il DB

Questo che segue è un probalile codice che indica come agire con questo tipo di Query.
In questo script non è necessario connettersi ad un database MySQL, selezionare un database e nemmeno, ovviamente chiudere la connessione, ma si passa direttamente ad eseguire la Query e a leggere il record restituito.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$result 
mysql_query($Query);
if (!
$result) {
    echo 
mysql_error() . "<br />\n";
} else {
    
$num_row mysql_num_rows($result);
    
$numfields mysql_num_fields($result);
    
$fields = array();
    for (
$i=0$i $numfields$i++) {
        
$fields[] = mysql_field_name($result$i);
    }
    
$row mysql_fetch_array($result);
    echo 
$num_row " record restituiti<br />\n";
    echo 
"<table class=\"tabella_it\">";
    echo 
"<tr>\n";
    for (
$i=0$i $numfields$i++) {
        echo 
"<th>" $fields[$i] . "</th>\n";
    }
    echo 
"</tr>\n";
    echo 
"<tr>\n";
    for (
$i=0$i $numfields$i++) {
        echo 
"<td>" $row[$fields[$i]] . "</td>\n";
    }
    echo 
"</tr>\n";
    echo 
"</table>\n";
}
?>

Alcune Query di esempio comparate con istruzioni PHP

In questa serie di esempi metto a confronto la Query MYSQL con le istruzioni PHP che svolgono lo stesso compito.

In questi esempi mi soffermo sulla gestione delle date perchè, tra i vari argomenti, è quella che io ritengo essere la più complessa. Ma la tecnica piò essere estesa a qualsiasi altro argomento (stringhe, numeri, ecc) che possa essere trattato sia in PHP che in MYSQL.

Mostra i giorni trascorsi tra due date

Calcolo con la Query
1
2
3
4
<?php
$Query 
"SELECT 
DATEDIFF('2008-12-30','2008-11-29') AS giorni"
;
?>
Risultaro
1 record restituiti
giorni
31
Calcolo in PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$start 
'2008-11-29';
$fine '2008-12-30';
list(
$start_a$start_m$start_g) = preg_split('/[-\.\/: ]/'$start);
list(
$fine_a$fine_m$fine_g) = preg_split('/[-\.\/: ]/'$fine);

$date1 mktime(0,0,0,$fine_m,$fine_g,$fine_a);
$date2 mktime(0,0,0,$start_m,$start_g,$start_a);
$dateDiff $date1 $date2;
$fullDays floor($dateDiff/(60*60*24));
echo 
$fullDays " giorni trascorsi<br />";
?>
Risultato
31 giorni trascorsi
 
Calcolo con la Query
1
2
3
4
<?php
$Query 
"SELECT 
DATEDIFF('2011-11-30','2010-09-29') AS giorni"
;
?>
Risultato
1 record restituiti
giorni
427
Calcolo in PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$start 
'2010-09-29';
$fine '2011-11-30';
list(
$start_a$start_m$start_g) = preg_split('/[-\.\/: ]/'$start);
list(
$fine_a$fine_m$fine_g) = preg_split('/[-\.\/: ]/'$fine);

$date1 mktime(0,0,0,$fine_m,$fine_g,$fine_a);
$date2 mktime(0,0,0,$start_m,$start_g,$start_a);
$dateDiff $date1 $date2;
$fullDays floor($dateDiff/(60*60*24));
echo 
$fullDays " giorni trascorsi<br />";
?>
Risultato
427 giorni trascorsi

Mostra gli anni trascorsi tra due date

Calcolo con la Query
1
2
3
4
5
6
<?php
//    '2008-12-30','2008-11-29', '29-11-1966'
$Query "SELECT 
TIMESTAMPDIFF(YEAR, '1966-11-29', CURDATE()) AS diff
"
;
?>
Risultato
1 record restituiti
diff
55
Calcolo in PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//    "'30-12-2008','29-11-2008','29-11-1966'";
$date "29-11-1966";
$fine date("d/m/Y");
list(
$date_gg$date_mm$date_aa) = preg_split('/[-\.\/: ]/'$date);
list(
$fine_gg$fine_mm$fine_aa) = preg_split('/[-\.\/: ]/'$fine);
$year_diff $fine_aa $date_aa;

$month_diff $fine_mm $date_mm;
$day_diff $fine_gg $date_gg;
if (
$day_diff || $month_diff 0) {
    
$year_diff--;
}

echo 
$year_diff " anni trascorsi<br />\n";
?>
Risultato
55 anni trascorsi
  Per questo esempio viene mostrata la Query finale
Calcolo con la Query
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$start 
"2001-10-11";
$end "2011-06-11";
$Query "SELECT YEAR('".$end."') - YEAR('".$start."')
    - (DATE_FORMAT('"
.$end."', '%m%d') < 
    DATE_FORMAT('"
.$start."', '%m%d')) 
    AS diff_years
"
;
echo 
"La Query:<br />\n";
echo 
"<pre>\n";
echo 
$Query;
echo 
"</pre>\n";
?>
La Query:
SELECT YEAR('2011-06-11') - YEAR('2001-10-11')
    - (DATE_FORMAT('2011-06-11', '%m%d') < 
	DATE_FORMAT('2001-10-11', '%m%d')) 
	AS diff_years
1 record restituiti
diff_years
9
Calcolo in PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$start 
"11-10-2001";
$end "11-06-2011";
    list(
$start_day$start_month$start_year) = preg_split('/[-\.\/: ]/'$start);
    list(
$end_day$end_month$end_year) = preg_split('/[-\.\/: ]/'$end);
    
$year_diff $end_year $start_year
    
$month_diff =$end_month $start_month
    
$day_diff $end_day $start_day
    if (
$day_diff || $month_diff 0) {
        
$year_diff--; 
    }
    echo 
$year_diff " anni trascorsi<br />\n";
?>
Risultato
9 anni trascorsi

Mostra quanti anni, quanti mesi e quanti giorni sono trascorsi tra due date

ATTENZIONE: In questo esempio non vengono calcolati gli anni, mesi, giorni trascorsi tra due date nel loro insieme come normalmente viene fatto, ma vengono calcolati gli anni, mesi, giorni in maniera separata. In sostanza è come se ciascuno degli elementi venissero calcolati separatamente.

Sia che si decida di usare la Query che lo script PHP questo esempio rimane utile qualora si voglia calcolare in maniera separata la differenza tra due date in anni, o in mesi, o in giorni.

Calcolo degli anni, dei mesi o dei giorni con Query
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$mia_data 
'2010-11-15';
$Query "
SELECT date_format('"
.$mia_data."', '%d-%m-%Y') AS data,
date_format(CURDATE(), '%d-%m-%Y') AS oggi, 
TIMESTAMPDIFF(YEAR, '"
.$mia_data."', CURDATE()) AS anni,
TIMESTAMPDIFF(MONTH, '"
.$mia_data."', CURDATE()) AS mesi,
TIMESTAMPDIFF(DAY, '"
.$mia_data."', CURDATE()) AS giorni
"
;
echo 
"La Query:<br />\n";
echo 
"<pre>\n";
echo 
$Query;
echo 
"</pre>\n";
?>
Calcolo degli anni, dei mesi o dei giorni
La Query:
SELECT date_format('2010-11-15', '%d-%m-%Y') AS data,
date_format(CURDATE(), '%d-%m-%Y') AS oggi, 
TIMESTAMPDIFF(YEAR, '2010-11-15', CURDATE()) AS anni,
TIMESTAMPDIFF(MONTH, '2010-11-15', CURDATE()) AS mesi,
TIMESTAMPDIFF(DAY, '2010-11-15', CURDATE()) AS giorni
1 record restituiti
data oggi anni mesi giorni
15-11-2010 29-05-2022 11 138 4213
Calcolo degli anni, dei mesi o dei giorni in PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<table class="tabella_it">
<tr>
<th>Start data</th>
<th>End data</th>
<th>anni</th>
<th>mesi</th>
<th>giorni</th>
</tr> 
<?php
$start 
"15-11-2010";
$end date('d-m-Y');
    list(
$startday$startmonth$startyear) = preg_split('/[-\.\/: ]/'$start);
    list(
$endday$endmonth$endyear) = preg_split('/[-\.\/: ]/'$end);
    
$start_time mktime(000$startmonth$startday$startyear);
    
$end_time =   mktime(000$endmonth$endday$endyear);
    
$time_diff $end_time $start_time;
    
    
$years floor($time_diff/(24*3600*365));
    
    
$start_month=date("n",$start_time);
    
$end_month=date("n",$end_time);
    if(
$end_month>=$start_month) {
        
$months=$end_month $start_month;
    } else {
        
$months=(12-$start_month)+$end_month;
    }
    
$months+=$years*12;
    
    
$days=ceil($time_diff/(24*3600));
    
$days=number_format($days,0,"",".");
    
    echo 
"<tr>\n";
    echo 
"<td>" $start "</td>\n";
    echo 
"<td>" $end "</td>\n";
    echo 
"<td>" $years "</td>\n";
    echo 
"<td>" $months "</td>\n";
    echo 
"<td>" $days "</td>\n";
    echo 
"</tr>\n";
?>
</table> 
Lo stesso calcolo effettuato sopra
Start data End data anni mesi giorni
15-11-2010 29-05-2022 11 138 4.213
ATTENZIONE: per l'arrotondamento dei giorni, per uniformarmi con l'arrotondamento che effettua MYSQL, ho usato la funzione PHP ceil() anzichè la funzione PHP floor(). La differenza è Quella che si vede qui sotto:
Con il timestamp 363999600:
Usando la funzione PHP ceil() ottengo
4213
Usando la funzione PHP floor() ottengo
4212

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum