Aufzählung & Nummernausgabe
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
array
ausgabe
auslese
code
date
datei
datum
funktion
http
inhalt
knopf
manual
person
post
spalte
speichern
string
tabelle
url
-
Hallo Zusammen,
Ich möchte gerne per MySQL eine arte "Gefällt mir" Funktion entwickeln.
Deswegen habe ich erstmal in MySQL eine neue Datenbank namens posts erstellt und dort dann folgende Bereiche eingerichtet:
-Username
-Content
-Date
-loves
-id (auto,max länge 8)
Nun habe ich dort einen einfachen test Beitrag per MySQL eingetragen und habe diesen auf einer Webseite ausgeben lassen. Genau darunter habe ich einenspan text Anklickbar gemacht ,sodass ich per Javascript Daten an eine 2te Datei abschicke. Dort soll dann jeweils einfach nur in der Spalte loves der Username ergänzt werden.
Derzeit ist der Inhalt der Spalte Folgender: MarvinKleinMusic;TestUser;
Doch die Ausgabe ergibt genau das so wie es dort steht. Gibt es eine art Möglichkeit das ; als trenner zu werten und es in der Ausgabe nicht zu berücksichtigen? Ebenso wie die Aufzählung als Zahl der gesammt Gefällt Mir angaben?
und wie kann ich den Inhalt per Mausklick auf den Span einfach um den Usernamen Ergänzen , bzw. bei erneutem klick wieder löschen lassen? :)
Vielleicht hat ja der ein oder andere hier eine Idee! :)
LG
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo,
Da hilft dir die PHP-Funktion explode()
http://www.php.net/manual/de/function.explode.php
<?php $a = "AUS DB"; $b = explode(";", $a); echo $b[0]; echo $b[1]; ?>
oder in einer Schleife ausgeben!
Viel Spaß -
Wow das ist der Hammer!
Doch wie kann ich jetzt alle Ausgaben als eine Zahl erhalten? ;)
LG -
Hi,
da hilft die Funktion count() http://www.php.net/manual/de/function.count.php
<?php $a = "AUS DB"; $b = explode(";", $a); $wieviel = count($b); echo $wieviel; ?>
und nun noch diese Frage beantworten:
und wie kann ich den Inhalt per Mausklick auf den Span einfach um den Usernamen Ergänzen , bzw. bei erneutem klick wieder löschen lassen? :)
hinzufügen:
1. auslesen der Daten aus der DB
2. einfach deinen String erweitern und wieder in der DB speichern
<?php $a = "AUS DB"; $a = $a . ";neuerName"; echo $a oder speichern in DB; ?>
löschen:
1. auslesen der Daten aus der DB
2. deinen String mit explode in array schreiben
3. mit array_search() nach Namen suchen
4. löschen und neuen String in DB speichern
<?php $a = "AUS DB"; $b = explode(";", $a); $wo = array_search('löscheNAME', $b) //gibt Schlüssel aus Array in $wo aus unset($b[$wo); //löscht den Namen $c = implode(";", $b); //array in string schreiben mit ; als Trennzeichen echo $c oder speichern in DB; ?>
Danke für die positive Bewertung, habe schon vielen geholfen aber noch nie eine bekommen :)
Have FUN
Beitrag zuletzt geändert: 28.3.2014 22:11:14 von michaelkoepke -
michaelkoepke schrieb:
Hi,
da hilft die Funktion count() http://www.php.net/manual/de/function.count.php
[code]
hinzufügen:
1. auslesen der Daten aus der DB
2. einfach deinen String erweitern und wieder in der DB speichern
Wie sieht es denn dabei aus wenn mehrere Personen gleichzeitig auf den Knopf drücken würden? Würde sich das dann vielleicht schneller ersetzen als es sich eintragen kann? :)
LG -
marvinkleinmusic schrieb:
Richtig, das ist möglich. Hinterher fehlt dann einer der beiden Einträge in der DB.
[...] Wie sieht es denn dabei aus wenn mehrere Personen gleichzeitig auf den Knopf drücken würden? Würde sich das dann vielleicht schneller ersetzen als es sich eintragen kann? :) [...]
Für dieses Problem habe ich noch keine ideale Lösung.
Eine vielleicht etwas unsaubere Möglichkeit wäre, mit flock() eine beliebige (evtl. leere) Datei zu reservieren. Dann führt man die Manipulation an der DB durch und gibt danach die Datei wieder frei.
Kennt jemand bessere Lösungen? -
Warum so hässlich und umständlich?
Anstatt die Daten in einem String zu speichern, solltest du dafür eine eigene Tabelle nutzen, die ca. so aussieht:
Wenn jemand auf »like« klickt trägst du die Post-ID sowie den Benutzernamen in diese Tabelle ein, wenn der Like wieder aufgehoben werden soll, löscht du ihn dort wieder raus.+----------+ | post | | username | +----------+
Und wie bekommst du dann die Anzahl bzw alle Posts mit Anzahl der Likes? Zum Beispiel so:SELECT P.id, P.username, P.content, P.date, COUNT(L.username) AS likes FROM posts P LEFT JOIN likes L ON L.post = P.id GROUP BY P.id
Erstellen eines Likes:INSERT INTO likes (post, username) VALUES (1, 'user1');
Löschen eines Likes:DELETE FROM likes WHERE username = 'user1' AND post = 1
Bei der Tabellendefinition der likes-Tabelle wäre eventuell noch ein »
« nicht schlecht, sodass alle Likes automatisch gelöscht werden, sobald der dazugehörige Post (oder Benutzer) entfernt wird.ON DELETE CASCADE
Bei dieser Variante gibts auch kein Problem mehr wegen Locking o.ä., da es völlig egal ist in welcher Reihenfolge wer und wie lange etwas einträgt oder löscht.
Beitrag zuletzt geändert: 29.3.2014 13:40:31 von hackyourlife -
Huhu HackYourLife!
Ja das erscheint mir simple und Logisch. Allerdings kann ich damit nichts anfangen da ich soeine MySQl schreibweise nie angewendet habe.
SELECT P.id, P.username, P.content, P.date, COUNT(L.username) FROM posts P JOIN likes L ON L.post = P.id GROUP BY P.id
Wofür steht dort P. und L.?
LG und danke schön! :) -
marvinkleinmusic schrieb:
Wenn du das mal in phpMyAdmin o.ä. ausführst solltest du die Fehlder »id«, »username«, »content«, »date« und »COUNT(L.username)« (oder nach meinem Edit »count«) als Rückgabewerte bekommen, und dieses Wissen sollte eigentlich bereits reichen, um das anwenden zu können.
Allerdings kann ich damit nichts anfangen da ich soeine MySQl schreibweise nie angewendet habe.
marvinkleinmusic schrieb:
Die kannst du dir aussuchen. Wenn du schreibst
Wofür steht dort P. und L.?
, dann kannst du auf die Felder der TabelleFROM tabelle T
mittabelle
zugreifen. DasT.feld
ist also ein Name / Abkürzung, den du einer Tabelle in einer Abfrage geben kannst. Wichtig ist das erst, wenn du eine Abfrage über mehrere Tabellen machst, denn dann kann es, wie in diesem Fall auch, vorkommen, dass mehrere Tabellen Spalten mit dem gleichen Namen enthalten, und woher weiß MySQL sonst welche Spalte in welcher Tabelle du meinst?T
Bei dieser Abfrage wäre das die Spalte
, welche sowohl in der Tabelleusername
als auch in der Tabelleposts
vorkommt.likes
-
marvinkleinmusic schrieb:
gar nicht ;) du brauchst schon etliche 1000 leute, die 'gleichzeitig' drücken (würden, wenn sie könnten).
... Wie sieht es denn dabei aus wenn mehrere Personen gleichzeitig auf den Knopf drücken würden? ...
fuerderer schrieb:
ohh ohh! uhh uhh! was ja nicht der sinn der sache wäre!!
... Richtig, das ist möglich. Hinterher fehlt dann einer der beiden Einträge in der DB.
Für dieses Problem habe ich noch keine ideale Lösung.
yo!
Eine vielleicht etwas unsaubere Möglichkeit wäre, mit flock() eine beliebige (evtl. leere) Datei zu reservieren. Dann führt man die Manipulation an der DB durch und gibt danach die Datei wieder frei.
Kennt jemand bessere Lösungen?
das mit der datei, ist eine sehr sehr schlechte lösung! warum? ein datenbankserver (egal welcher) ist im faktor 100 - 1000 mal schneller als eine combo von 'webserver + scriptsprache'.
ich zähle jetzt mal nur 1-2 lesestoff-stichworte zum thema auf:
'locking', 'locking read', 'deadlock', 'isolation level', 'mutex', 'rw-lock', 'latch' ..., o. etwas ausschweifender: 'session-specific temporary tables in a read-only transaction' ... und und und. (alles ist zu ergooglen in verbindung mit mysql.)
von 'verdammten strebern' kann noch dazu genommen werden: 'InnoDB Performance and Scalability Enhancements'.
(besonders:
- 14.2.12.2.3 :: 'Optimizations for Read-Only Transactions';
- 14.2.12.2.6 :: 'Non-Recursive Deadlock Detection';
- xx.x.xx.x.x :: was weiß is! sucht auch selber was ;).
einen geeigneten einstiegspunk in die 'phöse thematik' zu empfehlen ist nicht unbedingt einfach. ich mache jetzt aber trotzdem einen versuch für euch: locking reads. (gültige versionsnummern sind dazu: 4.1, 5.0, 5.1, 5.5, 5.6, 5.7. '5.7' habe ich willkürlich gewählt)
unbedingt beachten! geht in allen beiträgen 3-4 stufen in die tiefe bei den weiterführenden links! bei allen themen - bei allen links!
viel spaß ;)
Beitrag zuletzt geändert: 1.4.2014 1:32:31 von czibere -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage