problema con ciclo foreach per estrarre dati da un database

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
ho un problema con una funzione che mi permetta di estrarre dati da un database. Infatti ho la seguente funzione:

PHP:
function campo ($id_iti) {
		if ($id_iti == "") {$sql = "SELECT * FROM tab";}
		else {$sql = "SELECT * FROM tab WHERE valore LIKE '{$id_iti}'";}
		$iti = mysql_query($sql) or die ("Rilevato un errore");
			if(@mysql_num_rows($iti) < 0) {echo "Nessun risultato";}
				$it = mysql_fetch_assoc($iti);
					foreach ($it as $i => $t) {
							$it[$i] = stripslashes($t);											
							return $it;}
								mysql_close($link);
					}
ora ad un certo punto richiamo la funzione per stampare un elenco estratto da un campo del database
PHP:
$v = campo ("");
echo "{$v['elemento']}";
Il mio problema è che non stampa tutti i campi ma solo il primo campo. Non si genera il ciclo while, qualcuno mi può aiutare a capire dove sta il problema?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
ciao, la funzionedovrebbe restiturti un array che dovrai ciclare a sua volta
PHP:
$v = campo("");
foreach ($v as $value) {
    echo $value;
}
edit
dovrai anche modificare la funzione piu o meno cosi
PHP:
<?php

function campo($id_iti) {
    if ($id_iti == "") {
        $sql = "SELECT * FROM tab";
    } else {
        $sql = "SELECT * FROM tab WHERE valore LIKE '{$id_iti}'";
    }
    $iti = mysql_query($sql) or die("Rilevato un errore");
    if (@mysql_num_rows($iti) < 0) {
        echo "Nessun risultato";
    }
    $it = mysql_fetch_assoc($iti);

    mysql_close($link);

    return $it;
}
?>
 
Ultima modifica:

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
:eek: Ho fatto un errore, ho detto campo al posto di record!
Il mio intento è quello di estrarre tutti i record di un unico campo.
La funzione così, mi fa estrarre tutti i campi dell'ultimo record :eek::eek:
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
ancora non capisco, in ogni caso mettendo il return all interno del foreach interrompi il ciclo alla prima iterazione
forse dovresti metterlo a fine ciclo
PHP:
foreach ($it as $i => $t) {
    $it[$i] = stripslashes($t);
}
mysql_close($link);
return $it;
 

marino51

Utente Attivo
28 Feb 2013
2.927
166
63
Lombardia
nella "return $it;}" tu restituisci il "pacco" delle informazioni lette, non la singola riga $t, sbaglio ?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
si la funzione restituisce un array che dovra essere letto con un foreach
PHP:
$v = campo("");
foreach ($v as $value) {
    echo $value;
}
 

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
nulla da fare. Anche mettendo il return fuori dal foreach non ottengo il risultato sperato
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
prova una cosa del genere, l'ho sognata stanotte e al massimo non funzia

PHP:
<?php
//.....
function campo($id_iti) {
    if ($id_iti == "") {
        $sql = "SELECT * FROM tab";
    } else {
        $sql = "SELECT * FROM tab WHERE valore LIKE '{$id_iti}'";
    }
    $iti = mysql_query($sql);// or die("Rilevato un errore");
	if(!$iti || mysql_num_rows($iti) == 0){//se dai minore di 0 se non hai record li cerca ugualmente
        return false;
    }else{
		$record=1;//parto da uno perche i recordo dovrebbero partire da uno
		while($it = mysql_fetch_assoc($iti)){
			foreach($it as $campo => $valore){
				$campi[$record][$campo]=stripslashes($valore);
				$record++;
			}
		}
	}
    return $campi;
}//fine function
//.........
$mostra=campo($id);//da dove viene il valore di $id devi saperlo tu
if($mostra != false){
	echo "<table>";
	foreach($mostra as $record => $campo){
		echo "<tr>";
		foreach($campo as $c => $valore){
			echo "<td>$valore</td>":
		}
		echo "</tr>";
	}
	echo "</table>";
}else{
	echo "richiesta non soddisfatta";
}

//......
?>
 

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
ciao
prova una cosa del genere, l'ho sognata stanotte e al massimo non funzia

