WinFuture-Forum.de: [mysql] Nur Eine Bestimmte Zeile Auslesen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

[mysql] Nur Eine Bestimmte Zeile Auslesen

#16 Mitglied ist offline   MaDDiN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 997
  • Beigetreten: 18. Juni 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stink Tönis

geschrieben 05. Juli 2006 - 20:55

Beitrag anzeigenZitat (Floele: 05.07.2006, 21:13)

Ehm...Grundlagen nennst du das? Ich will ja nicht unhöflich sein, aber das sieht mir eher nach einem nur halb durchgelesenem Tutorial aus ;)


So kann mans auch nennen... ;)

Beitrag anzeigenZitat (Flo: 05.07.2006, 21:30)

Also müsste es am besten so aussehen:

$sql =  ("Select * FROM csforms WHERE CSNO ='" .  mysql_real_escape_string($_GET['csid']) . "';");


Und das ist dann die bessere Variante? Ich verlass mich da mal auf Euch :wub:
0

Anzeige



#17 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 05. Juli 2006 - 21:19

Beitrag anzeigenZitat (Kr1x: 05.07.2006, 21:39)

magic_quotes_gpc is meistens an, ansonsten in php.ini auf 1 setzen und auf zusätzliche addslash-sachen verzichten


Skripte abhängig von Servereinstellungen - besonders von dieser - zu machen ist eine sehr schlechte Idee. Die einzige gute Lösung ist meiner Meinung nach sowieso eine Datenbankklasse die automatisch alles escaped, wie z.B. AdoDB.
Sieht dann etwa so aus:

$db->Query('SELECT * FROM a WHERE b = ? AND c = ?', array('value', 'second value'));

Dieser Beitrag wurde von Floele bearbeitet: 05. Juli 2006 - 21:21

0

#18 Mitglied ist offline   RalfStoll 

  • Gruppe: Mitglieder
  • Beiträge: 3
  • Beigetreten: 08. Dezember 16
  • Reputation: 0

geschrieben 08. Dezember 2016 - 14:36

Ich habe da auch ein Problem mit "nur eine bestimmte Zeile auslesen".

Habe für unseren Sportverein eine Datenbank angelegt:

Abteilungsname | Art | Termin1 | Termin2 | Termin3 | -> bis Termin20
z.B.

1 | FC Bödingen | Fußball | 22.01.2017 Heimspiel vs. Söven | 23.01.2017 Gastspiel SV Rott | 24.01.2017 Heimspiel vs. Rott ...
2 | FC Bödingen | Handball | 23.01.2017 Heimspiel Handballverein Siefen | 24.01.2017 Gastspiel TV Siefen2 ...
3 | FC Bödingen | Turnen | 19.01.2017 Alte Herren | 20.01.2017 Kinderturnen | 23.01.2017 Damen |

Jede Abteilung hat somit bis zu 20 Termine.

Jetzt habe ich folgendes versucht, z.B. am 23.01.2017 soll $datumneu = date(d.m.Y) die Tabelle ausgelesen und dann folgendes nur angezeigt werden:


$Abteilungsname ($Art)
$Termin[]

Also am 23.01.2017 soll wie folgt ausgegeben werden:
FC Bödingen (Fußball)
23.01.17 Gastspiel SV Rott
<hr>
FC Bödingen (Handball)
23.01.2017 Heimspiel Handballverein Siefen
<hr>
FC Bödingen (Turnen)
23.01.2017 Damen

Es soll jeweils nur das entsprechende Termin[1-20]Feld angezeigt werden.

Ich rödel mir hier n Affen.
Kann mir jemand einen Tipp geben?

Ich vergass zu erwähnen, dass die Termine im Format:
20.01.2017 Damenturnen
21.01.2017 Kinderturnen pp. übermittelt werden, so dass ich mir die Arbeit erleichtern möchte, nicht für jede Abteilung und jeden Termin einen neuen Datensatz anlegen zu müssen, was ja einfacher wäre.
ich mach es auch nur nebenbei und bin in der Woche auch saumässig ausgelastet, was meine Arbeit anbelangt.
Wäre cool, wenn mir jemand einen Tipp geben könnte.
0

#19 Mitglied ist offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.591
  • Beigetreten: 14. August 15
  • Reputation: 392

