Du bist nicht eingeloggt! Möglicherweise kannst du deswegen nicht alles sehen.
  (Noch kein mods.de-Account? / Passwort vergessen?)
Zur Übersichtsseite
Hallo anonymer User.
Bitte logge dich ein
oder registriere dich!
 Moderiert von: Che Guevara


 Thema: MySQL Fragen
[1] 2 nächste »
erste ungelesene Seite | letzter Beitrag 
Limbi

Arctic
Hey Leute

HTML und PHP habe ich voll im Griff. Nun habe ich mehrere Jahre Gästebücher und Foren programmiert und dabei ständig auf MySQL verzichtet. Soll heissen, dass ich bis jetzt Datensätze ständig mit Trennzeichen habe in Dateien schreiben lassen.
Aber nun kommt ein grösseres Projekt auf mich zu, sodass ich nicht mehr auf MySQL verzichten kann.

Und zwar benötige ich bloss 2 oder 3 grundlegende Fragen beantwortet haben, damit ich mit MySQL selber etwas herumexperimentieren kann.

Grundlegend (bitte korrigieren, wenns nicht stimmt):
Es muss immer eine Verbindung zu einer MySQL Datenbank aufgebaut sein, damit man Datensätze lesen, oder schreiben kann.
Folglich müssten die ersten Codes einer MySQL Seite so aussehen:

Laut selfphp.info:
<?
$db_server = 'localhost';
$db_name = 'mysql';
$db_user = 'limbi';
$db_passwort = 'mods';
$db = @mysql_connect($db_server, $db_user, $db_passwort);
?>

Meine erste Frage wäre: Würde ich ein Forum kreieren, so müsste jeder User eine eigene Datenbank bekommen, richtig?
Das heisst für jeden User muss "mysql_create_db ( )" ausgeführt werden.

Meine zweite Frage:
Mit welchem Code schreibe ich nun Datensätze in eine Datenbank. Bitte gebt mir einfach die simpelste Form an, wie ich zum Beispiel eine Zahl speichere und wieder ausgeben kann. Selfphp kommt in diesem Fall nicht klar rüber. So benutzt man wohl mysql_query(), richtig? Bei mir will das aber nicht so richtig funktionieren. Eine Verbindung zur Datenbank wird aber hergestellt.

Wäre froh und dankbar, wenn mir jemand diese Fragen schnell beantworten könnte.

Limbi
19.11.2006 19:05:39  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Netbeater

snow
1) richtig
2) falsch, du brauchst genau eine Datenbank
3)
 
PHP:
<?php
mysql_connect
(...);
mysql_select_db(...);
mysql_query('INSERT INTO numbers (value) VALUES (1)');
$res mysql_query('SELECT value FROM numbers');

while(
$row mysql_fetch_assoc($res)) {
    echo 
$row['value']."\n";
}

mysql_close();
?>


schreibt eine Zahl in die Tabelle "numbers" in die Spalte "value" und gibt anschließend alle Zahlen aus die jemals eingetragen wurden.
19.11.2006 19:42:22  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Danke für die Antwort.
Ich bekomme folgende Fehlermeldung:
 
PHP:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in mysql/index.php on line 26


Der vollständige Code sieht so aus:
 
PHP:
<?PHP
$db_server 
'localhost';
$db_name 'test';
$db_user 'limbi';
$db_passwort '****';
mysql_connect($db_server$db_user$db_passwort);

mysql_query('INSERT INTO numbers (value) VALUES (1)');
$res mysql_query('SELECT value FROM numbers');

while(
$row mysql_fetch_assoc($res)) {
 echo 
$row['value']."\\n"
}

mysql_close();
?> 
[Dieser Beitrag wurde 4 mal editiert; zum letzten Mal von Limbi am 19.11.2006 20:29]
19.11.2006 20:26:28  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
Du hast keine Datenbank ausgewählt...
19.11.2006 20:29:17  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Auch so kommt die Fehlermeldung (mit mysql_select...):
 
PHP:
<?PHP
$db_server 
'localhost';
$db_name 'test';
$db_user 'limbi';
$db_passwort '****';
mysql_connect($db_server$db_user$db_passwort);
mysql_select_db($db_name); 

mysql_query('INSERT INTO numbers (value) VALUES (1)');
$res mysql_query('SELECT value FROM numbers');

while(
$row mysql_fetch_assoc($res)) {
 echo 
$row['value']."\\n"
}

mysql_close();
?> 
19.11.2006 20:31:21  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Meister Zopf

meister_zopf
Lass mich raten. Die Tabelle existiert nicht?
19.11.2006 21:36:55  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Und wie erstell ich dann die Tabelle?

/edit: Achso! Kann es sein, dass ich die Tabllen unter phpMyAdmin erstellen muss?

Wohoooo! Es funktioniert! Man muss tatsächlich die Tabellen erst unter MyAdmin definieren. Kann man die Tabellen auch mit PHP erstellen?
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Limbi am 19.11.2006 21:52]
19.11.2006 21:38:42  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
FoxHunter

