Seite 1 von 2
Sortierung
Verfasst: Fr 24.Nov, 2006 13:45
von Holger
Moin,
das Vergleichsskript läuft und ist mit Hilfe von dieser Seite optimiert worden.
http://www.gremminger.se/service/compare/visa.php
Die Sortierung soll nach "Maskinbeteckning" erfolgen, aber das klappt (noch) nicht gut.
Der Code ist
Code: Alles auswählen
$result = mysql_query("SELECT * FROM maskinlista ORDER BY maskinbeteckning ASC");
Die Reihenfolge ist jetzt
H10 H10B H11 H11B H12 H12B H14 H14B H16 H16B H16C H16D H21 H25 H3 H3B H5 H7 H7B H7C H9 H9B
obwohl H3 ganz vorne stehen muss.
Ich kenne diese Problematik auch aus Dateisystemen.
Gibt es dafür eine Lösung?
Gruss
Holger
Verfasst: Fr 24.Nov, 2006 16:28
von oxpus
Nicht wirklich, da der Inhalt ja ein String ist und kein numerischer Wert.
Daher sortiert die Abfrage stur nach H1..., H2..., H3..., etc...
Verfasst: Fr 24.Nov, 2006 17:05
von Holger
AAAAHHH!!!!!
Also H1 H10 H11 H3 H5 Bääähhh!!
Hm, dann sortiere ich nach ID und ändere sie manuell in phpmyadmin ...
Verfasst: Mo 27.Nov, 2006 13:50
von Holger
Ich möchte nun nicht alle Datensätze anzeigen, sondern möchte gezielt Datensätze vergleichen können, so:
http://www.gremminger.se/service/compare/start.php
Danach sollte ein Vergleich wie hier angezeigt werden:
http://www.gremminger.se/service/compare/visa.php
Kann ich die Daten irgendwie übernehmen?
Anhand der ID?
So irgendwie?
Code: Alles auswählen
$result = mysql_query("SELECT id, tillverkare, maskinbeteckning, maskintyp, produktion, antal, vikt, laengd, bredd, hoejd, raeckvidd, skopvolym, motor, motoreffekt, kommentar
FROM maskinlista ORDER BY maskinbeteckning ASC");
?>
<form>
<table cellspacing="5">
<tr><td class="gen">Tillverkare</td><td class="gen">Maskinbeteckning</td><td class="gen">Vikt</td><td class="gen"> </td></tr>
<?php
while ($r = mysql_fetch_array($result))
{
echo('<tr><td class="gen">');
echo($r['tillverkare']);
echo('</td><td class="gen">');
echo($r['maskinbeteckning']);
echo('</td><td class="gen">');
echo($r['vikt']);
echo('</td><td class="gen">');
echo('<input type="checkbox" value="' . id . '">');
echo('</td></tr>');
}
?>
/Holger
Verfasst: Mo 27.Nov, 2006 15:13
von oxpus
Jaaaaaaa, <input type="checkbox"> ist schon einmal nicht verkehrt, aber dann wird so geschrieben ja kein Wert übergeben

Sinn macht es hier, die ID, die Du ja in der Abfrage mit rausholst, so einzufügen:
Code: Alles auswählen
echo('<input type="checkbox" name="vergleich[]" value="'.$r['id'].'" />');
Was passiert dabei:
Es werde wie gewollt Checkboxen neben den Angaben in der "Übersicht" erstellt, diese werden aber mit Anhaken beim Absenden des Formulars gesendet.
Dabei wird das Array vergleich[] erstellt mit den einzelnen ID's als Wert.
Also z. B.
Code: Alles auswählen
vergleich[2] = 2
vergleich[5] = 5
vergleich[10] = 10
vergleich[33] = 34
wenn die 3., 6., 11., und 34. Checkbox markiert wurde (immer 1 mehr, da in einem Array mit 0 begonnen wird zu zählen und bei "33" ID 34, wenn z. B. die ID 33 in der Datenbank nicht existiert).
Um dann also die Vergleichstabelle aufzubauen, wäre das Array erst einmal auszulesen:
Code: Alles auswählen
$vergleich = (isset($HTTP_POST_VARS['vergleich'])) ? $HTTP_POST_VARS['vergleich'] : array();
$sql_where_ids = '';
if(sizeof($vergleich))
{
for ($i=0; $i<sizeof($vergleich); $i++)
{
$sql_where_ids .= ($sql_where_ids != '') ? ', ' . $vergleich[$i] : $vergleich[$i];
}
}
if ($sql_where_ids)
{
$sql_where_ids = ' AND id IN (' . $sql_where_ids . ') ';
}
Und dann steht Dir als komplette Bedingung $sql_where_ids für die Abfrage zum Vergleich zur Verfügung...
-- Code nochmal etwas korrigiert --
Verfasst: Mo 27.Nov, 2006 15:24
von Holger
Muss ich dann nicht die Werte in der Array irgendwo wieder ausgleichen? Sonst ist die Zahl ja immer eins zu niedrig ...
EDIT: Ah, und muss ich die Auswertung in start.php machen bevor ich die Daten per method="post" an visa.php übergebe?
Verfasst: Mo 27.Nov, 2006 16:19
von oxpus
Langsam...
Du musst in der start.php nur die input-Felder korrekt angeben (wie in meinem Beispiel), dann ist das schon korrekt.
In der visa.php wäre dann das Array wie von mir genannt abzufragen.
Nicht mehr und nicht weniger.
Klar, die Variable mit der eingebauten Bedingung wäre dann noch in die Abfrage in der visa.php einzubinden.
Und nein, die Array-Schlüssel müssen nicht angepasst werden, es funkioniert ja so schon...
Verfasst: Mo 04.Dez, 2006 12:06
von Holger
Dann kann ich
irgendwie hier verwenden?
Code: Alles auswählen
$result = mysql_query("SELECT * FROM maskinlista ORDER BY id ASC");
z.B. so?
Code: Alles auswählen
$result = mysql_query("SELECT $sql_where_ids FROM maskinlista ORDER BY id ASC");
Oder muss das in einer Schleife gehen?
Verfasst: Mo 04.Dez, 2006 12:24
von oxpus
Öh, wenn dann so:
Code: Alles auswählen
$result = mysql_query("SELECT * FROM maskinlista $sql_where_ids ORDER BY id ASC");
Verfasst: Mo 04.Dez, 2006 12:57
von Holger
Ich habe es jetzt mal in visa.php so versucht:
Code: Alles auswählen
<?php
// Ansluter till Mysql. Måste alltid finnas i alla php-filer
// som använder Mysql. Kom ihåg att byta ut användarnamn och
// lösenord.
mysql_connect("localhost", "gremminger_se", "********");
// Här väljer vi vilken databas vi ska använda.
mysql_select_db("gremminger_se");
$vergleich = (isset($HTTP_POST_VARS['vergleich'])) ? $HTTP_POST_VARS['vergleich'] : array();
$sql_where_ids = '';
if(sizeof($vergleich))
{
for ($i=0; $i<sizeof($vergleich); $i++)
{
$sql_where_ids .= ($sql_where_ids != '') ? ', ' . $vergleich[$i] : $vergleich[$i];
}
}
if ($sql_where_ids)
{
$sql_where_ids = ' AND id IN (' . $sql_where_ids . ') ';
}
?>
<table cellspacing="5">
<tr><td class="tdborder">Tillverkare</td>
<?php
$result = mysql_query("SELECT * FROM maskinlista $sql_where_ids ORDER BY id ASC");
while ($r = mysql_fetch_array($result))
{
echo('<td class="tdborder"><b>');
echo($r['tillverkare']);
echo('</b></td>');
}
?>
Leider wird nichts angezeigt für echo($r['tillverkare']);
Verfasst: Mo 04.Dez, 2006 13:02
von oxpus
Öh, ja...
Code: Alles auswählen
$sql_where_ids = ' AND id IN (' . $sql_where_ids . ') ';
muss hier auch
Code: Alles auswählen
$sql_where_ids = ' WHERE id IN (' . $sql_where_ids . ') ';
sein, da ja keine andere Bedingung existiert

Verfasst: Mo 04.Dez, 2006 13:21
von Holger
Danke! Klasse!
Hier kannst Du das Ergebnis sehen:
http://www.gremminger.se/service/compare/start.php
Wenn ich jetzt einen Link "Zeige alle" einbauen möchte, wie mache ich das am schlauesten?
Etwa mit einem hidden input?
Verfasst: Mo 04.Dez, 2006 13:33
von oxpus
Dazu wäre es geschickt, alle Checkboxen zu aktivieren oder das Formular "leer" zu senden...
Verfasst: Mo 04.Dez, 2006 13:57
von Holger
Kann ich denn alle Checkboxen mit einem Klick auf einen Link beim Abschicken "füllen"? Ich möchte also vermeiden, dass der User auf ein "Alle markieren" klicken muss bevor er das Skript losschickt.
Verfasst: Mo 04.Dez, 2006 14:10
von oxpus
Sofern keine Datensätze angehakt sind, sollte das Script alle anzeigen...
Verfasst: Mo 04.Dez, 2006 14:20
von Holger
Jawoll!
Ok! Klappt!
Jetzt wird es komplizierter
Kann ich ganz oben Drop-Down-Felder anzeigen, in dem ich Tillverkare (Hersteller) und Maschinentyp aussuche oder mache ich das besser mit start1.php (Auswahl) -> start2.php (Anzeige)
Verfasst: Mo 04.Dez, 2006 14:29
von oxpus
Also Filter auf die Vergleichsliste?
Dann würde ich besser eine Einstiegsseite machen, mit der Du die Kriterien festlegst (z. B. DropDown), dann damit die gewünschten Maschinen zum Vergleich bereitstellst (also die jetzige Auswahlliste zum Vergleich) und dann erst der Betrachter eben genau daraus den Vergleich aufruft.
Verfasst: Mo 04.Dez, 2006 14:31
von Holger
Alles klar! Werde ich mal versuchen!
Danke für Deine Unterstützung! Habe ein Menge gelernt bis hierhin!
EDIT: fühle mich echt wie ein n00b!
Wie kann ich die verschiedenen Alternativen aus einer Tabellenspalte holen?
Ich habe ja diese Abfrage:
Code: Alles auswählen
$result = mysql_query("SELECT * FROM maskinlista ORDER BY id ASC");
Damit hole ich ja ALLES aus der Tabelle.
Ich möchte in einem Dropdown aber nicht ALLES anzeigen. Wenn Åkerman mehrmals vorkommt, will ich es ja nur EINMAL anzeigen, um es als Filter zu verwenden.
Wie muss ich prinzipiell vorgehen?
Ich möchte die Alternativen aus "maskinlista", Spalte "tillverkare" die Hersteller holen.
EDIT: hiermit bin ich schonmal weiter gekommen:
Code: Alles auswählen
Tillverkare
<select name="top5" size="3" multiple>
<?php
$result = mysql_query("SELECT tillverkare FROM maskinlista ORDER BY tillverkare ASC");
while ($r = mysql_fetch_array($result))
{
echo('<option value=' . $r['id'] . '>');
echo($r['tillverkare']);
echo('</option>');
}
?>
</select>
Maskintyp
<select name="top5" size="3" multiple>
<?php
$result = mysql_query("SELECT maskintyp FROM maskinlista ORDER BY maskintyp ASC");
while ($r = mysql_fetch_array($result))
{
echo('<option value=' . $r['id'] . '>');
echo($r['maskintyp']);
echo('</option>');
}
?>
</select>
Aber wie gesagt: wie zeige ich den Hersteller/Maschinentyp nur EINMAL an?
Verfasst: Mo 04.Dez, 2006 16:09
von oxpus
Nach ORDER BY ... in der Abfrage auch noch GROUP BY ... einfügen.
Und zwar auf die Felder, die gruppiert und damit nur einmal vorhanden sein sollen...
Verfasst: Di 05.Dez, 2006 09:22
von Holger
Leider klappt das so nicht:
Code: Alles auswählen
$result = mysql_query("SELECT tillverkare FROM maskinlista ORDER BY tillverkare GROUP BY tillverkare ASC");
Die Felder sind dann leer:
http://www.gremminger.se/service/compare/start1.php
Verfasst: Di 05.Dez, 2006 09:42
von Bootenks
wenn du möchtest, dass sich die Werte aus der Spalte "tillverkare" nicht wiederholen, dann musst du DISTINCT verwenden (nach dem SELECT)... und das nach der Gruppierung die Felder leer sind sollte auch klar sein
GROUP BY => die angegebene Spalte gilt dann als Bezeichner der Gruppe... ja aber was soll er denn dann da rein stecken?? Nebst "tillverkare" hast du nichts selektiert... (gibt das Sinn?)
Ach ja noch eine gravierende Sache:
ORDER BY muss hinter GROUP BY => sonst gibts da ein Syntaxfehler...

Verfasst: Di 05.Dez, 2006 09:47
von Holger
Verstehe ich nicht ganz, aber so wäre das besser?
Code: Alles auswählen
$result = mysql_query("SELECT tillverkare DESTINCT FROM maskinlista ORDER BY tillverkare ASC");
(Habe es versucht, klappt auch nicht!)
Verfasst: Di 05.Dez, 2006 09:54
von Bootenks
ist ja so auch falsch... (aso da hab mich vertippselt... DISTINCT)
ich denke du suchst einfach das:
Code: Alles auswählen
$result = mysql_query("SELECT DISTINCT tillverkare FROM maskinlista ORDER BY tillverkare ASC");
Dadurch erhälst du jedes mal nur einen Wert zum eindeutigen Inhalt in der Spalte "tillverkare".
So meinte es sicherlich Oxpus:
Code: Alles auswählen
$result = mysql_query("SELECT tillverkare FROM maskinlista GROUP BY irgendwelche_attribute ORDER BY tillverkare ASC");
Verfasst: Di 05.Dez, 2006 09:59
von Holger
Jawollja! Danke!
http://www.gremminger.se/service/compare/start1.php
EDIT:
nun habe ich aber zweimal eine ID ($r['id']) verwendet.
Ich denke, dass ist nicht besonders gut für die weitere Verarbeitung.
Wäre es vielleicht besser für value $r['tillverkare'] und $r['maskintyp'] zu verwenden?
So sieht es jetzt aus:
Code: Alles auswählen
<form action="visa.php" method="post">
Tillverkare
<select name="top5" size="3" multiple>
<?php
$result = mysql_query("SELECT DISTINCT tillverkare FROM maskinlista ORDER BY tillverkare ASC");
while ($r = mysql_fetch_array($result))
{
echo('<option value=' . $r['id'] . '>');
echo($r['tillverkare']);
echo('</option>');
}
?>
</select>
Maskintyp
<select name="top5" size="3" multiple>
<?php
$result = mysql_query("SELECT DISTINCT maskintyp FROM maskinlista ORDER BY maskintyp ASC");
while ($r = mysql_fetch_array($result))
{
echo('<option value=' . $r['id'] . '>');
echo($r['maskintyp']);
echo('</option>');
}
?>
</select>
</form>
Verfasst: Di 05.Dez, 2006 10:30
von Bootenks
irgendwie versteh ich deine Programmierung nicht...
Du hast statische Wände mit einer dynamischen Füllmenge Oo

???
Zum zweiten... wieso haben beide Auswahlboxen den selbigen Bezeichner? Wie willst du die Werte dann denn unterscheiden??
Und zu guter letzt: Was meinst du mit zweimal id verwendet??
Sorry irgendwie blick ich da jetzt nicht durch...
Ach so: wenn du assoziative Arrays haben willst dann nutz diese Funktion:
oder benutze den allgemeineren Typ + MYSQL_ASSOC Eigenschaft...
=>