PHP:
<?php
//.....
function campo($id_iti) {
    if ($id_iti == "") {
        $sql = "SELECT * FROM tab";
    } else {
        $sql = "SELECT * FROM tab WHERE valore LIKE '{$id_iti}'";
    }
    $iti = mysql_query($sql);// or die("Rilevato un errore");
	if(!$iti || mysql_num_rows($iti) == 0){//se dai minore di 0 se non hai record li cerca ugualmente
        return false;
    }else{
		$record=1;//parto da uno perche i recordo dovrebbero partire da uno
		while($it = mysql_fetch_assoc($iti)){
			foreach($it as $campo => $valore){
				$campi[$record][$campo]=stripslashes($valore);
				$record++;
			}
		}
	}
    return $campi;
}//fine function
//.........
$mostra=campo($id);//da dove viene il valore di $id devi saperlo tu
if($mostra != false){
	echo "<table>";
	foreach($mostra as $record => $campo){
		echo "<tr>";
		foreach($campo as $c => $valore){
			echo "<td>$valore</td>":
		}
		echo "</tr>";
	}
	echo "</table>";
}else{
	echo "richiesta non soddisfatta";
}

//......
?>

Nel codice c'è un errore, ci sono due punti al posto di un punto e virgola
PHP:
echo "<td>$valore</td>":
va corretto con
PHP:
echo "<td>$valore</td>":
Questa soluzione può andar bene, l'unica cosa che mi stampa tutti i campi, mentre io desidero estrarre solo un campo, ora mi studio bene foreach e cerco di adattarlo. Inoltre io utilizzo un elenco puntato e non la tabella
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
al posto di table ul li.
poi per estrarre solo un campo specifico nella select al posto del * metti il nome del campo, es.

PHP:
 $sql = "SELECT nome_utente FROM tab WHERE valore LIKE '{$id_iti}'";
p.s.
; e : sono vicini e buttando giù il codice di getto è facile sbagliare
 

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
Utilizzo la funzione perché a volte ho bisogno di un solo campo, e a volte di tutti i campi, voglio evitare di ripetere la stessa SELECT più volte. Posso pensare di utilizzare i campi come argomenti della funzione e forse risolvo. Grazie dell'aiuto
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
potresti fare così
PHP:
<?php
function campo ($id_iti, $campo) {
	if($campo ==""){
		$campo="*";
	}
    if ($id_iti == "") {
        $sql = "SELECT $campo FROM tab";
    } else {
        $sql = "SELECT $campo FROM tab WHERE valore LIKE '{$id_iti}'";
    }
	//ecc.....
}
se invii con un form il nome del campo puoi avere o tutti o un campo solo
 

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
Utilizzando foreach come si fa a formattare un campo in un modo ed un altro in un modo diverso? Cioè
Utilizzo:
PHP:
function tab($campi,$id_iti) {
	require 'connessione.php';
    if ($id_iti == "") {
        $sql = "SELECT $campi FROM tab";
    } else {
        $sql = "SELECT $campi FROM tab WHERE id_itinerari LIKE '{$id_iti}'";
    }
    $iti = mysql_query($sql) or die("Rilevato un errore");
	if(!$iti || mysql_num_rows($iti) == 0){//verifica se ci sono risultati 
        return false; 
    } else { 
        $record=1;//parto da uno perche i recordo dovrebbero partire da uno 
        while($it = mysql_fetch_assoc($iti)){ 
            foreach($it as $campo => $valore){ 
                $c[$record][$campo]=stripslashes($valore); 
                $record++; 
            } 
        }     
    } 
return $c; 
}
e poi

PHP:
		 <?php	 	
			$mostra=tab("*","");
			if($mostra != false){ 
				foreach($mostra as $record => $campo){ 
					foreach($campo as $c => $valore){ 
						echo "<h2>$valore</h2>"; 
					} 
				} 
			}else{ 
				echo "richiesta non soddisfatta"; 
			} 
		 ?>
Ora, se io ho bisogno di mettere il campo2 come titolo e il campo3 come paragrafo non posso farlo?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
se es invii il nome/i del campo con un form potresti scrivere
nome, cognome
per cui $campo assume il valore "nome, cognome"
potrebbe essere anche risolvibile con una <select> multipla dove elenchi i nomi dei campi (forse sarebbe meglio che scriverli onde evitare errori).
ci penso e (forse) ti so dire
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
non so come fai tu a fare la selezione sia dei campi che dell'id, ma facendo un form con una select multipla in cui metti come
valori dell'option (il primo vuoto) i nomi dei campi puoi selezionare un unico campo o più di uno con la combinazione che preferisci (ricorda nella select multipla la sel multipla si fa con il ctrl clik)
prova e sappimi dire
PHP:
<?php
function tab($campi,$id_iti) {
    require_once 'connessione.php';
    if ($id_iti == ""){
        $wh = "";
    } else {
        $wh = "WHERE id_itinerari LIKE '{$id_iti}'";
    }
	if($campi==""){
		$campi=="*";
	}else{
		$campi=$campi=implode(",",$campi);
	}
	var_dump($wh); echo "<br>";// questo poi lo togli
	var_dump($campi); echo "<br>";// questo poi lo togli
	$sql="SELECT $campi FROM tab $wh";
	var_dump($ql); echo "<br>";// questo poi lo togli
    $iti = mysql_query($sql);// or die("Rilevato un errore");
    if(!$iti || mysql_num_rows($iti) == 0){//verifica se ci sono risultati 
        return false; 
    } else { 
        $record=1;//parto da uno perche i record dovrebbero partire da uno 
        while($it = mysql_fetch_assoc($iti)){ 
            foreach($it as $campo => $valore){ 
                $c[$record][$campo]=stripslashes($valore); 
                $record++; 
            } 
        }     
    } 
	return $c; 
} //fine function

