Archiv verlassen und diese Seite im Standarddesign anzeigen : Array und Schleife
hallo
hab ein problem mit einer schleife
function CE_readoutFields($db,$gettblname){
$sqlfield = mysql_query("SHOW FIELDS FROM $db.".$gettblname." ");
while($rowfield[] = mysql_fetch_array($sqlfield)){
$t_rowfield = $rowfield;
}
return $t_rowfield;
}
$showField = CE_readoutFields("dbname", "tbl_test");
foreach($showField as $key =>$showFieldName){
echo $key.$showFieldName['Field'];
}
rufe ich nun diese funktion auf und lasse es mir mit einer forech schleife
anzeigen bekomme ich immer einen durchlauf mehr heraus als was für ein ergebnis in der funktion raus kam.
Ist es weil der Zeiger wieder zurückspringt?Wie kann ich das unterbinden? kann mir da jemand von euch helfen?
1. was soll das leerzeichen am ende?
$sqlfield = mysql_query("SHOW FIELDS FROM $db.".$gettblname." ");
2. wieso arbeitest du hier mit einem array?
while($rowfield[] = mysql_fetch_array($sqlfield))
3. und da nicht?
$t_rowfield = $rowfield;
4. in diesem fall brauchst du keine while-schleife, ein einfaches
$rowfield = mysql_fetch_array($sqlfield)
reicht völlig aus. und das kannst du zurückgeben
gruß
peter
hallo kropff
danke für die schnelle antwort .
zu 1. gehört da nicht hin ...hatte vorher noch ne where klausel drin
zu2. und 3.
weil es funktioniert ! ;.)
hier liegt irgendwo der fehler dass bei zb bei 5 einträgen die foreach schleife 6 mal durchlaufen wird
zu 4.brauch doch ne while schleife, da ja mehrere Spalten in meiner tabelle drin sind, deren namen ich angezeigt bekommen möchte,
mache ich keine schleife bekomme ich doch nur den ersten eintrag angezeigt. ...aber das weisst du ja
while($rowfield = mysql_fetch_array($sqlfield))
{
$t_rowfield[] = $rowfield;
}
return $t_rowfield;
so ist zumindest sinnvoll.
da ja mehrere Spalten in meiner tabelle drin sind
deswegen brauchst du aber keine schleife, da es nur ein(!) datensatz ist, bestehend aus einem(!) array.
$sqlfield = mysql_query('SHOW FIELDS FROM '.$db.'.'.$gettblname);
$rowfield = mysql_fetch_array($sqlfield);
print_r($rowfield);
gruß
peter
Hallo TobiaZ
das hätte ich auch gedacht.
funzt aber net..
print_r($t_rowfield); ist leer!
@kropff
nein es sind mehrer DS
zb ID[Field],int(5) unsigned [Type] ,auto_increment [Extra]..
TableName [Field],varchar(50) [Type] ,.....
FG_USer[Field], tinyint(1) [Type] ....
die lese ich alle in de schleife aus und packe das ergebnis in ein array
welches ich mit der foreach schleife wieder auseinanderpflücke...was auch alles prima funktioniert. bis auf den einen durchlauf zuviel.
funzt aber net..
print_r($t_rowfield); ist leer! code zeigen!
nein es sind mehrer DS
stimmt, hast recht. habe noch nie mit so einer abfrage gearbeitet.
print_r($t_rowfield); ist leer!
und was ergibt ein
$sqlfield = mysql_query('SHOW FIELDS FROM '.$db.'.'.$gettblname) or die (mysql_error());
gruß
peter
function CE_readoutFields($db,$tbl)
{
$res = mysql_query("SHOW FIELDS FROM " . $db . "." . $tbl);
while($row = mysql_fetch_array($res))
{
$fields[] = $row;
}
return $fields;
}
$fields = CE_readoutFields("dbname", "tbl_test");
foreach($fields as $fiels)
echo $field['Field'];
}
Ungetestet, den erste Tippfehler hab ich schon beseitigt.
//Tabellenattribute wie Field, Type usw einer
//beliebigen Tabelle werden in einem array geparkt
function CE_readoutFields($db,$gettblname){
$sqlfield = mysql_query("SHOW FIELDS FROM $db.".$gettblname." ");
while($rowfield[] = mysql_fetch_array($sqlfield)){
// $t_rowfield = $rowfield; unnötig
}
return $t_rowfield;
}
//array wird auseinandergepflückt und ich lasse mir
//die Tabellenspalten und deren Typ anzeigen
$showField = CE_readoutFields("dbname", "tbl_test");
foreach($showField as $key =>$showFieldName){
echo $key.$showFieldName['Field'].$showFieldName['Type'];
}
wie gesagt alles wunderbar fehler werden nicht angezeigt ..
das einzige problm ist der eine durchlauf der foreach schleife zuviel
dieser stört bei der weiteren abarbeitung in meinem weteren code.
ich hatte das auch alles schon zum funktionieren gebracht , jedoch ist meine platte mit dem code vorgestern gecrasht und ich habe keien Ahnung mehr was das Ausschlaggebende zum funktionieren dieses Codes war. Kommt Zeit kommt Rat..
while($rowfield[] = mysql_fetch_array($sqlfield)){
$t_rowfield = $rowfield;
}
return $t_rowfield; Das ist total überflüssig. Unsinnigerweise überschreibst du $_rowfeld immer wieder. Dann lass es lieber ganz raus und verwende nur $rowfeld. (siehe mein snippet)
Danach mal ne testausgabe vom Array machen, erhält es die gewünschte Struktur und Inhalt?
wie gesagt alles wunderbar fehler werden nicht angezeigt ..
das einzige problm ist der eine durchlauf der foreach schleife zuviel
dieser stört bei der weiteren abarbeitung in meinem weteren code. Wie gesagt, testausgabe des Arrays (gerne auch mal hier posten)
@Tobiaz
ja das mit deinem Code ist besser, doch lasse dir mal den
$key anzeigen bei der schleife und du wirst feststellen , dass da ein durchlauf zuviel ist.
foreach($fields as $key => $fiels){
echo $key.$field['Field'];
}
kannst das ja mal mit ner beliebigen Tabelle versuchen
und wehe das klappt bei dir ;-)
Hab meinen Code noch mal angepasst, jetzt sollte es besser sein. Und wenn du noch ein mal postest, dass es nicht geht, ohne endlich das Array auszugeben, ...
Da wird nämlich wahrscheinlich ein "false" drin stehen, was jedoch kein array ist. ;)
ergebnis des arrays();
Array (
[0] => Array ( [0] => ID [Field] => ID [1] => int(5) unsigned [Type]
=> int(5) unsigned [2] => NO [Null] => NO [3] => PRI [Key] => PRI
[4] => [Default] => [5] => auto_increment [Extra] =>
auto_increment )
[1] => Array ( [0] => TableName [Field] => TableName [1] =>
varchar(50) [Type] => varchar(50) [2] => NO [Null] =>
NO [3] => UNI [Key] => UNI [4] => [Default] => [5] =>
[Extra] => )
[2] => Array ( [0] => FG_SU [Field] => FG_SU [1] =>
tinyint(1) [Type] => tinyint(1) [2] => NO [Null] => NO [3] =>
[Key] => [4] => 1 [Default] => 1 [5] => [Extra] => )
[3] => Array ( [0] => FG_ADMIN [Field] => FG_ADMIN [1] =>
tinyint(1) [Type] => tinyint(1) [2] => NO [Null] => NO [3] =>
[Key] => [4] => [Default] => [5] => [Extra] => )
[4] => Array ( [0] => FG_USER [Field] => FG_USER [1] =>
tinyint(1) [Type] => tinyint(1) [2] => NO [Null] => NO [3] =>
[Key] => [4] => [Default] => [5] => [Extra] => )
[5] => ) //???
ergbnis von $key.fiels['Field'];
0ID
1TableName
2FG_SU
3FG_ADMIN
4FG_USER
5
//Tabelle hat nur aber nur 5 DS
1. Aktueller Code???
2. Wenn ich dir schon sage, dass da vermutlich ein false drin steht, wäre es ein leichtes gewesen diese vermutung mit var_dump zu bestätigen, anstatt sich über einen "leeren" Wert zu wundern.
tontechniker 03-02-2008, 19:13 [5] => ) //??? Da wird nämlich wahrscheinlich ein "false" drin stehen, was jedoch kein array ist. var_dump zeigt das genau an.
@tontechniker
jup , habe es bisher nur 1 mal benutzt und anscheinend wieder vergessen ..danke
@TobiaZ
array(6) { {...........}[5]=> bool(false) }
Aha. Und die restlichen antworten vielleicht auch nocht?
1. Aktueller Code???
PHP-Desaster 03-02-2008, 19:42 Ja, das liegt daran, weil du das Ergebnis von fetch_bla direkt ins Array pumpst. Mache es, wie schon 57mal hier im Thread gezeigt, über eine Zwischenvariable!
@TobiaZ
es funktioniert alles... deine erste Antwort war schon richtig..sry wegen der Umstände. und nochmals vielen Dank. :-)
Wie war das mit dem Wald und den Bäumen ?
1. Aktueller Code
function CE_readoutFields($db,$tbl)
{
$sqlfield = mysql_query("SHOW FIELDS FROM " . $db . "." . $tbl);
while($row = mysql_fetch_array($sqlfield)){
$rowfields[] = $row ;
}
return $rowfields;
}
$showField = CE_readoutFields("dbname", "tbl_test");
foreach($showField as $key =>$showFieldName){
echo $key.$showFieldName['Field'].'<br>';
}
Aufmerksames Lesen würde schon reichen... Neben den Tipps, die hier ja oft überlesen werden, steht hier ausnahmsweise mehrfach die fertige Lösung drin. ;)
|