Sortierung

PHP, Ajax, CSS, HTML, Javascript
Eben für die wirklich Harten, die alles selber machen.
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Sortierung

Beitrag 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
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag von Holger »

AAAAHHH!!!!! :wall:
Also H1 H10 H11 H3 H5 Bääähhh!!

Hm, dann sortiere ich nach ID und ändere sie manuell in phpmyadmin ...
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag 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">&nbsp;</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
Zuletzt geändert von Holger am Mo 27.Nov, 2006 13:52, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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 --
Zuletzt geändert von oxpus am Mo 27.Nov, 2006 16:19, insgesamt 1-mal geändert.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag 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?
Zuletzt geändert von Holger am Mo 27.Nov, 2006 15:35, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag von Holger »

Dann kann ich

Code: Alles auswählen

$sql_where_ids
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?
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Öh, wenn dann so:

Code: Alles auswählen

$result = mysql_query("SELECT * FROM maskinlista $sql_where_ids ORDER BY id ASC");
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag 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']);
Zuletzt geändert von Holger am Mo 04.Dez, 2006 12:57, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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 ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag 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?
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Dazu wäre es geschickt, alle Checkboxen zu aktivieren oder das Formular "leer" zu senden...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag 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.
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Sofern keine Datensätze angehakt sind, sollte das Script alle anzeigen...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag von Holger »

Jawoll!
Ok! Klappt! :respect:

Jetzt wird es komplizierter ^a
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)
Zuletzt geändert von Holger am Mo 04.Dez, 2006 14:26, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag von Holger »

Alles klar! Werde ich mal versuchen!
Danke für Deine Unterstützung! Habe ein Menge gelernt bis hierhin! :anbet

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&nbsp;
<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&nbsp;
<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?
Zuletzt geändert von Holger am Mo 04.Dez, 2006 16:01, insgesamt 3-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag 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
Benutzeravatar
Bootenks
Beiträge: 1836
Registriert: Sa 29.Mai, 2004 23:36
Wohnort: G?rlitz (?stlichste Stadt Deutschlands)

Beitrag 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...

:D
Zuletzt geändert von Bootenks am Di 05.Dez, 2006 09:51, insgesamt 2-mal geändert.
Nur ein Informatik Student. ^^
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag 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!)
Benutzeravatar
Bootenks
Beiträge: 1836
Registriert: Sa 29.Mai, 2004 23:36
Wohnort: G?rlitz (?stlichste Stadt Deutschlands)

Beitrag 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");
Nur ein Informatik Student. ^^
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag 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&nbsp;
<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&nbsp;
<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>
Zuletzt geändert von Holger am Di 05.Dez, 2006 10:04, insgesamt 1-mal geändert.
Benutzeravatar
Bootenks
Beiträge: 1836
Registriert: Sa 29.Mai, 2004 23:36
Wohnort: G?rlitz (?stlichste Stadt Deutschlands)

Beitrag 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:

Code: Alles auswählen

mysql_fetch_assoc($result)
oder benutze den allgemeineren Typ + MYSQL_ASSOC Eigenschaft...

=>

Code: Alles auswählen

$r = mysql_fetch_array($result, MYSQL_ASSOC);
Zuletzt geändert von Bootenks am Di 05.Dez, 2006 10:35, insgesamt 3-mal geändert.
Nur ein Informatik Student. ^^
Antworten