foxhunter2
Also bevor du hier so elementare Fragen stellst würde ich wirklich mal empfehlen ein Tutorial oder noch besser Buch zu MySQL zu lesen, dann haste die Grundzüge von (My)SQL drin.
Mit mysql_query kannste afaik beliebige SQL-Befehle ausführen, was dann auch zu Problemen wie SQL-Injections führen kann, ein beliebter Fehler bei Anfängern.
19.11.2006 22:13:20  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Ja das habe ich gerade herausgefunden, dass man mit query verschiedene Befehle senden kann. Wie kann ich mit query eine Tabelle erstellen?
19.11.2006 22:28:40  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
FoxHunter

foxhunter2

-> http://www.mysql.org/doc/refman/5.1/de/index.html

CREATE TABLE und so...
19.11.2006 22:32:37  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Wohoooo!
MySQL macht ja richtig spass. Wie konnte ich nur so lange ohne das Teil leben?
19.11.2006 22:39:24  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
In einem Forum. Werden da sowohl die Threads als auch die Posts zum Thread als jeweils neue Tabellen definiert? Oder werden nur die Threads als neue Tabellen definiert und die Posts dann in die jeweiligen Tabellen - Felder geschrieben?

CREATE TABLE 'MySQL Fragen'(
username char(5) NOT NULL,
titel varchar(30) NOT NULL,
datum date)
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Limbi am 19.11.2006 23:16]
19.11.2006 23:15:28  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Smoking

AUP Smoking 09.09.2023
http://tut.php-q.net/mysql.html

Bevor du weitere Frage stellst, arbeite bitte erstmal das o.g. Tutorial durch.
19.11.2006 23:20:23  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Ah sehr schön. Danke!
19.11.2006 23:24:00  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Ok jetzt brauche ich aber doch noch Eure Hilfe:

Vor 3 Tagen mit MySQL begonnen und schon steht ein Forum.
Was mir Kopfzerbrechen bereitet ist nun eine Funktion die überprüft, ob man ein Thread bereits gelesen hat oder nicht.

Wie würdet ihr das in die Datenbank speichern? Als eine separate Tabelle, jeweils die ThreadID und die UserID eintragen?
Oder ich dachte ich lasse nach jedem Post in die Tabelle "Users" in die Zeile "Unread" die ThreadID eintragen. So kann ich der User alle seine ThreadIDs anzeigen lassen, die er noch nicht gelesen hat. Besucht der User ein Thread wird die ThreadID von der Kolonne "Unread" entfernt.

Dazu muss aber folgender Befehl irgendwie funktionieren.

mysql_query("UPDATE Users SET `Unread`=Unread '$TID'");

Wie kann ich das perfektionieren? Ich dachte ich schreibe in die Spalte die Threads mit einem Trennzeichen ein.

Also es müsste irgendwie so funktionieren:
mysql_query("UPDATE Users SET `Unread`=`Unread`|'$TID'");

Ihr wisst sicherlich was ich zu bewerkstelligen versuche.
Die ThreadIDs sollen mit | getrennt werden. Am Schluss soll die Spalte dann etwa so aussehen:
10|2|22|11
Also ThreadIDs, die vom User noch nicht besucht wurden.

Oder kennt Ihr eine elegantere Methode?

Dankeschön!
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Limbi am 22.11.2006 14:43]
22.11.2006 14:43:16  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Ashtray

ashtray2
So hab ich das auch mal gemacht, aber bei einer Sache mit maximal 10 einträgen.

Überleg mal was passiert wenn sich jemand ein paar Threads nicht ansieht (und ansehen will).

Nach ein paar Monaten stellst du die Spalte auf Blob um weil nicht mehr genug platz ist.

Vom Aufwand jedesmal allen Usern ein "Unread" zu geben wenn ein neuer Thread erstellt wird garnicht erst zu reden.

Überleg dir da lieber was anderes!
22.11.2006 14:50:22  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Na schön, dann verpasse ich halt jedem Thread eine Spalte "Read" in der die UserIDs gespeichert werden, die den Thread gelesen haben.
Der Thread, der die UserID nicht hat -> Ungelesen

Besser?

Hm obwohl ich denke nicht... Augenzwinkern
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Limbi am 22.11.2006 14:56]
22.11.2006 14:54:52  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
Zwei Datensätze in einer Zelle ist böse.

Ich würde lieber eine Tabelle User -> gelesene Threads machen und die nach Userid geordnet halten.
22.11.2006 15:00:14  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Moment eklär das bitte genauer.
In die Tabelle "Users" eine Spalte mit "gelesenen Threads" einfügen?

Oder wie wäre es, wenn jeder User eine eigene Tabelle mit ungelesenen Threads bekommt? War das deine Idee?
Die Frage ist dann:
Gibt's Limits was Tabellen betrifft? Oder kann man unendlich viele Tabellen erstellen lassen?
22.11.2006 15:06:24  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
Eine neue Tabelle:

