|
|
|
|
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
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
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]
|
|
|
|
|
|
Du hast keine Datenbank ausgewählt...
|
|
|
|
|
|
|
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();
?>
|
|
|
|
|
|
|
|
|
Lass mich raten. Die Tabelle existiert nicht?
|
|
|
|
|
|
|
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]
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
Ja das habe ich gerade herausgefunden, dass man mit query verschiedene Befehle senden kann. Wie kann ich mit query eine Tabelle erstellen?
|
|
|
|
|
|
|
|
|
|
|
Wohoooo!
MySQL macht ja richtig spass. Wie konnte ich nur so lange ohne das Teil leben?
|
|
|
|
|
|
|
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]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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]
|
|
|
|
|
|
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!
|
|
|
|
|
|
|
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...
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Limbi am 22.11.2006 14:56]
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
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?
|
|
|
|
|
|
|
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]
|
|
|
|
|
|
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...
|
|
|
|
|
|
|
Die Idee ist natürlich eleganter. Damit wollte ich dich aber so früh nicht konfrontieren.
Welche Mängel meinst du?
|
|
|
|
|
|
|
| Zitat von [Dicope]
Die Idee ist natürlich eleganter. Damit wollte ich dich aber so früh nicht konfrontieren.
Welche Mängel meinst du?
| |
Das obere sind "echte" Ungelesene Beiträge, das untere nicht!
|
|
|
|
|
|
|
| Zitat von Ashtray
| Zitat von [Dicope]
Die Idee ist natürlich eleganter. Damit wollte ich dich aber so früh nicht konfrontieren.
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.
|
|
|
|
|
|
|
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");
|
|
|
|
|
|
|
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?
|
|
|
|
|
|
|
| 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`
)
) |
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
Na wofür gibts denn das schöne @ Zeichen?
Danke!
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
Thema: MySQL Fragen |