ciclo foreach che non funziona

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
Ho la funzione seguente:
PHP:
function musei ($codcom) 
{
	require 'connessione.php';
	$tab ="SELECT * FROM tab WHERE campo LIKE '{$campo}'";
	$mus = mysql_query("$tab",$link) or die(sprintf('Errore del database: "%s".', mysql_error()));
		if(@mysql_num_rows($mus) > 0) {
			$ms = mysql_fetch_assoc($mus);			
               foreach ($ms as $k => $v) {
                              $ms[$k] = stripslashes($v);
               return $ms; 
											}
										}
			else {echo "<li>Nessun elemento presente</li>";}
               exit;
               mysql_close($link);		
}

che viene richiamata

PHP:
	$t = musei ($codice);
	echo "<li><a href='pag.php?p=01&codmuseo={$tab['cod']}' title='{$tab['nome']}' />{$tab['nome']}</a></li>";

Il mio problema è che non funziona il ciclo foreach. I dati vengono estratti da un database e invece di avere la stampa di tutti i file che soddisfano la condizione SELECT WHERE ho la stampa solo del primo file. Dove sbaglio?
 
ciao
a parte che capisco poco quello che hai fatto, anche se penso di aver capito quello che vorresti fare.
fai una funzione che riceve un valore ($codcom) e poi nella funzione non lo usi.
nel like vedo la variabile $campo , da dove salta fuori?
se al mysql_fetch_assoc non associ un ciclo while ti estrrà sempre solo un record, il primo che soddisfa il like.
sensa contare che usi la stessa varabile per fare due cose diverse.
spiega meglio quello che deve risultare

dimenticavo: la tabella ha solo due campi? perche se sono più di due dovrebbe farti un casino.
 
Quello che voglio fare è: Ho un sito dove più volte utilizzo la stessa SELECT così ho pensato di realizzare una funzione che poi richiamo ogni volta che ho necessità di fare la SELECT.
Nella funzione ho fatto un errore la variabile $campo è la stessa di $codcom. Non ho capito che significa che "uso la stessa variabile per fare due cose diverse" quali?
 
ciao
1) la variabile (non so come si chiamano i campi della tua tabella quindi metto nomi a caso) es.
id | nome
con la
$ms = mysql_fetch_assoc($mus)
crei l'array $mus che sarà es.
$mus=array('id'=>37, 'nome'=>'pinco')
poi la cicli (un'unica volta poi di dico perchè)
al primo e unico ciclo avrai
$k = id e $v = 37
per cui riottieni di nuovo
$mus['id']=37
2) vedo che usi il like, quindi potresti estrarre più di un record
ma con $ms = mysql_fetch_assoc($mus) estrai un record solamente (il primo che soddisfa il like), ma questa potrebbe essere una tua scelta
3) e ora veniamo al perche cicli una volta sola
hai messo il return $ms dentro il ciclo quindi appena lo script trova il return si interrompe restituendo il valore ottenuto dal primo ciclo
mentre, da quello che capisco tu vuoi ottenere due valori $tab['cod'] e $tab['nome'] es. se provi questa funzione ti accorgerai che ottieni sempre 1
PHP:
<?php
function prova(){
	for($k=1; $k<10000;$k++){
		return $k;//interrompe
	}
}
echo prova();
?>
dimenticavo anche li sembra un errore? $t = musei ($codice) , forse intendevi $tab?
sempre che non abbia capito male (estraendo sempre un solo record) potresti provare a modificare la function così
PHP:
<?php
function musei ($campo){
    require_once 'connessione.php';
    $tab ="SELECT * FROM tab WHERE campo LIKE '{$campo}'";
    $mus = mysql_query("$tab",$link) or die(sprintf('Errore del database: "%s".', mysql_error()));
	if(mysql_num_rows($mus) > 0) {
		$ms = mysql_fetch_assoc($mus);
		$ms=array_map("stripslashes",$ms);          
        return $ms; 
	}else {
		echo "<li>Nessun elemento presente</li>";
	}
	exit;
	mysql_close($link);        
}
?>
se invece vuoi estrarre più record devi modificare un po' il tutto, eventualmente ti posto come farei io
 
Devo estrarre più di un record. Tutti i record del database che soddisfano la condizione di Like.
Sono riuscita a risolverlo in questo modo:

PHP:
<?php 
function musei ($campo){ 
    require_once 'connessione.php'; 
    $tab ="SELECT * FROM tab WHERE campo LIKE '{$campo}'"; 
    $mus = mysql_query("$tab",$link) or die(sprintf('Errore del database: "%s".', mysql_error())); 
    if(mysql_num_rows($mus) > 0) { 
	   $m=0; //parto da uno perchè i record dovrebbero partire da uno
	    while ($array[$m++] = mysql_fetch_array($mus)) {}
            return $array; 
    }else { 
        echo "<li>Nessun elemento presente</li>"; 
    } 
    exit; 
    mysql_close($link);         
} 
?>

che poi richiamo in questo modo:

PHP:
<?php
	$mus = musei ($campo);
       if($mus != false){ 
                foreach($mus as $rm => $cm){
	if($cm['id'] == "") {break;} 				
	else 
		{echo "<li>
				{$cm['nome']}
			  </li>";
        }          
					}  
					}
 ?>

Aggiungo la riga
if($cm['id'] == "") {break;} perchè altrimenti ho la stampa di tutti i record che soddisfano la condizione LIKE più un record vuoto. Allora ho impostato il controllo su id per verificare se c'è un ulteriore record da stampare
 
Ultima modifica di un moderatore:
ciao
sarà che a me non piacciono le funzioni che mostrano qualcosa, proverei a fare in questo modo
PHP:
<?php
function musei ($campo){
    require_once 'connessione.php';//questo lo metterei fuori
    $tab ="SELECT cod, nome FROM tab WHERE campo LIKE '{$campo}'";//indicherei quello che devo estrarre
    //cioè estraggo solo i campi che mi servono
	$mus = mysql_query("$tab",$link);
	if($mus){
		if(mysql_num_rows($mus) > 0) {
			while($ms = mysql_fetch_assoc($mus)){
				$m[]=array_map("stripslashes",$ms);
				/* $m risulta es.
				$m[0]=array('cod'=>'333','nome'=>'pinco')
				$m[1]=array('cod'=>'444','nome'=>'pallino')
				ecc...
			*/
			}        
        	return $m; 
		}else{
			return "<li>Nessun elemento presente</li>";
		}
	}else{
		return "<li>errore nel database</li>"
	}
}
//......
    $tab = musei($codice);
	if(!is_array($tab)){
		echo $tab;
	}else{
		foreach($tab as $ch => $val){
			echo "<li><a href='pag.php?p=01&codmuseo={$val['cod']}' title='{$val['nome']}' />{$val['nome']}</a></li>";  
		}
	}
//....
?>
eventualmente prova

comunque un consiglio:
abbandona le vecchie istruzioni mysql e passa alle mysqli o alla classe pdo. a breve le mysql non funzioneranno più
 

Discussioni simili