Ho modificato il codice risolto errori e separato le funzioni dal resto del codice.
Ecco come gestire due loop while.
funzioni.php
Codice PHP:
<?php
function varchar_four_year($varchar) {
$year = ltrim($varchar, '+');
$sign = (isset($year[0]) ? ($year[0] == '-' && $year[0] = '' ? '-' : '') : '');
$year_four = sprintf('%s%04d', $sign, $year);
return $year_four;
}
function moment_tz($tz_utc) {
$now = date_create('@'.$tz_utc);
$display = date_format($now, 'Y-m-d H:i:s');
return $display;
}
function moment_now($tz) {
$now = date_create('now', $tz);
return $now;
}
function moment_today($tz) {
$today = date_create('today', $tz);
return $today;
}
function moment_utc($moment_obj) {
$moment_tm = date_format($moment_obj, 'U');
return $moment_tm;
}
function local_timezone() {
$tz_local = timezone_open('Europe/Moscow');
return $tz_local;
}
primo while
Codice PHP:
<?php
$i=1;
$row = true;
//while query film
while ($row):?>
Query film <?php $i=$i+1;
unset($row);
$row['start'] = '2019';
$row['end'] = null;
$row['died'] = '2020-04-12';
$row['year'] = '2020';
$row['release_data'] = '2020-02-20';
Codice originale
Codice PHP:
require_once dirname(__FILE__).'/funzioni.php';
$timezone = local_timezone();
$timezone_utc = timezone_open('UTC');
$utc_ora = moment_utc(moment_now($timezone_utc));
$ora = moment_tz($utc_ora);
$utc_oggi = moment_utc(moment_today($timezone));
$oggi = moment_tz($utc_oggi);
//ora locale
$ora_locale = date_format(moment_now($timezone), 'Y-m-d H:i:s');
$start = strlen(ltrim($row['start'], '+-')) > 4 ? $row['start'].' 00:00:00' : varchar_four_year($row['start']).'-01-01 00:00:00';
$end = (strlen(ltrim($row['end'], '+-')) > 4 ? $row['end'].' 00:00:00' : ($row['end'] ? varchar_four_year($row['end']).'-01-01 00:00:00' : ($row['died'] ? $row['died'].' 00:00:00' : $ora)));
$carriera = 'abbandono carriera';
if($row['died'] && ($row['died'].' 00:00:00') == $end) {
$carriera = 'fine carriera';
} elseif($ora == $end) {
$carriera = 'carriera in corso';
}
$film_now = '';
if($row){
$local_release = $row['release_data'];
$local_data = $row['year'];
}
$release_data = $local_release ? $local_release.' 00:00:00' : varchar_four_year($local_data).'-01-01 00:00:00';
$sign = $release_data[0] == '-' && $release_data[0] = '' ? '-' : '';
$film_current = 'data non valida';
if(intval(substr($release_data, 0, 4)) && intval(substr($release_data, 5, 2)) && intval(substr($release_data, 8, 2)) && substr($sign.$release_data, 0, 4) == substr($ora, 0, 4)) {
//differenza anno corrente film
$diff_current_year = date_create($sign.$release_data, $timezone_utc)->diff(date_create($oggi, $timezone_utc));
$testo = 'differenza anno corrente';
$year_current = $diff_current_year->y;
$mese_current = $diff_current_year->m;
$giorni_current = $diff_current_year->d;
if($year_current) {
$film_current = $year_current.' years';
} elseif($mese_current == 0 && $giorni_current == 0) {
$film_current = 'anno corrente';
} elseif($mese_current) {
$film_current = $mese_current.' months';
if($giorni_current) {
$film_current .= ' '.$giorni_current.' days';
}
} else {
$film_current = $giorni_current.' days';
}
$film_current .= ' '.$testo;
}
var_dump($film_current);
continuo while e funzione ultima release_data
Codice PHP:
if(($i-1) == 2) {
unset($row);
$row = null;
}
$y = 1;
$row2 = true;
//while query actor
while ($row2):?>
Query actor <?php $y=$y+1;
if(($y-1) == 1) {
$row2 = null;
}
endwhile; //fine while actor
endwhile; //fine while film
if(intval(substr($release_data, 0, 4)) && intval(substr($release_data, 5, 2)) && intval(substr($release_data, 8, 2))) {
//differenza film dall'inizio carriera di un'attore
$diff_film = date_create($sign.$release_data, $timezone_utc)->diff(date_create($start, $timezone_utc));
$testo = 'differenza film inzio carriera';
$year_film = $diff_film->y;
$mese_film = $diff_film->m;
$giorni_film = $diff_film->d;
if($year_film) {
$film_now = $year_film.' years';
} elseif($mese_film == 0 && $giorni_film == 0) {
$film_now = 'anno corrente';
} elseif($mese_film) {
$film_now = $mese_film.' months';
if($giorni_film) {
$film_now .= ' '.$giorni_film.' days';
}
} else {
$film_now = $giorni_film.' days';
}
$film_now .= ' '.$testo;
} else {
$film_now = 'data non valida';
}
var_dump($film_now);
?>
Ci sono solo due var_dump uno dentro al primo loop e l'atro fuori, inoltre stampo il testo quando disabilito il motore php. Sto simulando due iterazioni query film per il primo while e una iterazione query actor per il secondo while ma è anche dentro il primo while.
Se lo provi assemblato il tutto puoi vederlo in azione senza query etc.
Ovviamente sei tu a decidere quando stampare a video un testo, $ora_locale, $carriera al momento non verrà stampato.. spero ti aiuti.
Expected result:
Codice:
Query film string(41) "6 months 19 days differenza anno corrente"
Query actor Query film string(41) "6 months 19 days differenza anno corrente"
Query actor string(38) "1 years differenza film inzio carriera"