if(isset($_POST['invia'])){
	$mostra=tab($_POST['campi'],125);//non so come richiami la variabile $id_iti, da un GET? sessione? o da un post eventualmente da mettere nello stesso form
	if($mostra != false){
		foreach($mostra as $record => $campo){ 
			foreach($campo as $c => $valore){ 
				echo "<h2>$valore</h2>"; 
			} 
         }  
	}else{
		echo "richiesta non soddisfatta<br>";
	}
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<select name="campi[]" multiple size="3"><!-- il nome deve essere un array per la sel multipla da fare con ctrl-->
  <option value="">tutti</option>
  <option value="campo_1">campo 1</option><!-- elenchi i nomi dei campi della tabella-->
  <option value="campo_2">campo 2</option>
  <option value="campo_3">campo 2</option>
  <option value="campo_4">campo 4</option>
</select><br>
<input name="invia" type="submit" id="invia" value="invia">
</form>
</body>
</html>
se per caso non conosci il nome dei campi ti posto il modo per ricavarli
 
Ultima modifica:

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
Nessun form. Ciò che io praticamente devo fare è: Ho una home page dove scelgo di visualizzare tutti gli itinerari, allora clicco su un link e visualizzo la pagina1 con tutti gli itinerari (non passo nessun id quindi
PHP:
$id_iti=""
) e i campi da visualizzare sono tutti (
PHP:
SELECT * FROM tab
).
Nella pagina1 seleziono un solo itinerario e vado alla pagina2 (passo l'id tramite GET e quindi $id_it assume un valore, di conseguenza SELECT * FROM table WHERE id LIKE $id_iti).
La funzione ora mi permette di ottenere ciò che voglio nella pagina1, ma ho due problemi. 1) quando visualizzo tutti i campi di tutti gli itinerari ho necessità di isolare il campo id per passarlo tramite GET alla pagina2 e 2) ho il problema di formattare la pagina1 perchè non distinguo i campi.

Ora ho visto solo sommariamente la funzione dell'ultimo post, cerco di capirlo e se riesco a distinguere i vari campi a fine funzione ho risolto.
Studio :book: e ti faccio sapere
 

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
Sono ritornata al punto di partenza.

