Header dopo un menù a tendina

di il
9 risposte

Header dopo un menù a tendina

Problema:
devo creare una pagina PHP con la quale inserire dei dati da inviare al DB. Nel form che creo, quindi ho sia delle caselle di testo che dei select, per il quale faccio una chiamata al server per estrarre i valori.

<?php
	$sqlSOC	= "SELECT Società, Idfornitore FROM anagrafica";
	$result4	= mysqli_query($conn, $sqlSOC);
	$nrigheF	= mysqli_num_rows($result4);
	if($nrigheF >= 1) {
		while($rowF = mysqli_fetch_array($result4, MYSQLI_ASSOC)) {
			$fornitore = $rowF['Società'];
			$idF 	   = $rowF['Idfornitore'];
			echo "<option value =\"$idF\">$fornitore</option>";
		}
	}
?>
Questo ECHO mi impedisce, per tanto, di posizionare l'HEADER alla fine dei comandi per ricaricare la pagina ed evitare -per tanto- il problema di buffer.
Non posso quindi evitare di mettere l'echo e non posso mettere header prima. Come posso avere entrambi funzionanti? Ovvero inviare i dati necessari al DB senza che - al refresh della pagina - mi venga inserito nuovamente un record di pari valore?


Grazie mille a tutti.

[img]
https://i.ibb.co/6npnZx6/spiegazione.jp