uid tid
1 141354
1 567657
2 141354
... ...
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von [Dicope] am 22.11.2006 15:09]
22.11.2006 15:09:03  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Hey das ist gut!
Das ist sogar verdammt genial!

Danke! Mal sehn was sich da machen lässt.

Ansonsten habe ich mir noch überlegt mit Timestamps zu arbeiten. Letzter Besuch registrieren lassen. Alle Timestamps, die nach dem Besuch hinzugekommen sind, sind neu. Allerdings hat diese Idee auch Mängel...
22.11.2006 15:15:09  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
Die Idee ist natürlich eleganter. Damit wollte ich dich aber so früh nicht konfrontieren. Breites Grinsen

Welche Mängel meinst du?
22.11.2006 15:17:40  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Ashtray

ashtray2
 
Zitat von [Dicope]

Die Idee ist natürlich eleganter. Damit wollte ich dich aber so früh nicht konfrontieren. Breites Grinsen

Welche Mängel meinst du?




Das obere sind "echte" Ungelesene Beiträge, das untere nicht!
22.11.2006 15:22:03  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
 
Zitat von Ashtray

 
Zitat von [Dicope]

Die Idee ist natürlich eleganter. Damit wollte ich dich aber so früh nicht konfrontieren. Breites Grinsen

Welche Mängel meinst du?




Das obere sind "echte" Ungelesene Beiträge, das untere nicht!


Aaah. Denkfehler.
Ich hab "Ungelesene Beiträge" mit "Beiträge seit deinem letzten Besuch" verwechselt.
22.11.2006 15:25:21  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Naja also deine Idee ist auf alle Fälle besser.

Frage:
Ich lasse mir jetzt eine Tabelle erstellen 'ThreadsR'.

mysql_query("CREATE TABLE ThreadsR (uid INT(6), tid INT(6))");

Wenn jemand die Seite view.php aufruft, soll die UserID eingetragen werden sowie die ThreadID.

mysql_query("INSERT INTO ThreadsR (uid,tid) VALUES ($uid,$tid)");

Allerdings will ich doppelte Einträge vermeiden. Was mach ich da?

Ich würde das, da ich noch nicht der Chef auf MySQL Gebiet bin, auf unelegante Weise lösen:

$res = mysql_query("SELECT * FROM ThreadsR WHERE TID=$tid && UID=$uid");
$result = mysql_fetch_row($res);
if(empty($result[0])){
mysql_query("INSERT INTO ThreadsR (uid,tid) VALUES ($uid,$tid)");}

Ich brauche soeine Überlegung wie:
mysql_query("INSERT INTO ThreadsR (uid,tid) VALUES ($uid,$tid)" WHEN uid!=$uid OR tid!=$tid");
22.11.2006 15:35:28  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Achja:
Nochwas was mich fertig macht.
Und das ist wohl ein Firefox BUG.

Ich habe eine Hits Funktion geschrieben:

mysql_query("UPDATE Threads SET Hits=(Hits+1) WHERE TID=".$tid." && ID=".$t_ID);

Wenn ich das mit dem Internet-Explorer aufrufe, läuft alles korrekt. Die Hitszahl steigt ständig um 1.
Rufe ich diese Funktion, bzw. diese Seite mit Firefox auf, so steigt die Hitszahl ständig um 2!!

Also was soll das? Öffnet Firefox die Seite so wie 2x auf?

Ist das Problem bekannt?
22.11.2006 16:02:59  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
...
 
Zitat von Limbi

Allerdings will ich doppelte Einträge vermeiden. Was mach ich da?

 
Code:
CREATE TABLE IF NOT EXISTS `ThreadsR` (
  `uid` INT( 6 ) UNSIGNED NOT NULL ,
  `tid` INT( 6 ) UNSIGNED NOT NULL ,
  CONSTRAINT `foo` UNIQUE (
    `uid`,
    `tid`
  )
)
22.11.2006 16:45:06  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
Ach ja - dass du damit Fehlermeldungen am laufenden Band produzierst, dürfte klar sein. In diesem Fall ist es aber erlaubt, einfach INSERT IGNORE zu machen. Breites Grinsen
22.11.2006 16:53:20  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Limbi

Arctic
Na wofür gibts denn das schöne @ Zeichen? Breites Grinsen
Danke!
22.11.2006 16:58:50  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
Näää...

immer das Problem an der Wurzel anpacken.

Deswegen hab ich das ja auch mit unique constraints gemacht und nicht auf der SQL-Befehl- oder sogar PHP-Ebene.

Und von daher ist IGNORE besser als @, vor allem da fehlerhafte SQL-Befehle keine PHP-Fehlermeldung generieren.
22.11.2006 17:01:34  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
 Thema: MySQL Fragen
[1] 2 nächste »

mods.de - Forum » Webdesign & Coding » 

Hop to:  

Thread-Tags:
| tech | impressum