ordinare il risultato di una query con variabili unite

  • Creatore Discussione Creatore Discussione Monital
  • Data di inizio Data di inizio

Monital

Utente Attivo
15 Apr 2009
778
2
18
Salve, dopo un attenta ricerca su questo forum non ho trovato esattamente quello che cercavo forse perchè la cosa è un pò complessa

spiego al volo

ho una tabella così composta
ID_NAME|Nome|Cognome|Soprannome

sia nome che cognome non sono mai vuoti mentre soprannome può esere vuoto

in sostanza io estraggo prima i soprannomi e quando trova il soprannome = "" ricerco tramite cognome e nome

questa è la query contenuta in una select multpila


PHP:
<?php


mysql_connect($DBhost,$DBuser,$DBpass) or die("Impossibile collegarsi al server");
@mysql_select_db("$DBName") or die("Impossibile connettersi al database $DBName");

$sqlquery = "SELECT * FROM tabella Order by Soprannome,Cognome"; 
$result = mysql_query($sqlquery);
 while ($linea = mysql_fetch_array($result, MYSQL_ASSOC)) {
 $id=$linea['ID_NAME'];
 $sopra=$linea['Soprannome'];
 $cognome=$linea['Cognome'];
 $nome=$linea['Nome'];
 if($sopra!=''){
 $thename=$sopra;
  }else{
 $thename=$cognome." ".$nome;
 }

echo  "<option value=\"$id\">$thename</option>";

}

nella select multipla mi ordina prima i nomi nomi e cognomi e successivamente mi rilista i soprannomi ordinati , togliendo l'order by ovviamente non me li lista ordinati. questo sicuramente perchè ho messo l'if dove quando non trova il soprannome prende cognome e nome senno mi prende il soprannome escludendo nome e cognome.

ho provato con la funzione sort ma mi restutisce vuoto e saprei anche il eprchè ma non riescoa veninre fuori

suggerimenti?
 
ciao
poi provare in questo modo

PHP:
<?php
//....
$nomi=array();//predispongo un'array
$sqlquery = "SELECT * FROM tabella"; //qui non ti serve l'order by in quanto ordini dopo
$result = mysql_query($sqlquery);
while ($linea = mysql_fetch_array($result)) {
	$id=$linea['ID_NAME'];
	if($sopra !=""){
		$nomi[$id]=$linea['Soprannome'];
	}else{
		$nomi[$id]=$linea['Cognome']." ".$linea['Nome'];
	}
}
asort($nomi);//ordino l'array alfabeticamente !!usare asort non sort per mantenere corrispondenza chiave=>valore
echo "<select name=\"select\">";
foreach($nomi as $chiave => $valore){// e lo ciclo
	echo  "<option value=\"$chiave\">$valore</option>";
}
echo "</select>";
//.....
?>
 
grande borgo

avevo provato a creare l'array però non risucivo ad ordinarlo

era da usare asort :hammer:

grazie mille
 
una curiosità sempre al riguardo di qeusto codice,

se io in $nomi ho ad esempio 4 nomi uguali mentre li ordina come potrei fare per dargli un identificativo diverso che so

se ho 4 Antonio(nei soprannomi) come posso farli listare ad esempio

Antonio(1)
Antonio(2)
etc. o meglio come associargli un altro campo della tabella stessa?

Delt ipo il primo antonio è di bari, il secondo di lecce e far uscire la lista ordinata più queste aggiunte qunado trova dei nomi uguali?

Esempio
Alessandro
Antonio(Bari)
Antonio(Lecce)
etc.
 
ciao
non è semplicissimo poroverei a fare in questo modo
intanto dipende dove hai il valore citta (bari, lecce ....) se nella stessa tabella con i nomi o in altra tabella, mettiamo sulla stessa, altrimenti diventa più complesso.
nel ciclo while prelevi anche la città
$citta[$id]=$linea['citta'];
PHP:
<?php
//...
asort($nomi);//ordino l'array alfabeticamente !!usare asort non sort per mantenere corrispondenza chiave=>valore 
foreach($nomi as  => $val_1){
	foreach($nomi as $ch_2 => $val_2){
		if($ch_1 != $ch_2 && $val_1 == $val_2){//verifico che non sia lo stesso dato ma con nomi uguali
			$nomi[$ch_1] .= " (".$citta[$ch_1].")";
			$nomi[$ch_2] .= " (".$citta[$ch_2].")";
		}
	}
}
echo "<select name=\"select\">"; 
foreach($nomi as $chiave => $valore){// e lo ciclo 
    echo  "<option value=\"$chiave\">$valore</option>"; 
} 
echo "</select>"; 
//..... 
?>
dimmi se funzia
 
niente mi restituisce la select vuota


forse,e questo mi sa che è molto difficile, perchè alcuni nomi si ripetono anche 5-6 volte.

boh
 
ciao
ho fatto una dimenticanza di scrittura nel primo foreach

