Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
php und MySql ... Array in Array [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
php und MySql ... Array in Array


 
jippie
12-12-2005, 15:04 
 
Hallo erstmal,

Also , ich hab da (natürlich) ein kleines Problem, was euch Profis gewiss lächerlich erscheint.
Aber ich bin "nur" Flashdesigner.*Ausrede such*

Also, ich habe eine Datenbank, in der sich Schüler und deren Noten befinden.
Diese lese ich so aus:
$rest = mysql_query($noten)or die(mysql_error());
while ($rowe = mysql_fetch_assoc( $rest ))
{
$sqlfach1 ="SELECT *FROM notentab WHERE f_id = 1 AND notentabns_id = '$rowe[s_id]'";
$resfach1 = mysql_query($sqlfach1);
while ($rowfach = mysql_fetch_assoc ($resfach1))
{
$noten1array[$rowfach['n_id']]= utf8_encode($rowfach['zensuren']);

$mnot1 = implode(',',$noten1array);
echo "&mathe=$mnot1"; }

Nun habe ich leider mehrere Schüler, und dort auch mehrere Zensuren im Fach.

In diesem Fall sehen die Noten dermaßen aus:
Schüler 1 = 1.0 , 5.0
Schüler 2 = 2.0

Nun muß ich das Ganze so hinkriegen, daß Flash das lesen kann.
Also erstellte ich den Array ( deshalb auch das & vor der Ausgabevariable)

Derzeitige Ausgabe: &mathe= 1.0,5.0,2.0

Leider, wie gesagt, zwei Schüler.

Wie kann ich nun hinbekommen, daß die Ausgabe

&mathe= 1.0,5.0|2.0 heisst ?

Also zuerst die Zensuren von Schüler 1 dann "|" dann Schüler 2.

Danke schon mal im Vorraus

 
liquid
12-12-2005, 16:02 
 
Bin zwar kein Profi, aber ich würd mal sagen, du solltest ne zusätzliche Schleife anhängen. For Each würd ich sagen...

Also er soll für jeden Schüler den noten-string ausgeben, die mit "," getrennt werden und diese wieder mittels "|" voneinander trennen.

kann dir den code zwar ned sagen, aber ohne schleife wird da wohl nix gehn denk ich.

greez
liquid

 
Rolandbar
12-12-2005, 19:03 
 
hi

wie sieht den die datenbank struktur aus?
wenn die schleife die schüler durchgeht, probiere mal das,

$temp_1 = "&mathe=";
$first = true;
$rest = mysql_query($noten)or die(mysql_error());
while ($rowe = mysql_fetch_assoc( $rest ))
{

$sqlfach1 ="SELECT *FROM notentab WHERE f_id = 1 AND notentabns_id = '$rowe[s_id]'";
$resfach1 = mysql_query($sqlfach1);
while ($rowfach = mysql_fetch_assoc ($resfach1))
{
$noten1array[$rowfach['n_id']]= utf8_encode($rowfach['zensuren']);

$mnot1 = implode(',',$noten1array);

if($first = true)
{
$temp_1 .= $mnot1;
$first = false;
} else
{
$temp_1 .= "|" . $mnot1;
}
}

echo $temp_1;

 
jippie
12-12-2005, 19:18 
 
hmmm... das klingt schön, ist aber nur für zwei Schüler ( wenn ich das Skript richtig verstehe)
Ich werde aber nicht wissen,
wieviel Schüler dort noch dazukommen, sind nur in diesem Beispiel 2 Schüler.

Aber danke

 
Rolandbar
12-12-2005, 19:22 
 
ist aber nur für zwei Schüler ( wenn ich das Skript richtig verstehe)

genau darum habe ich gefragt wie die datenbank strucktur aussiert,
zb bei phpmyadmin schaueuen: exportieren, tabelle notentab wählen, nur strucktur.

normal müsst es für unendlich viele schüler sein wenn die While schreiffe die schüler durchgeht, was ich aber ohne die datenbank strucktur nicht sagen kann.

mfg Roland

 
jippie
12-12-2005, 19:33 
 
Also die Tabelle notentab beinhaltet die Spalten ns_id (= schueler.s_id = id des Schülers),
f_id (= faechername wird dorther geholt), und den "zensuren".

Würde das Fach auch gern dynamisch durchlaufen lassen, damit da noch ein Fach dazukommen könnte, aber für den Anfang reicht es so.

Die Tabelle notentab wird dann vom Lehrer ausgefüllt.

$rowe[s_id] = die Id des jeweiligen Schülers.

Ich bin grad dabei zu probieren, das ganze per foreach zu lösen.
Leider funktioniert das auch noch nicht so, wie ich es möchte, bin also für Antworten dankbar.

jippie

 
Rolandbar
13-12-2005, 19:06 
 
1: mit notentabns_id = '$rowe[s_id] hollst du ja ber nur einen besteimmten schüler, also nur die noten(fächer) von einem schüler und nicht zwei oder mehr, wenn ich das richtig verstanden habe.


2: mein forschlag:
folgende struktur finde ich gut

id int(11) auto_inclement primärschlüssel
s_id int(11)
fach varchar(50)
noten text


bei noten kommen die noten zum jeweiligen fach.
s_id ist die schüler id und id ist für den index damit man mal nur einen bestimte zeile holen kann... zb;

id s_id fach noten
-----------------------------------------
1 3 Mathe 1.0,2.0.5.5,4.5
2 3 Deutsch 6.0,6.0,6.0,6.0
3 8 mathe 1.0,1.0,1.0

dann kanst du nur ein bestimmtes fach oder einbestiemten schüler
und und und wählen.
meinst du das so in etwa?

 
jippie
13-12-2005, 19:25 
 
So sieht das ganze Script aus:
<? require ("config.inc.local.php");
$schueler = " SELECT * FROM schueler
INNER JOIN klasse ON (klasse.k_id = schueler.sklassen_id)
INNER JOIN mitteilung ON (mitteilung.s_id = schueler.s_id)
WHERE klasse.kname = '$klid'
AND schueler.slehrer_id = '$lid'
AND klasse.schulename = '$schname' ";

$res = mysql_query($schueler)or die(mysql_error());
while ($row = mysql_fetch_assoc( $res ))
{
$nachnamearray[$row['s_id']]= utf8_encode($row['snachname']);
vornamearray[$row['s_id']]= utf8_encode($row['svorname']);
$mitteilarray[$row['s_id']]= utf8_encode($row['privat']);
$nachnamenk = implode(',', $nachnamearray);
echo "&schulername=$nachnamenk";
$vornamenk = implode(',', $vornamearray);
echo "&schulervname=$vornamenk";
$mitteil = implode('|',$mitteilarray);
echo "&mitteilung=$mitteil";
{ // alle Noteneinträge zum übergebenen Fach $f_id ermitteln
$sql="SELECT * FROM notentab WHERE f_id=1
AND ns_id='$row[s_id]'";
$resnoten = mysql_query($sql);
$note=ARRAY();
//Array aufbauen mit der Schüler-ID als Index
while ($rownoten = mysql_fetch_assoc($resnoten))
{
//gibts den Index für diesen Schüler schon? Dann weitere Noten anhängen
if (isset($note[$rownoten['ns_id']]))
$note[$rownoten['ns_id']].=$rownoten['zensuren'].',';
// sonst Index für den Schüler anlegen und Note übernehmen
else $note[$rownoten['ns_id']]=$rownoten['zensuren'].',';
}
//echo ausgabe und Aufbau des Arrays
foreach ($note AS $key=>$val)
{
echo "&note[$key]=$val";
$notenarray= implode ('|',$note);
echo "&manoten=$notenarray";
} // alle Noteneinträge zum übergebenen Fach $f_id ermitteln
$sqld="SELECT * FROM notentab WHERE f_id=2 AND ns_id='$row[s_id]'";

$resnotend = mysql_query($sqld);

$noted=ARRAY();
//Array aufbauen mit der Schüler-ID als Index
while ($rownotend = mysql_fetch_assoc($resnotend))
{
if (isset($noted[$rownotend['ns_id']]))
$noted[$rownotend['ns_id']].=$rownotend['zensuren'].',';
else $noted[$rownotend['ns_id']]=$rownotend['zensuren'].',';
}
foreach ($noted AS $key=>$val)
{
echo "&noted[$key]=$val";
$notenarrayd= implode ('|',$noted);
echo "&deutschnoten=$notenarrayd"; } } } ?>

Soweit bin ich nun "schon".

Also, ich schicke per Flash die Schule,Klasse und den Lehrer.

Nun soll mir php einen Array herstellen, mit den Noten (im jeweiligen Fach: f_id) nur von den Schüler aus der Klasse.

also manoten = zensuren schüler1|zensuren schüler2|usw.

Beispiel:
Schüler 1 hat in Mathe die Noten : 1.0,5.0
Schüler 2 hat in Mathe die Noten : 3.0,4.0,1.0
Schüler 3 hat in Mathe die Noten: 2.0

Ausgabe (gewünscht) : manoten=1.0,5.0|3.0,4.0,1.0|2.0

Funktioniert im Moment nicht,

derzeitige Ausgabe:
manoten=1.0,5.0 manoten= 3.0,4.0,1.0 manoten= 2.0

 
reallife
13-12-2005, 19:49 
 
Kannst Du deinen Beitrag mal bitte editieren und den Code mithilfe des vB Code darstellen? Das macht das ganze einfacher zu lesen, danke.
Du könntest ausserdem auch schon vieles mit einem SQL - Statement erleichtern. Stichwort: GROUP BY

 
Rolandbar
13-12-2005, 22:04 
 
also das was ich beim ersten post in den php tags geschieben habe müsst eigenlich geanu das machen was du willst.

mfg Roland

 
jippie
13-12-2005, 22:47 
 
<?

require ("config.inc.local.php");
$schueler = "
SELECT * FROM schueler
INNER JOIN klasse ON (klasse.k_id = schueler.sklassen_id)
INNER JOIN mitteilung ON (mitteilung.s_id = schueler.s_id)

WHERE
klasse.kname = '$klid'
AND
schueler.slehrer_id = '$lid'
AND
klasse.schulename = '$schname'

";


$res = mysql_query($schueler)or die(mysql_error());
while ($row = mysql_fetch_assoc( $res ))
{
$nachnamearray[$row['s_id']]= utf8_encode($row['snachname']);
$vornamearray[$row['s_id']]= utf8_encode($row['svorname']);
$mitteilarray[$row['s_id']]= utf8_encode($row['privat']);


$nachnamenk = implode(',', $nachnamearray);
echo "&schulername=$nachnamenk";

$vornamenk = implode(',', $vornamearray);
echo "&schulervname=$vornamenk";

$mitteil = implode('|',$mitteilarray);
echo "&mitteilung=$mitteil";



$temp_1 = "&mathe=";
$first = true;


$sqlfach1 ="SELECT * FROM notentab WHERE f_id=1 AND ns_id ='$row[s_id]'";
$resfach1 = mysql_query($sqlfach1);
while ($rowfach = mysql_fetch_assoc ($resfach1))
{
$noten1array[$rowfach['ns_id']]= utf8_encode($rowfach['zensuren']);

$mnot1 = implode(',',$noten1array);

if($first = true)
{
$temp_1 .= $mnot1;
$first = false;
} else
{
$temp_1 .= "|" .$mnot1;
}
}
echo "manoten=$temp_1";
}

so wird "manoten=&mathe=5.0,1.05.0,5.05.0,3.05.0,4.05.0,2.0 " ausgegeben.

Ich glaub, ich steh nun völlig auf dem Schlauch*grummel


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:47 Uhr.