geschrieben 08. Dezember 2016 - 17:49

Erstmal wäre es schön zu wissen um was es für eine DB geht. Excel ist z.B. keine Datenbank aber Tabellen kann man damit wunderbar anlegen ;)

Wenn du das in Excel oder LibreOffice Calc gemacht hast wird es kompliziert. In einer DB jedoch ist das einfach. Allerdings stimmt dann der Tabellenaufbau nicht.
AMD Ryzen 9 5950X, Asus ROG Strix X570-F Gaming, 32GB Corsair DDR4-3200, Asus Geforce GTX 3060 12GB, Creative Sound Blaster AE-7, 240GB SSD, 500GB SSD, 3x 1TB SSD, Win11 Home, 4x Acer G246HL Bbid, Logitech MX518 Gaming Mouse, Logitech G440 Mousepad, Logitech K120 Keyboard, Razer Tiamat 7.1 V2 Headset, Creative Inspire 5.1 5300 Soundsystem
0

#20 Mitglied ist offline   RalfStoll 

  • Gruppe: Mitglieder
  • Beiträge: 3
  • Beigetreten: 08. Dezember 16
  • Reputation: 0

geschrieben 08. Dezember 2016 - 18:51

Sorry ... ist eine MySQL Datenbank, Abfrage mit PHP...
0

#21 Mitglied ist offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.591
  • Beigetreten: 14. August 15
  • Reputation: 392

geschrieben 08. Dezember 2016 - 19:19

Die Tabelle sieht aber sehr nach Excel aus alles eine Tabelle zu werfen^^.

In SQL solltest du das in mind. 4 Tabellen teilen.

1. Tabelle Vereine
id
Name
Abteilungs_id

Hier werden die einzelnen Vereine eingetragen. Z.b FC Bödingen, FC Wusterhausen etc. Die ID muss eindeutig sein, der erste bekommt die 1, der zweite die 2 usw. Die Abteilungs_id ist die ID aus der Tabelle Abteilungen. So kannt man einem Vereine mehrere Bereiche zuordnen.

2. Tabelle Abteilungen
id
Name

Hier stehen alle möglichen Abteilungen drin die die Vereine haben wie Fussball, Handball, Turnen etc. Auch hier muss die ID eindeutig sein.
1 Fussball
2 Handball
3 Turnen
4 Schach
...

3. Tabelle Termine
Vereins_id
Datum
Art
Gegner_id

Hier stehen die einzelnen Termine drin. Wichtig ist hier, dass die Vereins_id die ID aus der Tabelle Vereine ist für die einzelnen Vereine. Deswegen darf der Wert nicht auf UNIQUE stehen. Datum ist klar, die Art ist HEIMSPIEL, AUSWÄRTs oder was auch immer. Die Gegner_id ist die ID aus der Tabelle Gegner.

5. Tabelle Gegner
id
Name

Hier kannst du alle Gegner mit Namen eintragen. Da die Gegner in einer Liga oder bei Freundschaftsspielen öfter auftreten ist es das beste sie fest zu vermerken

So und nun zu deiner Frage. Die Abfrage geht dann recht einfach per SQL

Warte aber mal kurz es könnte sich nochwas ändern, ich muss auch erstmal fix die Tabellen in SQL nachbauen. Ich antworte hier gleich weiter.
AMD Ryzen 9 5950X, Asus ROG Strix X570-F Gaming, 32GB Corsair DDR4-3200, Asus Geforce GTX 3060 12GB, Creative Sound Blaster AE-7, 240GB SSD, 500GB SSD, 3x 1TB SSD, Win11 Home, 4x Acer G246HL Bbid, Logitech MX518 Gaming Mouse, Logitech G440 Mousepad, Logitech K120 Keyboard, Razer Tiamat 7.1 V2 Headset, Creative Inspire 5.1 5300 Soundsystem
0

#22 Mitglied ist offline   RalfStoll 

  • Gruppe: Mitglieder
  • Beiträge: 3
  • Beigetreten: 08. Dezember 16
  • Reputation: 0

geschrieben 08. Dezember 2016 - 19:25

Ich wollte doch nur wissen, wie man das einzelne Tabellenfeld finden, auslesen und anzeigen kann, ohne dass die TermineX bis TermineY angezeigt werden. Das müsste doch möglich sein über einen Array, oder?
Vielen Dank.
0

