Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
CMS nach Regionen ... [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
CMS nach Regionen ...


 
Hendrik33
17-08-2010, 11:32 
 
Hallo,

ich habe ein kleines CMS ...

Die Benutzertabelle users hat ein Feld mit dem Namen regionen.
Dort drin stehen IDs der Tabelle regionen ...

Sieht so aus:
:1: :3: :8:

Die werte zwischen den Doppelpunkten sind die IDs der Regionen (Tabelle Regionen)

Jetzt die Frage:

Es gibt die Tabellel news ebenfalls mit dem Feld regionen

Mein Ziel ist es nur News auszulesen, die man auch möchte (deshalb die Regionen die jeder Benutzer auswählen kann) ...

Wie würde da der SELECT Befehl lauten, ich krieg das leider nicht hin ?
Freue mich über jede Hilfe

Hendrik

 
combie
17-08-2010, 11:41 
 
A Visual Explanation of SQL Joins (http://www.codinghorror.com/blog/archives/000976.html)

 
Hendrik33
17-08-2010, 11:56 
 
Da steig ich nicht ganz durch :(

Habe jetzt mal folgenden Befehl eingegeben:
<?

include("config.php");

$query=mysql_query("SELECT * FROM events INNER JOIN kunden ON events.regionen = kunden.regionen", $conn);
while($fetch=mysql_fetch_array($query)) {
echo "$fetch[name]\n";
}
?>

Folgender Fehler erscheint dann:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/web1584/html/asd.php on line 6

 
combie
17-08-2010, 12:07 
 
mysql_error() würde dir den Fehler zeigen.

Tipp:
Verwende Aliase.
Und SELECT * ist böse.

 
Hendrik33
17-08-2010, 12:35 
 
Ich komme einfach nicht weiter ...

Um euch das Problem nochmals zu erklären habe ich hier den SQL Export rein getan:

Auszug User:

CREATE TABLE IF NOT EXISTS `users` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`nick` varchar(50) NOT NULL DEFAULT '',
`landkreis` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=2 ;

--
-- Daten für Tabelle `users`
--

INSERT INTO `kunden` (`ID`, `nick`, `landkreis`) VALUES
(1, 'Hendrik', ':10: :13: :7: :6: :5: :2: :1: :12: :8: :3: ');

----

Auszug Events:

CREATE TABLE IF NOT EXISTS `events` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`plz` text NOT NULL,
`ort` text NOT NULL,
`datum` text NOT NULL,
`regionen` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=18144 ;

--
-- Daten für Tabelle `events`
--

INSERT INTO `events` (`id`, `name`, `plz`, `ort`, `datum`, `regionen`) VALUES
(5295, 'Rockparty', '55116', 'Mainz', '10.02.2010', ':6:');



Jeder User kann verschiedene Regionen wählen ...

Das Event befindet sich in der Region 6

Ich möchte folgendes Ergebnis erzielen:
- nur die Events anzeigen wenn der User die Region (in diesem Fall 6) im Profil aktiviert hat.

 
combie
17-08-2010, 12:55 
 
':10: :13: :7: :6: :5: :2: :1: :12: :8: :3: 'Ein Verstoß gegen die erste Normalform!
Siehe:
Ein Relationstyp ist in der 1. Normalform, wenn alle Attribute maximal einen Wert haben. Am Kreuzungspunkt einer Spalte mit einer Reihe darf also maximal ein Datenwert stehen. Das Nichtvorhandensein von Daten ist zulässig.

Mit anderen Worten: Wiederholungsgruppen sind nicht erlaubt.
aus: Die 5 Normal Formen (http://reeg.junetz.de/DSP/node7.html)

Du benötigst für eine n:m Relation eine weitere Tabelle!

 
Hendrik33
17-08-2010, 13:10 
 
Anstatt ':3:...' etc.. müsste es dann '{3,2,4}' heißen oder was?

 
AmicaNoctis
17-08-2010, 13:25 
 
Nein, du brauchst eine dritte Tabelle, um das normalisiert umsetzen zu können. Google doch mal nach n:m-Relation, da findest du viele Erklärungen.

 
Hendrik33
17-08-2010, 13:32 
 
Hab schon gegoogelt finde aber nichts was verständlich für mich erklärt ist.

Ich verstehe das jetzt so:

Ich brauche eine Tabelle

users_regionen
mit den feldern id, user, regionen

aber dann steht doch dort in den regionen wieder mehrere werte drin ??

 
AmicaNoctis
17-08-2010, 13:43 
 
aber dann steht doch dort in den regionen wieder mehrere werte drin ??

Nein, nicht mehrere Werte sondern mehrere Datensätze:

1, 25, 2
2, 25, 4
3, 25, 5
4, 25, 12
5, 34, 2
6, 34, 8
7, 34, 9


User 25 hat die Regionen 2, 4, 5, 12 und User 34 die Regionen 2, 8, 9. Die Region 2 hat ihrerseits beide Benutzer zugeordnet.

 
Hendrik33
17-08-2010, 13:48 
 
Das habe ich jetzt verstanden alles klar!

Nur jetzt hakt es wieder und ich komme nich weida

 
AmicaNoctis
17-08-2010, 13:50 
 
Nur jetzt hakt es wieder und ich komme nich weida

Je mehr du daraus ein Geheimnis machst, desto geringer sind die Chancen auf Hilfe.

 
Hendrik33
17-08-2010, 14:11 
 
So hier nochmal alles was damit zusammenhängt:


Auszug User:

CREATE TABLE IF NOT EXISTS `users` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`nick` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=2 ;

--
-- Daten für Tabelle `users`
--

INSERT INTO `users` (`ID`, `nick`) VALUES
(1, 'Hendrik');

----

Auszug User Regionen:

CREATE TABLE IF NOT EXISTS `users_regionen` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(50) NOT NULL DEFAULT '',
`region` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=2 ;

--
-- Daten für Tabelle `users_regionen`
--

INSERT INTO `users_regionen` (`ID`, `user`, `region`) VALUES
(1, '1', '1');

----

Auszug Events:

CREATE TABLE IF NOT EXISTS `events` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`datum` text NOT NULL,
`location` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=18144 ;

--
-- Daten für Tabelle `events`
--

INSERT INTO `events` (`id`, `name`, `datum`, `location`) VALUES
(5295, 'Rockparty', ''10.02.2010', '1');

---

Auszug Locations:

CREATE TABLE IF NOT EXISTS `locations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`region` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=844 ;

--
-- Daten für Tabelle `locations`
--

INSERT INTO `locations` (`id`, `name`, `region`) VALUES
(1, 'Club...', '3');



Erklärung:
- Es ist ein Benutzer angemeldet, dieser kann wie oben schon beschrieben mehrere Regionen im Profil anwählen
- Die Regionen werden in der Tabelle users_regionen gespeichert, pro Region ein Dateneintrag
- Jetzt gibts es einen Eventkalender mit diversen Events, der User soll nur die Events sehen die in seiner Region sind.
- die Events sind aber nicht selbst mit einem Feld region belegt sondern haben nur das Feld location (verweisst mit Id auf extra tabelle)
- In der Location Tabelle gibt es dann neben den Details zur Location ein Feld mit dem namen region
- Dort steht wiederum eine Zahl ... (verweisst auf die Tabelle regionen)

Was ich suche ist den SQL Befehl um das so auslesen zu können!
Hoffe das hat jeder verstanden

 
AmicaNoctis
17-08-2010, 14:25 
 
Dazu musst du dich als nächstes über Joins informieren. Combie hatte dir diesbezüglich schon etwas empfohlen: Coding Horror: A Visual Explanation of SQL Joins (http://www.codinghorror.com/blog/archives/000976.html)

Fragen zu deinem DB-Design:

Warum verwendest du MyISAM und nicht InnoDB?
Warum sind users_regionen.user und users_regionen.region varchar, wenn sie doch auf die jeweilige ID (int) verweisen?
Warum ist locations.region vom Typ text, wenn dort doch auch nur die Regions-ID als int drin steht?
Warum ist events.datum vom Typ text, wenn MySQL dir doch so tolle Datumstypen wie z. B. datetime anbietet?

 
Hendrik33
17-08-2010, 14:34 
 
1. phpMyAdmin hat das so eingestellt
2. Hab das nur so reingetippt hier ... Die Typen sind natürlich nicht korrekt! Müssen int sein
3. Aller gleiches Spiel
4. Das weiß ich auch nicht, Dort ist einfach nur ein Timestamp eingespeichert ...

Ich probier jetzt mal rum, hab zwar keinen Plan wie das mit Joins funktionieren soll.
Hast du vllt einen Ansatz tipp für mich?

Aktuell:
Habs gepackt :)


SELECT *
FROM events , locations, users_regionen
WHERE events.loclink = locations.id
AND kunden_regionen.region = locations.gebiet
AND kunden_regionen.user = der benutzer ...;


hat der Code noch irgendwelche Verbesserungen?
in phpmyAdmin gehts jedenfalls ;) und es kommen auch nur die events aus dem gebiet ...

 
AmicaNoctis
17-08-2010, 15:10 
 
Sorry, aber das hier ist ein Hilfeforum, in dem es Tipps und Hilfe zur Selbsthilfe gibt, ein Bildungsinstitut ist es nicht. Entweder du lernst langsam mal Grundlagen oder engagierst dir jemanden gegen Bezahlung (http://www.php-resource.de/jobs/).


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:25 Uhr.