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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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.
 

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
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:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
Autore Titolo Forum Risposte Data
I Eecuzione di javascript in ciclo foreach php. PHP 7
S [PHP] Ciclo foreach su più array PHP 2
maxnegri [PHP] Eliminare risultati duplicati da ciclo foreach ottenuti da una select php mysqli PHP 18
M [PHP] Errore in ciclo foreach PHP 1
M Problema con ciclo foreach per chiusura apertura div in base al numero di record in database PHP 1
otto9due Problema inserimento ciclo foreach o while in variabile PHP 1
M Aiuto su come procedere con un ciclo foreach PHP 4
M problema con ciclo foreach per estrarre dati da un database PHP 22
M elimina valori doppi in ciclo foreach PHP 3
C Risultati ciclo foreach in tabella PHP 13
nim inserire dati in tabella con ajax (ciclo foreach) Ajax 10
M Ciclo foreach dentro un ciclo while PHP 5
P Iterazione Foreach dentro un ciclo for PHP 9
B Completare il seguente ciclo affinché stampi tutto l’array al contrario PHP 3
W MySQL ciclo in SELECT MySQL 0
E Inviare variabile a PHP da ciclo in JS Javascript 0
W fare la somma di un valore estratto da un ciclo while Classic ASP 0
motleyrulez Aiuto con un ciclo PHP 0
B [PHP] formula e ciclo PHP 5
M [PHP] Come inserire codice html in un ciclo while PHP 2
T con oop creare un ciclo per una pagina dinamica html con php PHP 3
G [PHP] totale per ogni id di un ciclo PHP 1
P Incrementare nodo in ciclo for-each XML 6
M UPDATE non aggiorna db se lo inserisco in un ciclo Database 1
N [PHP] Controllare condizione ciclo While PHP 9
N [PHP] Registrare variabili all'interno di un ciclo PHP 3
MattiaBL [PHP] Problema ciclo while PHP 3
V Ciclo for per Pulsante in JavaScript Javascript 7
elpirata [PHP][RISOLTO] Sommare gli importi estratti da un ciclo while PHP 3
C [PHP] Ciclo for dinamico PHP 14
gandalf1959 [PHP] query all'interno di un ciclo while PHP 3
Z [PHP] ciclo for PHP 9
valvasori [PHP] Problema ciclo for PHP 12
A [PHP] metodo di una classe per estrarre i dati con ciclo while PHP 1
H [PHP] Ciclo per calcolare i chilometri PHP 4
S [PHP] Recupero più dati da form realizzata ciclo FOR PHP 5
gandalf1959 [PHP] ciclo while non scrive dove dovrebbe... PHP 2
Monital [PHP] ciclo su un file json molto grande PHP 1
O Ciclo non visualizzato PHP 1
M problema ciclo javascript Javascript 4
G Ciclo if php per far comparire un pulsante solo nel caso in cui una variabile sia 0 PHP 2
F Problema codice in un ciclo while PHP 2
T ciclo $.each non va jQuery 4
V Generare array da ciclo while e prendere valori casuali PHP 4
I tabella con ciclo, recupero dati PHP 3
Monital Problema con un ciclo for. PHP 1
S Ciclo PHP molto complesso PHP 2
minatore Ciclo while PHP 3
D ciclo while mi genera due campi vuoti PHP 5
K Problema con update di un database in un ciclo Classic ASP 1

Discussioni simili