9 Risposte

  • Re: Header dopo un menù a tendina

    Stai effettuando il ragionamento inverso, ti spiego puoi usare l'intestazione http senza alcun output (niente BOM unicode, codice che produca output nonché html o funzioni che stampano a video il contenuto).
    Invece di fare molte volte echo puoi aggiungere il valore ad una variabile esistente.
    $a = 'hi';
    $a .= ' world';
    echo $a;//Output hi world.
    Questo aumenta però la memoria del tuo script... cioè con pochi dati funziona sempre e comunque.
    Tieni presente che per definizione di markup html si intende dalla dichiarazione del documento fino alla fine dell'elemento </html>
  • Re: Header dopo un menù a tendina

    Specifico meglio il problema. Io sto costruendo una tabellina dove vengono impilate le giacenze di magazzino di una ipotetica ditta.
    Il fine è di creare una sorta di tabella che riassuma la situazione per ogni prodotto. Ad esempio: "i chiodi sono 450 e sono stati comprati dalla ditta Giovanni SRL". Così ho creato una seconda pagina PHP per segnare i prodotti in giacenza e nel DB ho creato una nuova tabella per inserire tutte le aziende fornitrici, una sorta di anagrafica per i fornitori. Quindi non posso attribuire ad una variabile il nome del fornitore [che io non conosco], ma che lo vada a riprendere tra quelli già inseriti nella tabella dei fornitori nel DB.
    Per tanto è essenziale avere un menù a tendina con il quale scegliere l'azienda fornitrice di un prodotto, visto che io non posso inserire come variabile.
  • Re: Header dopo un menù a tendina

    Scusami non mi è chiaro cosa vuoi fare.
    Nella stessa pagina vuoi far apparire il form oppure la tabellina?
    Se la risposta è sì, il form se impostato con il nome nella select invia il valore di option, questo significa devi solo inserirlo prima del contenuto della prima pagina altrimenti stampi il contenuto normale.. il form e i relativi elementi etc.
    Se non metti echo non produrrai mai alcun output.
    
    $nonsonooutput = '';
    while($rowF = mysqli_fetch_array($result4, MYSQLI_ASSOC)) {
    			$fornitore = $rowF['Società'];
    			$idF 	   = $rowF['Idfornitore'];
    			$nonsonooutput .= "<option value =\"$idF\">$fornitore</option>";
    		}
    echo $nonsonooutput; //ora stampo a video

    Mi puoi indicare il codice della seconda pagina? Magari riesco a capire quando far stampare option oppure il risultato della seconda pagina
  • Re: Header dopo un menù a tendina

    Ho una pagina per visualizzare i dati della tabella delle rimanenze. Ovvero dove vado a richiamare il file Create.Table:

    CREAZIONE DELLA TABELLA - Pagina magazzino.php
    
    <?php
    	$tab = "dati";
    	$sql = "SELECT dati.Id, dati.Prodotto, dati.Quantità, dati.Note, dati.Data, anagrafica.Società, anagrafica.Idfornitore FROM $tab INNER JOIN anagrafica ON dati.Venditore = anagrafica.Idfornitore";
    	require('config/result.conn');
    	if($nrighe < 1) {
    		echo "la ricerca non ha prodotto risultati";
    	} else {
    		$count = 0;
    		while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    			if($count <= $nrighe) {
    				$id   		= $row['Id'];
    				$prod 	= $row['Prodotto'];
    				$quan 	= $row['Quantità'];
    				$note 	= $row['Note'];
    				$data 	= $row['Data'];
    				if(isset($row['Società'])) {
    					$soci = $row['Società'];
    					$format_data = date("d-m-Y", strtotime($data));
    					echo "<tr><td>$id</td><td>$prod</td><td>$quan</td><td>$soci</td><td>$format_data</td><td>$note</td><td><a href=\"magazzino.php?remove=$id\">rimuovi</a></td></tr>";
    					++$count;
    				} else {
    					echo "ERROR";
    				}
    			}
    		}
    	}
    	if(isset($_GET['remove'])) {
    		$idremove = $_GET['remove'];
    		$deleteSQL = "DELETE FROM $tab WHERE Id = $idremove";
    		$result3 = mysqli_query($conn, $deleteSQL);
    		if($result3) {
    			header('location: magazzino.php');
    		}
    	}
    ?>
    
    Per introdurre un nuovo record in questa tabella avevo costruito un form al termine della tabella, con tasto di invio submit, ma poi ho deciso di creare una pagina esclusiva la compilazione. Pensando che avrebbe potuto aiutare il < form action="nuovapagina.php">. Ma invece mi sbagliavo.

    INSERIMENTO DATI NELLA TABELLA - stralcio della pagina: inserimento.php
    
    <form method="POST">
    	<input type="text" name="Product" Placeholder="Prodotto" /><input type="text" name="Quantity" Placeholder="Quantità" />
    	<select name="Fornitore">
    		<?php
    			$sqlSOC		= "SELECT Società, Idfornitore FROM anagrafica";
    			$result4	= mysqli_query($conn, $sqlSOC);
    			$nrigheF	= mysqli_num_rows($result4);
    			if($nrigheF >= 1) {
    				while($rowF = mysqli_fetch_array($result4, MYSQLI_ASSOC)) {
    					$fornitore = $rowF['Società'];
    					$idF 	   = $rowF['Idfornitore'];
    					echo "<option value =\"$idF\">$fornitore</option>"; //riga incriminata di ECHO
    				}
    			}
    		?>
    	</select>
    	<select name="Giorno">
    		<?php
    			for($d = 1; $d <= 31; ++$d) {
    				echo "<option value=\"$d\">$d</option>";
    			}
    		?>
    	</select>
    	<select name="Mese">
    		<option value ="01">Gennaio</option>
    		<option value ="02">Febbraio</option>
    		<option value ="03">Marzo</option>
    		<option value ="04">Aprile</option>
    		<option value ="05">Maggio</option>
    		<option value ="06">Giugno</option>
    		<option value ="07">Luglio</option>
    		<option value ="08">Agosto</option>
    		<option value ="09">Settembre</option>
    		<option value ="10">Ottobre</option>
    		<option value ="11">Novembre</option>
    		<option value ="12">Dicembre</option>
    	</select>
    	<select name="Anno">
    		<?php
    			$currY = date("Y");
    			$currY_1 = $currY - 1;
    			$currY_2 = $currY - 2;
    			$currY_3 = $currY - 3;
    			$currY_4 = $currY - 4;
    			$currY_5 = $currY - 5;
    			$currY_6 = $currY - 6;								
    			echo "<option value =\"$currY\">$currY</option>";
    			echo "<option value =\"$currY_1\">$currY_1</option>";
    			echo "<option value =\"$currY_2\">$currY_2</option>";
    			echo "<option value =\"$currY_3\">$currY_3</option>";
    			echo "<option value =\"$currY_4\">$currY_4</option>";
    			echo "<option value =\"$currY_5\">$currY_5</option>";
    			echo "<option value =\"$currY_6\">$currY_6</option>";
    		?>
    	</select>
    	<input type="text" name="Notes" Placeholder="Note" />
    	<input type="submit" name="invio" />
    	<?php
    		require('config/insertInto.table');
    	?>
    </form>
    
    
    nella quale vado a richiamare inserimento.table:
    AQUISISCO I DATI - inserimento.table
    
    <?php
    	$tab = "dati";
    	if(isset($_POST['invio'])) {
    		$prodotto  	= $_POST['Product'];
    		$quantità  	= $_POST['Quantity'];
    		$notes     	        = $_POST['Notes'];
    		$IdForn		= $_POST['Fornitore'];
    		$d			= intval ($_POST['Giorno']);
    		$m			= intval ($_POST['Mese']);
    		$Y 			= intval ($_POST['Anno']);
    		if (is_numeric($d)) {
    			$insertdata = date('Y-m-d', mktime(0, 0, 0, $m, $d, $Y));
    			$insertSQL = "INSERT INTO $tab (Prodotto, Quantità, Note, Venditore, Data) VALUES ('$prodotto', '$quantità', '$notes', '$IdForn', '$insertdata')";
    			$result2   = mysqli_query($conn, $insertSQL);
    			if($result2) {
    				//header('location: magazzino.php'); // Questo HEADER non funziona perché ostacolato dall'ECHO.
    			}
    		} else {
    			echo "il giorno non è un numero!";
    			echo $d;
    		}
    	}
    ?>
    
    Infine ecco l'immagine della tabella, con in alto a sinistra il bottone con il link per accedere alla pagina inserisci.php oer immettere record nella tabella.
    [img]
    https://i.ibb.co/zFg2H65/spiegazione-2.jp
  • Re: Header dopo un menù a tendina

    Devi semplicemente impostare inizialmente AQUISISCO I DATI se è vero ho ricevuto i dati tramite il form altrimenti (codice else php) stampo il codice html di INSERIMENTO DATI NELLA TABELLA.
    Comunque è qualcosa di arrangiato, prenditi una tazza rilassati e pensa come riordinare.
    Ad esempio per pagina uno utilizzi $_GET potresti anche usare tale metodo per altri valori l'importante li metti prima di fare le query perché stai usando echo e poi altrimenti.
    Esempio errato:
    <?php
    $a = 'hello';
    ?>
    <html>
    <?php
    //errore 1 l'elemento html già produce output
    echo $a; //errore 2 echo stampa a video
    header(immettere il vero testo); // purtroppo i due metodi hanno prodotto output
    ?>
    Esempio corretto:
    <?php
    $a = 'ciao'; // la variabile non produce output
    $bool = true;
    if($bool) {
    header(immettere il vero testo); //deve sempre essere prima di qualsiasi contenuto
    } else {
    echo 'codice html';
    }
    ?>
    Anche se il parser php non ti sta segnalando l'errore o comunque te lo dice per righe successive a echo purtroppo devi fare comunque come il mio esempio corretto altrimenti su alcuni browser (tipo Iphone) potrebbe non funzionare e visualizzi l'errore .

    CREAZIONE DELLA TABELLA - Pagina magazzino.php
    <?php
    	if(isset($_GET['remove'])) {
    		$idremove = $_GET['remove'];
    		$deleteSQL = "DELETE FROM $tab WHERE Id = $idremove";
    		$result3 = mysqli_query($conn, $deleteSQL); //Mi occorre valorizzare solamente $conn tutti gli altri dati potrebbero portare ad errori se non gestiti correttamente
    		if($result3) { //Devo assicurarmi che header sia sempre al primo posto prima di ogni output 
    			header('location: magazzino.php');
    		}
    	} else {
    	$tab = "dati";
    	$sql = "SELECT dati.Id, dati.Prodotto, dati.Quantità, dati.Note, dati.Data, anagrafica.Società, anagrafica.Idfornitore FROM $tab INNER JOIN anagrafica ON dati.Venditore = anagrafica.Idfornitore";
    	require('config/result.conn');
    	if($nrighe < 1) {
    		echo "la ricerca non ha prodotto risultati";
    	} else {
    		$count = 0;
    		while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    			if($count <= $nrighe) {
    				$id   		= $row['Id'];
    				$prod 	= $row['Prodotto'];
    				$quan 	= $row['Quantità'];
    				$note 	= $row['Note'];
    				$data 	= $row['Data'];
    				if(isset($row['Società'])) {
    					$soci = $row['Società'];
    					$format_data = date("d-m-Y", strtotime($data));
    					echo "<tr><td>$id</td><td>$prod</td><td>$quan</td><td>$soci</td><td>$format_data</td><td>$note</td><td><a href=\"magazzino.php?remove=$id\">rimuovi</a></td></tr>";
    					++$count;
    				} else {
    					echo "ERROR";
    				}
    			}
    		}
    	}
            }
    ?>
  • Re: Header dopo un menù a tendina

    Grazie mille per la risposta. Mi ha aiutato parecchio a sistemare il mio codice, che ora funziona alla perfezione. Nel caso servisse a qualcuno che - come me - è alle prime armi e non sa come risolvere tale problema lascio il mio elaborato.

    PAGINA ELENCO DELLE RIMANENZE CON TABELLA
    
    <?php
    	function createTab() {
    		require_once('config/config.conn');
    		if(isset($_GET['remove'])) {
    			$remove = $_GET['remove'];
    			echo $remove;
    		}
    		if(isset($remove)) {
    			$idremove = $_GET['remove'];
    			$deleteSQL = "DELETE FROM $tab WHERE Id = $idremove";
    			$result3 = mysqli_query($conn, $deleteSQL);
    			if($result3) {
    				header('location: magazzino.php');
    			}
    		} else {
    			$tab = "dati";
    			$sql = "SELECT dati.Id, dati.Prodotto, dati.Quantità, dati.Note, dati.Data, anagrafica.Società, anagrafica.Idfornitore FROM $tab INNER JOIN anagrafica ON dati.Venditore = anagrafica.Idfornitore";
    			$result = mysqli_query($conn, $sql);
    			$nrighe = mysqli_num_rows($result);
    			if($nrighe < 1) {
    				echo "la ricerca non ha prodotto risultati";
    			} else {
    				$count = 0;
    				while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    					if($count <= $nrighe) {
    						$id   			= $row['Id'];
    						$prod 			= $row['Prodotto'];
    						$quan 			= $row['Quantità'];
    						$note 			= $row['Note'];
    						$data 			= $row['Data'];
    						if(isset($row['Società'])) {
    							$soci = $row['Società'];
    							$format_data = date("d-m-Y", strtotime($data));
    							echo "<tr><td>$id</td><td>$prod</td><td>$quan</td><td>$soci</td><td>$format_data</td><td>$note</td><td><a href=\"magazzino.php?remove=$id\">rimuovi</a></td></tr>";
    							++$count;
    						} else {
    							echo "ERROR";
    						}
    					}
    				}
    			}		
    		}
    	$conn->close();
    	}
    ?>
    <html>
    	<head>
    		<link rel="stylesheet" href="css/style.css">
    		<title>magazzino</title>
    	</head>
    	<body>
    		<?php
    			require('header.php');
    		?>
    		<div id="main">
    			<div class="centre">
    				<div class="TM01">
    					<p>
    						<a href="inserzionedati.php">Aggiungi</a>
    					</p>
    					<table class="Mag01">
    						<tr><th>N°</th><th>Prodotto</th><th>Quantità</th><th>Venditore</th><th>Data</th><th>Note</th></tr>
    						<?php
    							createTab();
    						?>
    					</table>
    				</div>
    				<div class="InM01">
    
    				</div>
    			</div>
    		</div>
    	</body>
    	<?php
    
    	?>
    </html>
    
    PAGINA DI INSERIIMENTO DATI
    
    <?php
    	function insertINTO() {
    		require_once('config/config.conn');
    		if(isset($_POST['invio'])) {
    			$prodotto  	= $_POST['Product'];
    			$quantità  	= $_POST['Quantity'];
    			$notes     	= $_POST['Notes'];
    			$IdForn		= $_POST['Fornitore'];
    			$d			= intval ($_POST['Giorno']);
    			$m			= intval ($_POST['Mese']);
    			$Y 			= intval ($_POST['Anno']);
    			if (is_numeric($d)) {
    				$insertdata = date('Y-m-d', mktime(0, 0, 0, $m, $d, $Y));
    				$insertSQL = "INSERT INTO $tab (Prodotto, Quantità, Note, Venditore, Data) VALUES ('$prodotto', '$quantità', '$notes', '$IdForn', '$insertdata')";
    				$result2   = mysqli_query($conn, $insertSQL);
    				if($result2) {
    					header('location: magazzino.php');
    				}
    			} else {
    				echo "il giorno non è un numero!";
    				echo $d;
    			}
    		}
    		$conn->close();
    	}
    ?>
    <html>	
    	<head>
    		<?php
    			require('config/config.conn');	
    		?>
    		<link rel="stylesheet" href="css/style.css">
    		<title>magazzino</title>
    	</head>
    	<body>
    		<?php
    			require('header.php');
    		?>
    		<div id="main">
    			<div class="centre">		
    				<form method="POST">
    					<input type="text" name="Product" Placeholder="Prodotto" /><input type="text" name="Quantity" Placeholder="Quantità" />
    					<select name="Fornitore">
    						<?php
    							$sqlSOC		= "SELECT Società, Idfornitore FROM anagrafica";
    							$result4	= mysqli_query($conn, $sqlSOC);
    							$nrigheF	= mysqli_num_rows($result4);
    							if($nrigheF >= 1) {
    								while($rowF = mysqli_fetch_array($result4, MYSQLI_ASSOC)) {
    									$fornitore = $rowF['Società'];
    									$idF 	   = $rowF['Idfornitore'];
    									echo "<option value =\"$idF\">$fornitore</option>";
    								}
    							}
    						?>
    					</select>
    					<select name="Giorno">
    						<?php
    							for($d = 1; $d <= 31; ++$d) {
    								echo "<option value=\"$d\">$d</option>";
    							}
    						?>
    					</select>
    					<select name="Mese">
    						<option value ="01">Gennaio</option>
    						<option value ="02">Febbraio</option>
    						<option value ="03">Marzo</option>
    						<option value ="04">Aprile</option>
    						<option value ="05">Maggio</option>
    						<option value ="06">Giugno</option>
    						<option value ="07">Luglio</option>
    						<option value ="08">Agosto</option>
    						<option value ="09">Settembre</option>
    						<option value ="10">Ottobre</option>
    						<option value ="11">Novembre</option>
    						<option value ="12">Dicembre</option>
    					</select>
    					<select name="Anno">
    						<?php
    							$currY = date("Y");
    							$currY_1 = $currY - 1;
    							$currY_2 = $currY - 2;
    							$currY_3 = $currY - 3;
    							$currY_4 = $currY - 4;
    							$currY_5 = $currY - 5;
    							$currY_6 = $currY - 6;								
    							echo "<option value =\"$currY\">$currY</option>";
    							echo "<option value =\"$currY_1\">$currY_1</option>";
    							echo "<option value =\"$currY_2\">$currY_2</option>";
    							echo "<option value =\"$currY_3\">$currY_3</option>";
    							echo "<option value =\"$currY_4\">$currY_4</option>";
    							echo "<option value =\"$currY_5\">$currY_5</option>";
    							echo "<option value =\"$currY_6\">$currY_6</option>";
    						?>
    					</select>
    					<input type="text" name="Notes" Placeholder="Note" />
    					<input type="submit" name="invio" />
    					<?php
    						require('config/insertInto.table');
    					?>
    				</form>
    			</div>	
    		</div>		
    	</body>
    </html>
    
    in breve cosa ho fatto?
    Ho spostato interamente il mio codice prima di tutto l'HTML e poi ho lasciato la funzione di selezione del fornitore nell'HTML. Anche se - pensavo - non avesse senso perché il valore gli viene dato dopo. Ma pare funzionare così.
    Grazie ancora.
  • Re: Header dopo un menù a tendina

    Ci sei quasi ma ancora produci output e usare una funzione non evita il problema.... non puoi utilizzare tag html se usi Location anche se non vedi errori poiché sai non devi mai produrre output... mai significa mai senza alcuna eccezione.
    <?php
    require_once('config/config.conn'); //Scope global, visibile in tutto lo script
    		if(isset($_GET['remove'])) {
    			$idremove = $_GET['remove'];
    			$deleteSQL = "DELETE FROM $tab WHERE Id = $idremove";
    			$result3 = mysqli_query($conn, $deleteSQL);
    			if($result3) {
    				header('location: magazzino.php');
    				echo $idremove; //ritorno stringa
    			}
    		} else {
    		$html = '<html>
    	<head>
    		<link rel="stylesheet" href="css/style.css">
    		<title>magazzino</title>
    	</head>
    	<body>';
    	echo $html;
    			require('header.php');
    $html .= '		<div id="main">
    			<div class="centre">
    				<div class="TM01">
    					<p>
    						<a href="inserzionedati.php">Aggiungi</a>
    					</p>
    					<table class="Mag01">
    						<tr><th>N°</th><th>Prodotto</th><th>Quantità</th><th>Venditore</th><th>Data</th><th>Note</th></tr>';
    			$tab = "dati";
    			$sql = "SELECT dati.Id, dati.Prodotto, dati.Quantità, dati.Note, dati.Data, anagrafica.Società, anagrafica.Idfornitore FROM $tab INNER JOIN anagrafica ON dati.Venditore = anagrafica.Idfornitore";
    			$result = mysqli_query($conn, $sql);
    			$nrighe = mysqli_num_rows($result);
    			if($nrighe < 1) {
    				echo "la ricerca non ha prodotto risultati";
    			} else {
    				$count = 0;
    				while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    					if($count <= $nrighe) {
    						$id   			= $row['Id'];
    						$prod 			= $row['Prodotto'];
    						$quan 			= $row['Quantità'];
    						$note 			= $row['Note'];
    						$data 			= $row['Data'];
    						if(isset($row['Società'])) {
    							$soci = $row['Società'];
    							$format_data = date("d-m-Y", strtotime($data));
    							echo "<tr><td>$id</td><td>$prod</td><td>$quan</td><td>$soci</td><td>$format_data</td><td>$note</td><td><a href=\"magazzino.php?remove=$id\">rimuovi</a></td></tr>";
    							++$count;
    						} else {
    							echo "ERROR";
    						}
    					}
    				$conn->close();
    				}
    			}		
    		$html = '?>
    					</table>
    				</div>
    				<div class="InM01">
    
    				</div>
    			</div>
    		</div>
    	</body>
    </html>';
    echo $html;
    		}
    ?>
    Risolto questo puoi migliorare le prestazioni del tuo script, nel caso di redirect non ti occorre continuare con l'interazione della pagina corrente (non devi usare la funzione di selezione del fornitore nell'HTML poiché deve solo essere visibile il tuo header Location).
    Codice editato se ho rispettato le parentesi dovrebbe essere così.
  • Re: Header dopo un menù a tendina

    Sì, scusa quel ECHO è un refuso che mi ero scordato di togliere. L'ho utilizzato perché mi dava problema con il remove e controllavo se mi prendeva il valore in GET. Ovviamente l'ho già rimossa.
  • Re: Header dopo un menù a tendina

    Ho dato una sistemata spero sia di aiuto
Devi accedere o registrarti per scrivere nel forum
9 risposte