Ho cercato di modificare il codice, perché ciò che io ho bisogno, è di ottenere i campi singolarmente, sia per formattare il titolo diversamente dal paragrafo e sia per passare alla pagina successiva tramite GET. Il problema non sono gli argomenti della funzione :(

Alla fine ho messo su questa funzione:

PHP:
function itinerari($id_iti) {
    require_once 'connessione.php';
    if ($id_iti == ""){
        $wh = "";
    } else {
        $wh = "WHERE id_itinerari LIKE '{$id_iti}'";
    }
    $itinerari="SELECT * FROM itinerari $wh";
	$iti = mysql_query($itinerari);// or die("Rilevato un errore");
    if(!$iti || mysql_num_rows($iti) == 0){//verifica se ci sono risultati 
        return false; 
    } else {
		$record=1;//parto da uno perche i record dovrebbero partire da uno 
		while ($i = mysql_fetch_array($iti))
			{
				$id = $i['id_itinerari'];
				$itinerario = $i['itinerario'];
				$text = $i['descrizione'];
         	    $record++; 
			}
		} 		 
$arr = array($id,$itinerario,$text);
$c = implode(",", $arr);    		
return $c;
}
che viene richiamata in questo modo:

PHP:
		 <?php	 	
			$mostra=itinerari("");
			if($mostra != false){
				$campo = explode(",",$mostra);
				echo "<h1>$campo[1]</h1>";
				echo "<p>$campo[2]</p>";
			}else{ 
				echo "richiesta non soddisfatta"; 
			}			
		 ?>
Ora, ciò che io ottengo mi va bene, l'unico problema è che non funziona il ciclo WHILE, di conseguenza estraggo solo l'ultimo record :(

Forse ho difficoltà a farmi capire. U
una volta che ottengo tutti i record e non solo un solo record, la questione è risolta :confused:
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
devi fare un array di array, come stai facendo tu è logico che ti dia solo l'ultimo
es, su un valore
$id = $i['id_itinerari'];
al primo giro del while assune il prino valore
al secondo sovrascive il primo assumendo il secondo
ecc....
l'ultimo sovrascrive ed è quello che risulta
per quello avevo messo il contatore
$id[$record] = $i['id_itinerari'];
 

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
ciao,
ok, allora cerco di capire ogni minimo passo per venirne fuori.
Ho modificato la funzione ed ora è cosi:

PHP:
function itinerari($id_iti) {
    require_once 'connessione.php';
    if ($id_iti == ""){
        $wh = "";
    } else {
        $wh = "WHERE id_itinerari LIKE '{$id_iti}'";
    }
    $itinerari="SELECT * FROM itinerari $wh";
	$iti = mysql_query($itinerari);// or die("Rilevato un errore");
    if(!$iti || mysql_num_rows($iti) == 0){//verifica se ci sono risultati 
        return false; 
    } else {
		$record=1;//parto da uno perche i record dovrebbero partire da uno 
		while ($i = mysql_fetch_array($iti))
			{
				$id[$record] = $i['id_itinerari'];
				$itinerario[$record] = $i['itinerario'];
				$text[$record] = $i['descrizione'];
         	    $record++; 
			}
		} 		    		
$arr = array($id,$itinerario,$text);		// ottengo tre array che unisco
$c = implode(",", $arr);    				
return $c;									// unica array di tre $id,$itinerario,$text
}
Se ho capito bene, la funzione dovrebbe andar bene così. Ora mi trovo una array composta da tre diverse array dalle quali estrarre i valori, e qui ho più difficoltà
HO provato così:
PHP:
			$campo = itinerari("");    //richiamo la funzione per stampare tutti i record
		    /* $campo è un array di tre $id,$itinerario,$text. */
			$c = explode(",",$campo);
			$id = $c[0];
			$title = $c[1];
			$text = $c[2];
a questo punto ho le tre array separatamente, ma come mi ricavo i singoli valori?
Ho provato con foreach ma non ottengo risultati
 

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
Non riesco ad uscirmene :crying:

Ho riletto tutti i post e suggerimenti, ma mi manca l'ultimo passaggio. Come posso formattare diversamente i campi?
Se imposto la funzione cosi:
PHP:
function itinerari($id_iti) {
    require_once 'connessione.php';
    if ($id_iti == ""){
        $wh = "";
    } else {
        $wh = "WHERE id_itinerari LIKE '{$id_iti}'";
    }
    $itinerari="SELECT * FROM itinerari $wh";
	$iti = mysql_query($itinerari);// or die("Rilevato un errore");
    if(!$iti || mysql_num_rows($iti) == 0){//verifica se ci sono risultati 
        return false; 
    } else {
        $record=1;//parto da uno perche i record dovrebbero partire da uno 
        while($it = mysql_fetch_assoc($iti)){ 
            foreach($it as $campo => $valore){ 
                $campi[$record][$campo]=stripslashes($valore); 
                $record++; 
            } 
        } 
    } 
    return $campi;	    		

}
ed la richiamo in questo modo:

PHP:
		 <?php
			$c = itinerari("");    //richiamo la funzione stampo tutti i record
			if($c != false){ 
					foreach($c as $record => $campo){ 
						foreach($campo as $it => $v){ 
							echo "<h1>$v</h1>"; 
						} 
					} 
			}else{ 
				echo "richiesta non soddisfatta"; 
					} 
?>
ottengo come risultato ciò che desidero, ma in unico blocco

RECORD 1) CAMPO1 CAMPO2 CAMPO3
RECORD 2) CAMPO1 CAMPO2 CAMPO3
RECORD 3) CAMPO1 CAMPO2 CAMPO3
RECORD 4) CAMPO1 CAMPO2 CAMPO3
................................

Se, però, voglio formattare in modo diverso i campi non riesco a farlo

<h1>campo2</h1>
<p>campo3</p>

perchè ottengo il risultato in un unico blocco

Credo che la soluzione sta nell'impostare il foreach ma come?

PS. Volevo cancellare il post prima di questo perchè inutile, ma non riesco a farlo