#23 Mitglied ist offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.591
  • Beigetreten: 14. August 15
  • Reputation: 392

geschrieben 08. Dezember 2016 - 19:41

Das wird per SELECT in der DB gemacht und dazu müssen die Tabellen eine gewisse Form haben. Es ist wie geschrieben eine ziemliche Vergewaltigung der Datenbank alles in eine Tabelle zu schreiben. Sei geduldig, ich bin gleich fertig. :)

so:

CREATE DATABASE IF NOT EXISTS `ralfstoll`
USE `ralfstoll`;

CREATE TABLE IF NOT EXISTS `abteilungen` (
  `id` int(11) NOT NULL,
  `name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `abteilungen` (`id`, `name`) VALUES
	(1, 'Fussball'),
	(2, 'Handball'),
	(3, 'Turnen');

CREATE TABLE IF NOT EXISTS `gegner` (
  `id` int(11) NOT NULL,
  `name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `gegner` (`id`, `name`) VALUES
	(1, 'SV Rott'),
	(2, 'TV Siefen'),
	(3, 'Söven'),
	(4, 'SV Meppen');

CREATE TABLE IF NOT EXISTS `klasse` (
  `id` int(11) NOT NULL,
  `name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `klasse` (`id`, `name`) VALUES
	(1, 'Herren'),
	(2, 'Damen'),
	(3, 'Kinder'),
	(4, 'Alte Herren');

CREATE TABLE IF NOT EXISTS `termine` (
  `id` int(11) DEFAULT NULL,
  `verein` char(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `abteilungs_id` int(11) DEFAULT NULL,
  `datum` date DEFAULT NULL,
  `art` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `gegner_id` int(11) DEFAULT NULL,
  `klassen_id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `termine` (`id`, `verein`, `abteilungs_id`, `datum`, `art`, `gegner_id`, `klassen_id`) VALUES
	(1, 'FC Bödingen', 1, '2017-01-23', 'Auswärts', 1, 1),
	(2, 'FC Bödingen', 2, '2017-01-23', 'Heimspiel', 2, 2),
	(3, 'FC Bödingen', 3, '2017-01-23', 'Auswärts', 3, 3),
	(4, 'FC Bödingen', 3, '2017-01-23', 'Heimspiel', 4, 4);



Das sind nur die Tabellen mit den Testdaten. Am besten in einer neuen DB testen.

Der SQL Befehl um das ganze dann abzufragen ist

SELECT
verein,
abteilungen.name AS abteilung,
datum,
art,
gegner.name AS gegner,
klasse.name AS klasse
FROM
termine
INNER JOIN abteilungen ON termine.abteilungs_id = abteilungen.id
INNER JOIN gegner ON termine.abteilungs_id = gegner.id
INNER JOIN klasse ON termine.klassen_id = klasse.id
WHERE datum = '2017-01-23';

bei WHERE muss dann per PHP das Datum rein für welches du die Termine abfragen willst.

Das Result des Query ist ein Array. Du musst das demzufolge mit mysqli_fetch_assoc und einer For Schleife in einzelne Zeilen zerlegen um mit PHP darauf zugreifen zu können. Die inkludierten Felder sind verein, abteilung, datum, art, gegner, klasse.

Wenn du mit WHERE den Query noch weiter filterst z.b mit "AND termine.klassen_id = '1'" dann werden nur die Termine an dem Datum für die Herren angezeigt und das Result wird noch kleiner. In dem Fall eine Zeile.

Insgesamt solltest du dir merken, man macht kein SELECT * FROM xyz und versucht dann per PHP die nötigen Daten zu finden sondern man gestaltet den SELECT Query schon so, dass nur noch die nötigen Daten abgefragt werden.

Außerdem sind die Daten auf verschiedene Tabellen so zu verteilen, dass keine Doppelung oder Vervielfachung auftritt. Dadurch werden sie als Nebeneffekt sehr einfach erweiterbar.

Im deinem Fall könnte man soagr FC Bödingen aus der Tabelle Termine entfernen wenn es nur der eine Verein ist, diesen Text in einer PHP Variable speichern und bei Bedarf mit ausgeben.

Wenn es mehrere Vereine sind, müsste noch eine Tabelle vereine erstellt werden mit id, name und die id dann mit in die Tabelle termine eingetragen werden. Ist es nur ein Verein, dann kann wie geschrieben diese Angabe aus der DB verschwinden und in eine Variable wandern.

Was ich noch nicht berücksichtigt habe ist der Type der Begegnung also sowas wie Ligaspiel, Freundschaftsspiel und Trainingsspiel oder Turnierspiel. Das müsste dann noch in eine weitere Spalte.

Außerdem könnte man noch Art und Type in weitere 2 Tabellen auslagern und in der Tabelle termine nur die ID eintragen und beide Tabellen auch per JOIN mit in den Query aufnehmen.

Btw. Falls du den PHP Code dazu noch brauchst so melde dich.

Dieser Beitrag wurde von Gispelmob bearbeitet: 09. Dezember 2016 - 05:44

AMD Ryzen 9 5950X, Asus ROG Strix X570-F Gaming, 32GB Corsair DDR4-3200, Asus Geforce GTX 3060 12GB, Creative Sound Blaster AE-7, 240GB SSD, 500GB SSD, 3x 1TB SSD, Win11 Home, 4x Acer G246HL Bbid, Logitech MX518 Gaming Mouse, Logitech G440 Mousepad, Logitech K120 Keyboard, Razer Tiamat 7.1 V2 Headset, Creative Inspire 5.1 5300 Soundsystem
0

#24 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 09. Dezember 2016 - 00:26

Mh? In Tabellen gibt es doch gar keine Gegner. Nur Mannschaften, die gegeneinander spielen. Spiele sind denn auch sowas wie (spiel_id=PK; Partei1_id; Partei2_id; Spiel_TimeStamp; <weitere Attribute), wobei an dieser Stelle (partei1, partei2,Zeitstempel) ebenfalls PK-Kanditat wäre.

Entsprechend hat sich in der Abfrage bei
'INNER JOIN klasse ON termine.abteilungs_id = klasse.id'
ein Fehler eingeschlichen: Abteilungs-ID hat mit Klassen-ID nix zu tun, die sind unabhängig.

Ich stimm allerdings zu, daß mit der gegenwärtigen DB-Architektur kein Blumentopf zu gewinnen ist. Man könnte das sicherlich irgendwie alles da rein- und rauspatchen... aber längerfristig wird das wohl eher auf die Füße fallen.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#25 Mitglied ist offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.591
  • Beigetreten: 14. August 15
  • Reputation: 392

geschrieben 09. Dezember 2016 - 05:59

Beitrag anzeigenZitat (RalphS: 09. Dezember 2016 - 00:26)

Entsprechend hat sich in der Abfrage bei
'INNER JOIN klasse ON termine.abteilungs_id = klasse.id'ein Fehler eingeschlichen: Abteilungs-ID hat mit Klassen-ID nix zu tun, die sind unabhängig.
Ja, danke ist korrigiert ;)

Hauptsächlich muss ralfstoll verstehen dass man in Datenbanken für Termine nicht termin1, termin2, termin3 ... als Felder anlegt, weil das z.B. bei Personen/Vereinen die 5 Termine pro Tag und das das ganze Jahr haben nichts wird.

Termine werden wenn sie eine gleiche Basis haben, wie hier eine Spielbegegnung oder ein Ereignis, nur mit einem Feld termin in der Tabelle definiert und dann wird jeder Termin als einzelner Datensatz angelegt.

Die Daten selber werden von PHP ein- und ausgetragen. Wenn die Daten als z.B. CSV ankommen, dann liest man sie mit PHP ein und schreibt sie in der richtigen Aufteilung passend zu den Tabellen mit INSERT in die Datenbank.

Dieser Beitrag wurde von Gispelmob bearbeitet: 09. Dezember 2016 - 09:18

AMD Ryzen 9 5950X, Asus ROG Strix X570-F Gaming, 32GB Corsair DDR4-3200, Asus Geforce GTX 3060 12GB, Creative Sound Blaster AE-7, 240GB SSD, 500GB SSD, 3x 1TB SSD, Win11 Home, 4x Acer G246HL Bbid, Logitech MX518 Gaming Mouse, Logitech G440 Mousepad, Logitech K120 Keyboard, Razer Tiamat 7.1 V2 Headset, Creative Inspire 5.1 5300 Soundsystem
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0