foreach($nomi as => $val_1){

correggi in
foreach($nomi as $ch_1 => $val_1){

riprova e sappimi dire
 
ciao
sei sicuro che non funzi?
i nomi delle città seno nella stssa tabella dei nomi delle persone?

PHP:
<?php
//dal while ti si formano due array simili a questi (eventualmente verifica con i var_dump)
$nomi=array( 1 => 'sofonisba', 4 => 'asdrubale', 7 => 'pancrazio', 9 => 'asdrubale', 12 => 'abbondio', 27 => 'pancrazio');
$citta=array( 1 => 'firenze', 4 => 'como', 7 => 'ancona', 9 => 'torino', 12 => 'otranto', 27 => 'palermo');
var_dump($nomi); echo "nomi<br>";
var_dump($citta); echo "citta<br>";
echo "<br>";
asort($nomi);//ordino l'array alfabeticamente !!usare asort non sort per mantenere corrispondenza chiave=>valore
var_dump($nomi);echo "nomi ord<br>";//per verificare l'ordinamento
foreach($nomi as  $ch_1 => $val_1){ 
    foreach($nomi as $ch_2 => $val_2){ 
        if($ch_1 != $ch_2 && $val_1 == $val_2){//verifico che non sia lo stesso dato ma con nomi uguali 
            $nomi[$ch_1] .= " (".$citta[$ch_1].")"; 
            $nomi[$ch_2] .= " (".$citta[$ch_2].")"; 
        } 
    } 
}
echo "<br>";
var_dump($nomi);echo "nomi+citta per nomi uguali<br><br>";//verifica per vedere se nome abbinato a città

echo "<select name=\"select\">";  
foreach($nomi as $chiave => $valore){// e lo ciclo  
    echo  "<option value=\"$chiave\">$valore</option>";  
}  
echo "</select>";  
?>
e questo è l'utput dei var_dump

array(6) { [1]=> string(9) "sofonisba" [4]=> string(9) "asdrubale" [7]=> string(9) "pancrazio" [9]=> string(9) "asdrubale" [12]=> string(8) "abbondio" [27]=> string(9) "pancrazio" } nomi
array(6) { [1]=> string(7) "firenze" [4]=> string(4) "como" [7]=> string(6) "ancona" [9]=> string(6) "torino" [12]=> string(7) "otranto" [27]=> string(7) "palermo" } citta
array(6) { [12]=> string(8) "abbondio" [9]=> string(9) "asdrubale" [4]=> string(9) "asdrubale" [27]=> string(9) "pancrazio" [7]=> string(9) "pancrazio" [1]=> string(9) "sofonisba" } nomi ord

array(6) { [12]=> string(8) "abbondio" [9]=> string(18) "asdrubale (torino)" [4]=> string(16) "asdrubale (como)" [27]=> string(19) "pancrazio (palermo)" [7]=> string(18) "pancrazio (ancona)" [1]=> string(9) "sofonisba" } nomi+citta
si forma anche la <select> ma non l'ho postata perchè avrei dovuto fare un'immagine

comunque subito dopo il wile metti i var_dump per verificare se sis sono formati gli array
 
borgo grazie dell'aiuto, veramente.

scusa ma sto andando fuori fase anche grazei ad un altro problemino con il GET.

comunque sia allora, città al momento non è nella stesas tabella potrei eprò inserircelo se opto erp quella strada in realtà pensavo di affiancarci l'id, cmq sia ho fatto una prova con età

preciso che dopo il while quando richiamo le linee ho dovuto dichiarare
PHP:
 $eta[]=$linea['Eta'];

senza le [] mi restituiva solo l'ultima, dopo di che ho semplificato la query estraedno direttamente un nome che ne ho 5 il risultato non coincide propriamente difatti pare ch eil nome abbia una doppia associazione cmq ti posto il var_dump

array(6) { [0]=> string(2) "29" [1]=> string(2) "29" [2]=> string(2) "26" [3]=> string(2) "24" [4]=> string(2) "23" [5]=> string(2) "28" } eta al psoto di citta


array(6) { [193874]=> string(22) "Adriano () () () () ()" [205122]=> string(10) "Adriano ()" [183240]=> string(10) "Adriano ()" [164082]=> string(10) "Adriano ()" [135530]=> string(10) "Adriano ()" [106019]=> string(10) "Adriano ()" } nomi+eta per nomi uguali

quindi gli array sono aposto il problema forse vine dal foreach però nonc apisco ho copiato incollato epr sicurezza boh
 
ciao
dimmi cosa ti danno i var_dump

PHP:
<?php
//.....
$result = mysql_query($sqlquery); 
while ($linea = mysql_fetch_array($result)) { 
    $id=$linea['ID_NAME']; 
	$eta[$id]=$linea['eta'];
    if($linea['Soprannome'] !=""){ 
        $nomi[$id]=$linea['Soprannome']; 
    }else{ 
        $nomi[$id]=$linea['Cognome']." ".$linea['Nome']; 
    } 
} 
var_dump($nomi);//var_dump 1
var_dump($eta);//var_dump 2
asort($nomi);//ordino l'array alfabeticamente !!usare asort non sort per mantenere corrispondenza chiave=>valore  
var_dump($nomi);//var_dump 3
foreach($nomi as $ch_1 => $val_1){ 
    foreach($nomi as $ch_2 => $val_2){ 
        if($ch_1 != $ch_2 && $val_1 == $val_2){//verifico che non sia lo stesso dato ma con nomi uguali 
            $nomi[$ch_1] .= " (".$eta[$ch_1].")"; 
            $nomi[$ch_2] .= " (".$eta[$ch_2].")"; 
        } 
    } 
}
var_dump($nomi);//var_dump 4
echo "<select name=\"select\">";  
foreach($nomi as $chiave => $valore){// e lo ciclo  
    echo  "<option value=\"$chiave\">$valore</option>";  
}  
echo "</select>"; 
//...
?>

mettiamo per ipotesi id nome eta:
27 antonio 35
28 giuseppe 97
29 antonio 15
i var_dump 1 e 2 devono restituiri (non ho contato la lunghezza della stringa)
array(3) { [27]=> string(7) "antonio" [28]=> string(8) "giuseppe" [29]=> string(8) "antonio"}
array(3) { [27]=> string(2) "35" [28]=> string(9) "97"}
coè la chiave di antonio deve essere uguale alla chiave dell'eta di antonio e così via
var_dump 3
array(3) { [27]=> string(7) "antonio" [29]=> string(8) "antonio" [28]=> string(8) "giuseppe"}
var_dump 4
array(3) { [27]=> string(7) "antonio (35)" [29]=> string(8) "antonio (15)" [28]=> string(8) "giuseppe"}

poi non capissco poi cosa sono quei () () () () nel out del var_dump che hai postato
 
ti ho posato il due ed il 4 come var dump

praticamente invece di darmi la chiave di antonio la realtiva eta mi da come chiave l'id

e le parentesi escono eprschè forse non trova eta[ch_1] cmq faccio delle prove forse ho individuato cos'è

a bre ve ti faccio sapere
 
cioa
mi sembra che tu abbia messo
$eta[]=$linea['eta'];
per cui l'indice parte da 0 e quindi non corrisponde più con l'id del nome
devi mettere
$eta[$id]=$linea['eta'];
in modo da mantenere la corrispondenza tra nome e sua età
 
cioa
mi sembra che tu abbia messo
$eta[]=$linea['eta'];
per cui l'indice parte da 0 e quindi non corrisponde più con l'id del nome
devi mettere
$eta[$id]=$linea['eta'];
in modo da mantenere la corrispondenza tra nome e sua età

sei un genio, che stupido che sono

funge se non fosse per due problemi ho fatto delle prove ed ho riscontrato questo
poi non capissco poi cosa sono quei () () () () nel out del var_dump che hai postato

in pratica fino a due nomi uguali tutto ok però ad esempio se ne trova 3

Alessandro(29)
Alessandro(32)
Alessandro(34)(34)

se ne trova 4
Adraino(24)
Adriano(26)
Adriano(29)
Adriano(29)(29)(29)

in sostanza ripete le paretensi in funzione dei nomi precedenti uguali che trova

Ultimo problema più grande del rpevisto ed ho paura che non c'è soluzione:crying::crying: e che non ce la fa ad eleaborare tutta la tabella :crying: ho fatto delle prove neld atabse ci sono 14.000 e rotti nomi, ho fatto delle prove con LIMIT finoa 9000 ce la fa poi non ce la fa più e mi restituisce la select vuota :crying:
 
ciao
per il problema del blocco puo essere che, dato l'ato numero di cicli da fara, il tempo di vita dello script non sia sufficiente
prova a mettere all'inizio dello script
PHP:
set_time_limit(240);
cioè ne allunghi il tempo di vita, in genere su ini.php il tempo è impostato a 30 sec, mettendo 240 (a altro più o meno lungo) dovresti farcela

per quanto riguarda la ripetizione ci do un occhio e poi (spero) ti so dire
 
ciao
per il problema del blocco puo essere che, dato l'ato numero di cicli da fara, il tempo di vita dello script non sia sufficiente
prova a mettere all'inizio dello script
PHP:
set_time_limit(240);
cioè ne allunghi il tempo di vita, in genere su ini.php il tempo è impostato a 30 sec, mettendo 240 (a altro più o meno lungo) dovresti farcela

per quanto riguarda la ripetizione ci do un occhio e poi (spero) ti so dire

:crying: niente da fare


Fatal error: Maximum execution time of 30 seconds exceeded

e indica proprio la riga dove inizia il foreach
 
ciao
sembra che non prenda l'istruzione, prova a settarlo su ini.php

niente da fare l'hosting non lo permette

l'unica e spezzetare la query ma trattandosi di una select non saprei come fare nel senso che poi non mi si ordina più tutto all'interno della select, a meno che non faccio due query e chiamo sempre $nomi il risultato unendo i due array

almeno epnso si pos fare,spero :crying:
 
ciao
niente da fare l'hosting non lo permette
cambiare hosting
non credo che basti suddividere la query, se fai (es) tre query il tempo e sempre lo stesso
si dovrebbe richiamare lo script (cioè farlo ripartire) tante volte quante serve in modo da ridurre il tempo (per ciascuna chiamata) ad un massimo di 30 sec
se mi viene qualche idea te la posto
 

Discussioni simili