[PHP] Sostituire if ed elseif con operatore ternario switch

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Ciao a tutti,
mi è successa una cosa stranissima con un codice php, in sostanza ho un link che ho nominato "APPUNTAMENTI OGGI", questo link punta ad uno script php che controlla e mostra a video (o meglio dovrebbe) tutti gli appuntamenti della giornata odierna. Bene, utilizzo lo script su un sito test e quando clicco su link mi vengono correttamente mostrati a video tutti gli appuntamenti di oggi. Ho caricato lo stesso script su un NAS locale, stessa versione di php e orario e data perfettamente aggiornato, quando clicco su "APPUNTAMENTI DI OGGI" mi vengono mostrati a video tutti gli appuntamenti del giorno successivo e non quelli con data = date()

Lo script è composto da tanti if e sono consapevole che il sistema prende in considerazione l'ultimo if, chiedo a voi un supporto per strutturare lo script in modo tale che se si verifica la condizione deve uscire dal ciclo senza verificare gli altri if.

PHP:
$today = date("Y-m-d");
//$today = date('Y-m-d');


$tipo = trim(strip_tags(stripslashes($_GET['tipo'])));
$data = trim(strip_tags(stripslashes($_GET['data'])));
$cliente = trim(strip_tags(stripslashes($_GET['cliente'])));

if ($tipo == "tutti") {
$sql = "SELECT * FROM appuntamenti ORDER BY stato_pren ASC, data ASC";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}


if ($tipo == "accettazione" && $data == "oggi") {
$sql = "SELECT * FROM appuntamenti WHERE data = '$today' AND stato_pren = 'ACCETTAZIONE' ORDER BY data ASC";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}

if ($tipo == "lavorazione" && $data == "oggi") {
$sql = "SELECT * FROM appuntamenti WHERE data = '$today' AND stato_pren = 'LAVORAZIONE' ORDER BY data ASC";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}

if ($tipo == "terminato" && $data == "oggi") {
$sql = "SELECT * FROM appuntamenti WHERE data = '$today' AND stato_pren = 'TERMINATO' ORDER BY data ASC";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}


if ($tipo == "accettazione" && $data == "oggi" && $cliente == "privato") {
$sql = "SELECT * FROM appuntamenti WHERE data = '$today' AND stato_pren = 'ACCETTAZIONE' and tipo_pren = 'CLIENTE PRIVATO'";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}

if ($tipo == "lavorazione" && $data == "oggi" && cliente == "privato") {
$sql = "SELECT * FROM appuntamenti WHERE data = '$today' AND stato_pren = 'LAVORAZIONE' AND tipo_pren = 'CLIENTE PRIVATO' ORDER BY data ASC";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}

if ($tipo == "terminato" && $data == "oggi" && $cliente == "privato") {
$sql = "SELECT * FROM appuntamenti WHERE data = '$today' AND stato_pren = 'TERMINATO' AND tipo_pren = 'CLIENTE PRIVATO' ORDER BY data ASC";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}

if ($tipo == "accettazione" && $data == "oggi" && $cliente == "noleggio") {
$sql = "SELECT * FROM appuntamenti WHERE data = '$today' AND stato_pren = 'ACCETTAZIONE' AND tipo_pren = 'CLIENTE NOLEGGIO' ORDER BY data ASC";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}


if ($tipo == "lavorazione" && $data == "oggi" && $cliente == "noleggio") {
$sql = "SELECT * FROM appuntamenti WHERE data = '$today' AND stato_pren = 'LAVORAZIONE' AND tipo_pren = 'CLIENTE NOLEGGIO' ORDER BY data ASC";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}

if ($tipo == "terminato" && $data == "oggi" && $cliente == "noleggio") {
$sql = "SELECT * FROM appuntamenti WHERE data = '$today' AND stato_pren = 'TERMINATO' AND tipo_pren = 'CLIENTE NOLEGGIO' ORDER BY data ASC";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}

if ($tipo == "tutti" && $data == "oggi") {
$sql = "SELECT * FROM appuntamenti WHERE data = '$today' ORDER BY data ASC";
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
}

if ($count == 0) {
echo "<p style='text-align:center;margin-top: 10%;'>Non ci sono appuntamenti nel database.</p>";
}else{ ...

Grazie :)
 
ciao
prova così
PHP:
<?php
//......
if ($tipo == "tutti") {
    $where="";
}elseif ($tipo == "accettazione" && $data == "oggi") {
    $where = " WHERE data = '$today' AND stato_pren = 'ACCETTAZIONE' ";
}elseif($tipo == "lavorazione" && $data == "oggi") {
    $where = " WHERE data = '$today' AND stato_pren = 'LAVORAZIONE' ";
}elseif ($tipo == "terminato" && $data == "oggi") {
    $where = " WHERE data = '$today' AND stato_pren = 'TERMINATO' ";
}elseif ($tipo == "accettazione" && $data == "oggi" && $cliente == "privato") {
    $where = " WHERE data = '$today' AND stato_pren = 'ACCETTAZIONE' and tipo_pren = 'CLIENTE PRIVATO'";
}elseif ($tipo == "lavorazione" && $data == "oggi" && cliente == "privato") {
    $where = " WHERE data = '$today' AND stato_pren = 'LAVORAZIONE' AND tipo_pren = 'CLIENTE PRIVATO' ";
}elseif ($tipo == "terminato" && $data == "oggi" && $cliente == "privato") {
    $where = " WHERE data = '$today' AND stato_pren = 'TERMINATO' AND tipo_pren = 'CLIENTE PRIVATO' ";
}elseif ($tipo == "accettazione" && $data == "oggi" && $cliente == "noleggio") {
    $where = " WHERE data = '$today' AND stato_pren = 'ACCETTAZIONE' AND tipo_pren = 'CLIENTE NOLEGGIO' ";
}elseif ($tipo == "lavorazione" && $data == "oggi" && $cliente == "noleggio") {
    $where = " WHERE data = '$today' AND stato_pren = 'LAVORAZIONE' AND tipo_pren = 'CLIENTE NOLEGGIO' ";
}elseif ($tipo == "terminato" && $data == "oggi" && $cliente == "noleggio") {
    $where = " WHERE data = '$today' AND stato_pren = 'TERMINATO' AND tipo_pren = 'CLIENTE NOLEGGIO' ";
}elseif ($tipo == "tutti" && $data == "oggi") {
    $where = " WHERE data = '$today' ";
}
$sql = "SELECT * FROM appuntamenti $where ORDER BY data ASC";
var_dump($sql);//per verificare che venga scritta come vuoi, poi lo togli
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);
if($count==0){
    //......
}else{
    //........
}
//.....
?>
 
