Perfezionare un Generatore di ricette casuale [descrizione CON FOTO

  • Creatore Discussione Creatore Discussione Andryx
  • Data di inizio Data di inizio

Andryx

Nuovo Utente
15 Dic 2009
20
0
0
Salve a tutti ho costruito un generatore di Menu casuale di 3 portate con php e mysql e vorrei perfezionarlo.

Attenzione i Menú sono in Tedesco.



qui il codice

codice PHP:

PHP:
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("rezepte", $con);

$result = mysql_query("SELECT Name FROM rezepte WHERE Art LIKE 'Vorspeisen' ORDER BY RAND() LIMIT 1 ");

echo "<html xmlns='http://www.w3.org/1999/xhtml'>";
echo "<head>";
echo "<link href=style.css rel=stylesheet type=text/css>";
echo "<meta http-equiv=Content-Typecontent='text/html; charset=utf-8/>";
echo "<title>Menü Generator</title>";
echo "</head>";

echo "<body>";
echo "<p>&nbsp;</p>";
echo "<p>&nbsp;</p>";
echo "<p>&nbsp;</p>";
echo "<p>&nbsp;</p>";
echo "<table width=400 border=0 align=center>";
echo "<tr>";
while($row = mysql_fetch_array($result))
  {

  echo "<td align='center'><h2>" . $row['Name'] . "</h2></td>";

echo "</tr>";
echo "<tr>";
echo "<td align='center'><h2>****</h2></td>";






    }
  echo "</tr>";
  echo "<tr>";
?>
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("rezepte", $con);

$result2 = mysql_query("SELECT Name FROM rezepte WHERE Art LIKE '%Hautpgang' ORDER BY RAND() LIMIT 1 ");



while($row = mysql_fetch_array($result2))
  {

echo "<td align='center'><h2>" . $row['Name'] . "</h2></td>";

echo "</tr>";
echo "<tr>";
echo "<td align='center'><h2>****</h2></td>";



    }
    
  echo "</tr>";
  echo "<tr>";
?>
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("rezepte", $con);

$result3 = mysql_query("SELECT Name FROM rezepte WHERE Art LIKE 'Dessert' ORDER BY RAND() LIMIT 1 ");



while($row = mysql_fetch_array($result3))
  {

  echo "<td align='center'><h2>" . $row['Name'] . "</h2></td>";



    }

echo "</tr>";
echo "<tr>";
echo "<td align='center'>";
echo "<form name=my_form method=get action=menu.php>";
echo "<font color=#000000><input name=submit value=Neue.Menu type=submit>";
echo "</td>";
echo "</tr>";
echo "</table>";

echo " </body>";
echo "</html>";





?>

Si presenta Cosí:
original.jpg


La mia intezione e di creare delle opzioni per la ricerca:

1° Ogni singola ricetta puó essere cliccata sigolarmente in modo da non cambiare piú e quindi esclusa dalla ricerca.

2° Scelta del menü : La portata forte puo essere influenzata cliccando le opzioni sottostanti
schegliendo tra Pesce carne e pasta.

qui é la mia idea su un grafico


original2.jpg


e questa é la mia banca dati

banca.jpg




Fleisch= Carne
Fisch= Pesce
Nudel= Pasta

NON SO DA DOVE COMINCIARE AIUTO!:dipser:

GRAZIE A TUTTI!
 
ciao
a parte il tedesco che non capisco per nulla, ci sono un paio di cose che non capisco (alex direbbe per forza)
1. perchè due parti di php con due connessioni allo stesso db?
2. in entrambe le SELECT (ne scrivo una per l'altra è lo stesso)
PHP:
$result = mysql_query("SELECT Name FROM rezepte WHERE Art LIKE 'Vorspeisen' ORDER BY RAND() LIMIT 1 ");
cosa intendi per ORDER BY RAND()? rand() restituisce un numero intero da 0 a getrandmax. l'ORDER BY deve avere un nome di campo.
inoltre scrivi LIMIT 1 quindi estrai un solo record, ma se estrai solo un record a che ti serve il WHILE?
3. cerca di spiegare meglio quello che vorresti fare, cioe (da quello che ho capito) vuoi estrarre due record casualmente (uno contenente vorspeisen ed uno con hautpgang)?
 
Ciao si é vero in realta ho trasformato un codice che avevo senza prestarci molta attenzione. Si il codice lo devo un po semplificare...
MA FUNZIONA!

1. Si, anche qui devo unire ancora il codice
2. Non capisco cosa vuoi dire; mi servono 3 diverse query per il mio menu
Antipasti *** Secondi(hauptgang) *** Dessert
posso con un SELECT prendere 3 diversi dati tra loro?


ORDER BY RAND() mi restituisce casualmente i dati in modo da avere sempre casuali e nuovi menu.

Limit 1 mi estrae solo un record giusto... while lo devo eliminare hai ragione.....

3. Lo script cosí com'é funziona bene.. ad ogni click mi crea un nuovo menu con 3 diverse portate.

Quello che vorrei sarebbe che mentre si cliccano i vari menu magari se ne trova uno (Antipasto) che magari piace e non si vorrebbe piú cambiasse con un una selezione alla sinitra si blocca la ricerca del antipasto mentre per i secondi e i dessert continua, fino a quando non si trova un secondo preferito e un dessert o viceversa.

Praticamente con il selezionare a fianco del menu si blocca la ricerca di quel che sia:
Antipasto, Secondi, Dessert.
Il grafico che ho mandato é solo un esempio.
qui si vede come i secondi e i dessert sono selezionati, quindi cliccando ancora cambierebbe solo l'antipasto....


Sotto invece vorrei che scegliendo tra pesce, Carne e Pasta
Si adatti a a seconda della scelta i secondi piatti scegliendo cosí solo piatti di pesce o di Carne i di Pasta.

Magari qui serve al posto di un
<input name="" type="checkbox" value="" />

al posto di un
<input name="" type="radio" value="" />

spero sia stato chiaro.

Grazie
 
ciao
credo di aver capito e provo a spiegarmi con un esempio.
1. l'tente clicca e si forma un menù composto da
antipasto: prosciutto di parma
primo: orecchiette coi broccoli
dessert: panna cotta
2. l'utente vuole un altro menù, ma che abbia sempre la panna cotta, per cui spunta panna cotta e ripete la ricerca
3. si forma un altro menù
antipasto: crostini toscani
primo: tortellini in brodo
dessert: panna cotta
è così? se si tre/quattro domande
1. ripete la ricerca lasciando spuntata panna cotta: altro menù con p.c.?
2. prima della ricerca spunta i tortellini e lasca p.c.: si modifica solo l'antipasto
3. toglie la spunta a p.c. e spunta crostini: menu con crostini ed altre cose?
4. spunta tutti e tre: rimane sempre lo stesso menù?

pensa a tutte le possibili combinazioni, ora tra crostini/tortellini/panna cotta mi è venuta fame. ci penso un poco e, spero, ti so dire qulacosa
 
BRAVO! SI È COSÌ!:tifoso:

allora, risposte alle 3/4 Domande:

1. Si
2. No, qui si modificano p.c. e antipasto
3. Si
4. No il menu viene nuovamante creato.

Praticamente spuntando le varie portate si bloccano e solo togliendo la spunta si sbloccano.

Grazie
 
ciao
penso che il menu sia all'interno di un form e che il pulsante Neue.Menu sia il tasto di submit,
quindi è giusta la tua idea di mettere dei check-box per fissare la portata.
mentre per la scelta del piatto metterei dei radio-button in modo che non si possa selezionare
contemporaneamente (es.) pesce e carne.
detto questo, ti do un'idea (a te poi svilupparla e vedere se funzia).
all'apertura del menu prelevi gli id delle portate che sono presentate a video
e (faccio solo un check per una sola portata)
nella parte del form
PHP:
<?php
if(!isset($_SESSION['antipasti'])){//la sessione non è valorizzata
	$ch_antipasti="";
	$va_antipasti=$id_portata; //$id_portataprelevato dalla select con cui presenti il menu
}else{//la sessione è valorizzata
	if($_SESSION['antipasti']!= ""){
		$ch_antipasti="checked";//metti a checcato il checkbox
		$va_antipasti=$_SESSION['antipasti'];//valorizzi con l'id riportato dalla sessione
	}else{
		$ch_antipasti="";
		$va_antipasti="";
	}
}
?>
<input name="antipasti" type="checkbox" value="<?php echo $va_antipasti;?>" <?php echo $ch_antipasti; ?>>
quindi il check o è checcato o no, la prima volta che si presenta non è checcato
l'utente preme il submit per cambiare il menu (con antipasti checcato o no)
<?php
$fisso_ant=$_POST['antipasti'];//il valore è vuoto o con l'id
if($fisso_ant==""){//non è stato fissato
	unset($_SESSION['antipasti']);//annullo la sessione della portata
	$f_ant="";//metto la condizione a vuota
}else{//è stato fissato e quindi contiene l'id dell'antipasto
	$_SESSION['antipasti']=$fisso_ant;//mantengo l'id per la prossima scelta
	$f_ant=" id='".$fisso_ant."' AND "; //creo una condizione fissa per la query select
}
//poi nella select di estrazione della portata

$result = mysql_query("SELECT Name FROM rezepte WHERE ".$f_ant."Art LIKE 'Vorspeisen' ORDER BY RAND() LIMIT 1 "); 
?>
quindi la query risulterà:
caso non fissato
SELECT Name FROM rezepte WHERE Art LIKE 'Vorspeisen' ORDER BY RAND() LIMIT 1

nel caso in cui l'utente ha fissato l'antipasto (es. con un id == 127) risulterà
SELECT Name FROM rezepte WHERE id='127' AND Art LIKE 'Vorspeisen' ORDER BY RAND() LIMIT 1

quindi estrae solo l'antipasto selezionato e che era già presente nel menu facendolo sembrare fisso
(attento agli spazi tra le condizioni)
analogo discorso per le altre portate e, volendo, per la scelta di pesce, carne...
come hai detto se uno seleziona tutte le portate metti l'if per tutte selezionate

PHP:
if(
($_SESSION['antipasti'] != "" && $_SESSION['piatto'] != "" && $_SESSION['dessert'] != "")
|| ($_POST['antipasti'] != "" && $_POST['piatto'] != "" && $_POST['dessert'] != "")
)
{
	unset($_SESSION['antipasti']);//annullo la sessione dell'antipasto
	unset($_POST['antipasti']);//annullo il post dell'antipasto
	$f_ant="";//metto la condizione a vuota
	unset($_SESSION['piatto']);//annullo la sessione del piatto
	unset($_POST['piatto']);//annullo il post del piatto
	$f_pia="";//metto la condizione a vuota
	unset($_SESSION['dessert']);//annullo la sessione del dessert
	unset($_POST['dessert']);//annullo il post del dessert
	$f_des="";//metto la condizione a vuota
}


un po' lungo, ma spero di essermi spiegato e di aver trovato una soluzione, altrimenti non mandarmi...

p.s.
immagino che tu conosca l'uso delle sessioni
 
Mille Grazie per il tuo aiuto! sembra tutto cosí logico...
anche se ci metteró un pochino a capire bene come va sistemato tutto.

sessioni !?!? mmmm....a quel capitolo non sono ancora arrivato..
ma se mi metto d'impegno ....forse ce la faccio.

Non voglio infastidirti piú di tanto, non voglio succhiarmi il sapere di chi ci ha messo impegno ad imparare..... la direzione basta.

GRAZIE.
 
Allora guarda se é in ordine cosí,
perché anche ceccando non si blocca niente???

Naturalmente la seconda parte non é terminata,
volevo vedere solo se funzionava.


PHP:
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<link href=style.css rel=stylesheet type=text/css>
<meta http-equiv=Content-Typecontent='text/html; charset=utf-8/>
<title>Menü Generator</title>

<body>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p><form action='menu-test.php' method='post'>




<?php
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("rezepte", $con);


if(!isset($_SESSION['Vorspeisen'])){//la sessione non è valorizzata
    $ch_Vorspeisen="";
    $va_Vorspeisen=$id_portata; //$id_portataprelevato dalla select con cui presenti il menu
}else{//la sessione è valorizzata
    if($_SESSION['Vorspeisen']!= ""){
        $ch_Vorspeisen="checked";//metti a checcato il checkbox
        $va_Vorspeisen=$_SESSION['Vorspeisen'];//valorizzi con l'id riportato dalla sessione
    }else{
        $ch_Vorspeisen="";
        $va_Vorspeisen="";
    }
}
?>
<input name="Vorspeisen" type="checkbox" value="<?php echo $va_Vorspeisen;?>" <?php echo $ch_Vorspeisen; ?>>
<?php
$fisso_ant=$_POST['Vorspeisen'];//il valore è vuoto o con l'id
if($fisso_ant==""){//non è stato fissato
    unset($_SESSION['Vorspeisen']);//annullo la sessione della portata
    $f_ant="";//metto la condizione a vuota
}else{//è stato fissato e quindi contiene l'id dell'antipasto
    $_SESSION['Vorspeisen']=$fisso_ant;//mantengo l'id per la prossima scelta
    $f_ant=" id='".$fisso_ant."' AND "; //creo una condizione fissa per la query select
}
//poi nella select di estrazione della portata

$result = mysql_query("SELECT Name FROM rezepte WHERE ".$f_ant."Art LIKE 'Vorspeisen' ORDER BY RAND() LIMIT 1 "); 


$row = mysql_fetch_assoc($result);
 

  echo "<td align='center'><h2>" . $row['Name'] . "</h2></td>";
 
 echo "</tr>"; 
 echo "<tr>";
 echo "<td align='center'><h2>****</h2></td>";
 

   
    ?>
   </tr>
  <tr>

<?php

$result2 = mysql_query("SELECT Name FROM rezepte WHERE Art LIKE '%Hautpgang' ORDER BY RAND() LIMIT 1 "); 



while($row = mysql_fetch_array($result2))
  {

 echo "<td align='center'><h2>" . $row['Name'] . "</h2></td>";
 
 echo "</tr>"; 
 echo "<tr>";
 echo "<td align='center'><h2>****</h2></td>";

 
 
    }
	
  echo "</tr>";
  echo "<tr>";


$result3 = mysql_query("SELECT Name FROM rezepte WHERE Art LIKE 'Dessert' ORDER BY RAND() LIMIT 1 "); 



while($row = mysql_fetch_array($result3))
  {

  echo "<td align='center'><h2>" . $row['Name'] . "</h2></td></tr>";
 
 

    }

?> 

<td align='center'>

 <label>
<input name=submit value=Neue.Menu type=submit> 
 </label>
</form>
</td>
</tr>
</table>
 
 </body>
"</html>

Che si fa? adesso
 
ciao
intanto manca una cosa essenziale. per funzionare le sessioni devono essere dichiarate, scrivi alla riga 1.

PHP:
<?php
if(!isset($_SESSION)){
session_start ();
}
?>
<html xmlns='http://www.w3.org/1999/xhtml'> 
<head> 
<link href=style.css rel=stylesheet type=text/css> 
<meta http-equiv=Content-Typecontent='text/html; charset=utf-8/>
eccetera.....
e riprova, comunque do un occhio allo script poi se trovo qualcosa che non va telo dico
 
Ok, sessioni inserite.(niente di nuovo) Piccola domanda ma se viene letto con il submit lo script nuovamante o meglio la pagina non si ricomincia da capo?
 
ciao
sto guardando lo script, è più complicato di quello che pensavo, abbi pazienza ci devo pensare.
il difetto è che non vorrei crearmi il db, quindi provo a mettere giu uno script poi tu devi provarlo.
vediamo se riusciamo a cavare il ragno dal buco
 
ciao
Piccola domanda ma se viene letto con il submit lo script nuovamante o meglio la pagina non si ricomincia da capo?
per quello sto utilizzando le sessioni che mantengono il valore della variabile da una pag all'altra o dopo il submit sino alla chiusura del bw
non ti prometto niente, ma forse ci sono...
 
ciao (dopo una nottata di ripensamenti) prova quste pag.
le ho divise in due perchè mi venivano meglio.
dai un occhio hai commenti che ho messo (se funzia quelli inutili toglili)

pag. menù (manca tutta la parte grafica)
PHP:
<?php
if(!isset($_SESSION)){
session_start();
}
//l'istruzione sopra deve essere utilizzata in TUTTE le pagine che richiamano le sessioni
if(isset($_POST['Submit']) && $_POST['Submit']=="Neue.Menu"){//submit cambia menu
	/*
	secondo me essendo la parte che regola le sessioni un po' lunga
	la scriverei in un'altra pagina e  farei un include
	se non ti piace l'include copia il codice della pag elabora_menu.php
	qui all'interno dell'if
	*/
	include_once "elabora_menu.php";
}//fine if premuto submit


//qui inserisci dati di connessione
//qui inizio il form************************
?>
<form action="<?php  htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post" name="provaMenu">
<?php
if(!isset($_SESSION['Vorspeisen'])){//la sessione non è valorizzata**** RIGA A
    $ch_Vorspeisen="";
	$f_Vor="";
    //$va_Vorspeisen=$id_portata; //riga da portata dopo select con if
}else{//la sessione è valorizzata 
    if($_SESSION['Vorspeisen']!= ""){ 
        $ch_Vorspeisen="checked";//metti a checcato il checkbox 
        $va_Vorspeisen=$_SESSION['Vorspeisen'];//valorizzi con l'id riportato dalla sessione
		$f_Vor=" id='".$va_Vorspeisen."' AND ";
    }else{ //o vuota
        $ch_Vorspeisen=""; 
        $va_Vorspeisen="";
		$f_Vor="";
    } 
} 
$result = mysql_query("SELECT id,Name FROM rezepte WHERE ".$f_Vor."Art LIKE 'Vorspeisen' ORDER BY RAND() LIMIT 1 ");  
$row = mysql_fetch_array($result);
if(!isset($_SESSION['Vorspeisen'])){$va_Vorspeisen=$row['id'];}//devo estrarre comunque l'id

//metti la tabella per impostare chek e nomi piatti
//con il check trasmetto se selezionato l'id del piatto
?>
<input name="Vorspeisen" type="checkbox" value="<?php echo $va_Vorspeisen; ?>"<?php echo $ch_Vorspeisen; ?>>
<?php
echo $row['Name'];//*** RIGA B
//*****************
//ripetere da RIGA A a RIGA B per primo piatto e dessert modificando i nomi delle variabili
//*****************
?>
<input name="submit" value="Neue.Menu" type="submit">
</form>

pag. di elabora_menu.php
PHP:
<?php
//se usi l'include_once NON mettere altre intestazioni a quasta pagina
//parte per l'antipasto da ripetere uguale per gli altri piatti
$fisso_ant=$_POST['Vorspeisen'];//il valore è vuoto o con l'id 
if($fisso_ant==""){//non è stato fissato 
    unset($_SESSION['Vorspeisen']);//annullo la sessione dell'antipasto 
    //$f_ant="";//metto la condizione a vuota nella pag precedente
}else{//è stato fissato e quindi contiene l'id dell'antipasto 
    $_SESSION['Vorspeisen']=$fisso_ant;//mantengo l'id per la prossima scelta 
    //$f_ant=" id='".$fisso_ant."' AND "; //creo una condizione fissa per la query select nella pag precedente
} 
/*****************************************************************
ripetere per gli altri due piatti

******************************************************************/
/* NOTA:
per fare le prove ti conviene prima mettere fisso anche la scelta carne..., poi
devi mettere anche la parte che riguarda carne, pesce...
*/
// forse l'header (o lariga echo "<meta..." ) non serve
//prova prima poi eventualmente commenti l'header 
header(location="pag_menu.php");
//se l'header di da errore sostituiscila con l'istruzione sotto
//echo "<meta http-equiv='Refresh' content='0; URL=pag_menu.php'>";
?>

sappimi dire (spero di no) gli eventuali errori che si visualizzano.
 
ciao dimenticavo
in fase di prova ti conviene separare la riga

$result = mysql_query("SELECT id,Name FROM rezepte WHERE ".$f_Vor."Art LIKE 'Vorspeisen' ORDER BY RAND() LIMIT 1 ");

in

PHP:
$query="SELECT id,Name FROM rezepte WHERE ".$f_Vor."Art LIKE 'Vorspeisen' ORDER BY RAND() LIMIT 1 ";
var_dump($query);//poi da togliere
$result = mysql_query($query);

così vedi come ti risulta la query
 
Scusa se ti sto dando dei rompicapo...

1.Allora non é obbligatorio immettere la carne e dessert per vedere se funziona? Vero?

Non mi da nessun errore ma.....

cosí comé, continua a cambiare, il fatto e che continuando a premere il submit, il check va via e lo provo a mettere ogni volta. ma non succede nulla.......

eppute ho seguito le istruzioni scritte e ho lasciato <include>
solo due volte ha funzionato su 50 ma penso sia tsato un caso.

ok io ho un altra idea ma naturalmente non so se é fattibile:

Se si crea una pagina con 3 <include>

Ognuna di questa ha una query diversa all'interno,
quando ridanno il valore vengono visualizzate le 3 portate....

ora, se si mette un check che ferma una di queste query il valore cambierá solo sulle altre 2 senza dover rileggere la pagina intera, quindi il valore della query bloccata non cabierá ma cambieranno solo le pagine singole. Che dici?
 

Discussioni simili