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
|
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
|
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
|
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 < 0 || $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
|
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 < 0 || $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(0, 0, 0, $startmonth, $startday, $startyear); $end_time = mktime(0, 0, 0, $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
|