ciao
dimenticavo metti un var_dump anche alla data per verificare che venga scritta come deve
PHP:
<?php
//......
$today = date("Y-m-d");
var_dump($today);
//....
?>
e a $data
 
Buongiorno e grazie mille per la risposta,
allora ho provato il tuo script e la parte che riguarda i clienti privati sembra funzionare, il problema si presenta qui

PHP:
index.php?page=lista_appuntamenti_oggi&tipo=accettazione&data=oggi&cliente=noleggio

viene eseguita la query

PHP:
string(104) "SELECT * FROM appuntamenti WHERE data = '2017-05-24' AND stato_pren = 'ACCETTAZIONE' ORDER BY data ASC"
 
ciao
se non ho capito male nel caso di quel link manca
page=lista_appuntamenti_oggi&tipo=accettazione&data=oggi&cliente=noleggio
verifica che esista l'elseif con quelle condizioni se non esiste devi aggiungerlo e costruire il $where, se esiste verifica il corrispondente $where che sia formato giusto
eventualmente fai anche la verifica dei get
PHP:
//.....
echo "<pre>";// poi le togli
var_dump($_GET);
echo "</pre>";

$tipo = trim(strip_tags(stripslashes($_GET['tipo'])));
$data = trim(strip_tags(stripslashes($_GET['data'])));
$cliente = trim(strip_tags(stripslashes($_GET['cliente'])));
//.....
 
Grazie borgo italia,
adesso lo script funziona, volevo chiederti sempre restando in topic, per farmi mostrare solo gli appuntamenti con data inferiore ad oggi, come potrei modificare ?

PHP:
<?php

$tipo = trim(strip_tags(stripslashes($_GET['tipo'])));

if ($tipo == "tutti") {
    $where = "WHERE data = '$oggi'";

}elseif ($tipo == "accettazione") {
    $where = "WHERE stato_pren = 'ACCETTAZIONE' AND tipo_pren = 'CLIENTE PRIVATO'";

}elseif ($tipo == "lavorazione") {
    $where = "WHERE stato_pren = 'LAVORAZIONE' AND tipo_pren = 'CLIENTE PRIVATO'";

}elseif ($tipo == "terminato") {
    $where = "WHERE stato_pren = 'TERMINATO' AND tipo_pren = 'CLIENTE PRIVATO'";
}

$sql = "SELECT * FROM appuntamenti $where ORDER BY data ASC";
//var_dump($sql);
$res = $mysqli->query($sql);
$count = mysqli_num_rows($res);

if ($count == 0) {
echo "<p style='text-align:center;margin-top: 10%;'>Non ci sono appuntamenti in $tipo di Clienti Privati nel database.</p>";
}else{ ... stampo la tabella
 
ciao
non è semplice risponderti per vari motivi
il primo dovrei sapere come è struuurata la tabella che così a naso mi sembra anche molto ridondante
poi io non avre mai usato il get (sempre potenzialmete pericoloso) per fare le ricerche, ma mi sarei fatto fatto un form con le varie possibili selezioni passate via post
non so, ma può essere una mia personale impressione, mi sembra che tu ti stia incasinando un po'
non so se sei all'inizio del lavoro, ma se sei all'inizio se fossi in te ripenserei un po' al tutto, meglio ripartire da zero che incasinarsi

prova a postare a parole cosa vorresti fare, mi sbaglierò ma mi sembra che tu stia lavorando per seguire delle commesse di lavoro, giusto?
 
Si, sto provando insieme ad un caro amico a mettere in piedi un progettino per seguire delle commesse di lavoro, in sostanza avrei la necessità di costruire una query che faccia questo:

Seleziona dalla tabella appuntamenti tutti gli appuntamenti cliente privato --> stato accettazione con con data < di oggi
Seleziona dalla tabella appuntamenti tutti gli appuntamenti cliente privato --> stato lavorazione e con con data < di oggi
Seleziona dalla tabella appuntamenti tutti gli appuntamenti cliente privato --> stato terminato con con data < di oggi

Seleziona dalla tabella appuntamenti tutti gli appuntamenti cliente noleggio --> stato accettazione con con data < di oggi
Seleziona dalla tabella appuntamenti tutti gli appuntamenti cliente noleggio --> stato lavorazione e con con data < di oggi
Seleziona dalla tabella appuntamenti tutti gli appuntamenti cliente noleggio --> stato terminato con con data < di oggi
 

Discussioni simili