Normalerweise bin ich ein Befürworter von Lehrbüchern.
Aber gerade im Bereich Webdesign muss ich Basi zustimmen.
Meiner Meinung nach muss man sein Wissen einfach an realen Projekten ausprobieren. Und wenn man nicht weiter kommt einfach googeln. Es gibt zu sehr vielem Problemen massig Beispiele wo man schauen kann wie es geht.
Webdesign ist ein Prozess den man nur durch lerning by doing lernen kann. Stupides Bücher abarbeiten bringt da denke ich eher weniger
Beiträge von eSmurf
-
-
ALTER TABLE `haupttblname`
`pic_cat` `pic_cat_id` INT UNSIGNED NOT NULL -- `alter_name` `neuer_name` ...-- fk anlegen
ADD CONSTRAINT `fk_pic_cat_id` -- name des fremdschlüssels
FOREIGN KEY (`pic_cat_id`) -- fremdschlüssel hier in der tabelle ist pic_cat_id
REFERENCES `my_new_tbl` (`pic_cat_id`) -- referenz ist die neue tabelle tabelle (dort liegen die auto increment keys `pic_cat_id`)
ON UPDATE CASCADE -- wenn der wert in der neuen tabelle ge-updated wird, dann cascade (übernehmen)
ON DELETE CASCADE -- wenn der wert in der neuen tabelle gelöscht wird, dann cascade (übernehmen)
-- möglich wäre hier: RESTRICT | CASCADE | SET NULL | NO ACTION
-- achtung - on delete cacade löscht die row, nicht nur die column/cell
-- einfach mal rumtestenIch habe das jetzt mal probiert auf eine andere Tabelle anzuwenden. leider kommt immer eine Fehlermeldung:
Zitat#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''bilder' ADD CONSTRAINT 'fk_user-id' FOREIGN KEY ('user-id') REF' at line 1
SQLALTER TABLE 'bilder' ALTER TABLE 'bilder' ADD CONSTRAINT 'fk_user-id' FOREIGN KEY ('user-id') REFERENCES 'users' ('id') ON UPDATE CASCADE ON DELETE CASCADE
Kurz zu meiner Struktur:
die Tabelle users hat den Primärschlüssel id.
Dieser soll als Fremdschlüssel in der Tabelle bilder stehen.
darum habe ich in dieser Tabelle die Spalte user-id als int feld angelegt.
Aber sql code funktioniert nicht. Was mache ich jetzt schon wieder falsch?
Die Spalte id in der Tabelle users würde ich ungerne bearbeiten, auch wenn sie blöd benannt wurde. Denn darauf bauen viele Php skripte auf und ich möchte ungerne alle dateien danach absuchen... -
Danke für die gute und ausführliche Erklärung.
pic_cat ist die Kategorie des Bildes. also zum beispiel folgendes:
HTML|pic_cat_id |pic_cat +---------------------+--------------- |1 | Landschaftsbilder |2 | Architekturfotos |3 | ....
Ich wollte aber eigentlich nicht den Unterschied zwischen . Foreign keys und Fremdschlüsseln wissen, sondern den Unterschied zwischen Fremdschlüsseln und JOIN's
-
Hallo,
die Thematik mit den Fremdschlüsseln in MYSQL habe ich noch nicht so ganz verstanden.
Und zwar habe ich die folge Tabelle angelegt:
[Blockierte Grafik: http://fs5.directupload.net/images/160609/lhk7gmqw.jpg]
Diese möchte ich jetzt normieren.
Dazu muss ich doch nur die Spalte pic_cat in eine extra Tabelle auslagern oder?
Wenn ich das auslager, muss ich ja irgenwie mit einem Fremdschlüssel auf diese Tabelle verweisen.
Da ich kein INNODB in PHPmyAdmin einstellen kann, kann ich ja scheinbar keine Fremdschlüssel direkt definieren.
Daher habe ich 2 Ansätze im Internet gefunden. Einmal über Foreign Key's und mit dem JOIN befehl.
Was genau ist da der Unterschied zwischen den beiden Methoden?Gruß
Torben -
danke für die schnelle antwort
-
Hallo,
ich habe noch ein Problem mit einem Formular. Wahrscheinlich ist es ein Standardproblem, aber ich konnte dazu nichts finden...Und zwar habe ich ein ein Formular, welches mit dem action-attribut eine php datei aufruft, welche die daten in eine Datenbank einträgt. Das klapp soweit auch.
Allerdings wird nach dem Absenden des Formulars die dort angegebene PHP-Datei aufgerufen.
Ich würde das ganze aber gerne im Hintergrund ausführen, so dass der User in der Datei mit dem Formular bleibt.
Wie lässt sich das mit PHP umsetzen?
Ich hoffe mein Problem ist verständlich -
-
Danke, so klappt es. Allerdings ist es hinderlich, das eine radio-element checked zu setzten, weil sich deren Status so nicht mehr ändert und der User so nicht mehr das formular absenden kann
-
Hallo,
ich habe mal wieder ein Problem.
Und zwar habe ich ein Formular, in welches am ende zwei Radio-Buttons eingebaut sind. Wenn dort eine Auswahl getätigt wird, soll das Formular automatisch abgeschickt werden.
Dazu habe ich folgenden Ansatz:HTML
Alles anzeigen<form method="post" action="pic_upload_extras.php" enctype="multipart/form-data" id="bildinfo" > ... <fieldset> <p>mehr Aufrufe erhalten und das Bild in der öffentlichen Gallerie posten?</p> <p class="uplratio_label"> <input class="uplratio" type="radio" name="public" value="Ja" id="postpublic"> Ja</p> <p class="uplratio_label"> <input class="uplratio" type="radio" name="public" value="Nein" id="notpublic"> Nein</p> <input type="submit" value="daten eintragen" class="btn-outline-inverse btn-lg"> </fieldset> </form> <script type="text/javascript"> if(document.getElementById('postpublic').checked) { document.getElementById('bildinfo').submit(); // Formular automatisch absenden //später noch Datenbankeintrag hinzufügen }else if(document.getElementById('notpublic').checked) { document.getElementById('bildinfo').submit(); // Formular automatisch absenden //später noch Datenbankeintrag hinzufügen } </script>
Aber egal welche Option ich auswähle, das Formular wird nicht abgeschickt...
Woran liegt das? Was mache ich falsch?
Gruß Torben
-
"eingegebener Username" ist das Was beim Registrierungsformular im Inputfeld mit dem Namen "username" als Nutzername eingegeben wird.
Dieser name wird dann in der DB in der Tabelle users in die Spalte "username" geschrieben.
Außerdem ist er in der Variable $username gespeichert.Schließlich wird diese in de Queryanweisung
verwendet.
Also muss an dieser Anweisung etwas falsch sein, was ich aber nicht verstehe
-
Zitat
PDOStatement::errorInfo(): Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'eingegebener Username' in 'where clause' )
Das ist die Fehlermeldung die dabei raus kommt.
Für die ersten Codes konnte ich keine Bedeutung finden. Aber aus dem dritten Teil kann ich entnehmen, dass irgendwas mit der where Anweisung nicht stimmt.
Der Spaltenname in der Tabelle heißt aber username und die Variable $username hat auch den eingegebenen Usernamenwert... ? -
Das eintragen in die DB mit dem insert-Query hat ohne Probleme funktioniert.
Das problem liegt bzw lag bei meinem select-Query.
Wenn ich in bei diesem Query den Fehler abfange:PHP$query = "SELECT id FROM users WHERE username = $username"; $userid = $pdo->query($query); if (!$userid) { echo "\nPDOStatement::errorInfo():\n"; print_r($userid->errorInfo()); }
bekomme ich die Fehermeldung: PDOStatement::errorInfo(): Fatal error: Call to a member function errorInfo() on a non-object in /home/stud/t/toro4621/public_html/registrieren.php on line 104
Zeile 104 ist print_r($userid->errorInfo());
Daraus schließe ich, dass $userid keinen Wert hat, weil der Befehl $userid = $pdo->query($query); so nicht funktioniert....
$userid = $pdo->lastInsertId(); ist atürlich der elegantere Weg, welcher Funktioniert uund welchen ich auch nutzen werde.
Aber für die Zukunft würde ich trotzdem gerne wissen, ob ich Datenbankeinträge mit dem oberen Befehl so auslesen kann, bzw was ich dabei falsch gemacht habe. -
Es könnte mit rand() aber vorkommen, dass 2 order mehr User den gleichen Aktivierungscode besitzen/bekommen.
Dadurch kann User A evtl User X aktivieren.
Stimmt, daran habe ich gar nicht gedacht. Habe ich nun korrigiert. Danke für den Tipp.
Ich hatte das Feld als Int definiert... Habe es jetzt aber auf char korregiertEdit:
Ich bin immer noch dabei, mich durch das Aktivierungscode-Skript zu beißen.
Und zwar möchte ich das ganze doch mit einer ID umsetzen.
Ich wollte bewusst keinen fertigen Code nehmen, weil ich die ganze PDO-Thematik endlich komplett verstehen will.
Dafür habe ich jetzt die Erstellung des Aktivierungscodes in eine andere Funktion ausgelagert.
Jetzt wollte ich dafür die ID aus der Datenbank auslesen...PHP$aktivierungscode = random_string(); $statement = $pdo->prepare("INSERT INTO users (username, email, passwort, aktivierungscode) VALUES (:username, :email, :passwort, :aktivierungscode)"); $result = $statement->execute(array('username' => $username, 'email' => $email, 'passwort' => $passwort_hash, 'aktivierungscode' => $aktivierungscode)); $query = "SELECT id FROM users WHERE username = $username"; $userid = $pdo->query($query);
... und dann an den Link anfügen:PHP$link = 'http://194.95.47.100/toro4621/aktivieren.php?userid='.$userid.'&code='.$aktivierungscode;
Das klappt aber nicht. Warum? Was habe ich falsch gemacht?Gruß
Torben
var_dump($userid); gibt mir übrigens bool(false) aus... aber das hilft mir leider auch nicht weiter -
Danke für deine Hilfe.
Es lag daran, dass ich das Feld als Integer definiert hatte, jetzt geht es. -
Hallo,
jetzt habe ich mich soweit in POD eingelesen, dass ich ein funktionierendes Registrierungsskript hinbekommen habe.
Das ganze läuft so ab, dass der User beim registrieren, seine Daten eingibt und diese dann in eine Datenbank geschrieben werden.
Zusätzlich gibt es dann noch die Spalte aktivierungscode.
Der aktivierungscode wird erzeugt, indem eine Zufallszahl mit md5 gehasht wird.
DIeser Code soll dann per Mail an die angegebene Mailadresse gesendet werden und zusätzlich in die DB eingetragen werden.
Das senden per Mail klappt, in die DB wird aber nichts eingetragen... Da steht immer noch 0.
Hier der entsprechende Codeausschnitt:PHP
Alles anzeigen$rand = rand(); $aktivierungscode = md5($rand); $statement = $pdo->prepare("INSERT INTO users (username, email, passwort, aktivierungscode) VALUES (:username, :email, :passwort, :aktivierungscode)"); $result = $statement->execute(array('username' => $username, 'email' => $email, 'passwort' => $passwort_hash, 'aktivierungscode' => $aktivierungscode)); if($result) { $showFormular = false; $jumpurl = "willkommen.php"; $link = "http://194.95.47.100/toro4621/activate_user.php?id=$aktivierungscode"; $betreff = "Accountaktivierung: eSmurf Fotocommunity"; $mailtext = "Hallo $username, \n\n Herzlich Willkommen in der eSmurf-Fotocommunity. \nNoch ein Schritt, dann kann es los gehen. \nBitte klicke auf den unten stehenden Link um deinen Account zu aktivieren: \n\n$link"; $absender = "bittenichtantworten@esmurf.de"; $headers = array(); $headers[] = "MIME-Version: 1.0"; $headers[] = "Content-type: text/plain; charset=iso-8859-1"; $headers[] = "From: {$absender}"; $headers[] = "Reply-To: {$absender}"; $headers[] = "Subject: {$betreff}"; $headers[] = "X-Mailer: PHP/".phpversion(); mail($email, $betreff, $mailtext,implode("\r\n",$headers)); echo "E-Mail wurde gesendet!"; echo "<meta http-equiv="refresh" content="0;url=$jumpurl" />"; }
Außerdem landet die Mail bei gmail automatisch im Spamordner, weil die Nachricht große ähnlichkeit mit anderen Spamnachrichten aufweist.
Das ist an sich ja auch klar.
Es gibt eine automatisch erzeugte Mail, mit einem erzeugten Link von einer Mailadresse die es gar nicht gibt.
Aber wie kann ich das verhindern? Solche Mails werden ja eigentlich überall versendet, wo man sich registriert.
Wie machen andere das?Gruß
Torben -
Ich habe mir den Code jetzt ein paar Tage später nochmal genauer angeschaut und festgestellt, dass ich den Befehl die Daten in die Datenbank zu schreiben, doppelt drin hatte. Das habe ich jetzt geändert.
Damit geht es.
Manchmal sieht man den Wald vor lauter Bäumen nicht.Jetzt muss ich nur noch Hoffen, dass möglichst schnell viele Suchmaschinen vorbei kommen
-
Hallo,
mir ist gerade aufgefallen, dass eine Verlinkung im PHP-Kurs nicht richtig funktioniert.
Und zwar kann ich in der Übung zum Affenformular (http://www.php-kurs.com/affenformular-quellcode.htm) nicht zum Ablaufplan kommen.
Folge ich dem Link: http://www.php-kurs.com/bilder/affenformular.png
bekomme ich die Startseite ohne CSS-Formatierung angezeigtFalls solche Fehlermeldungen nicht gewünscht sind, bitte für die Zukunft bescheid sagen.
Gruß
eSmurf -
Hallo,
ich habe mal wieder ein kleines Verständnisproblem.
Und zwar benötige ich für mein Projekt eine Liste mit den IP-Adressen von möglichst vielen Such-Bots.
Da ich sowas nicht gefunden habe, dachte ich mir, bastel ich mir ein kleines "Fangprogramm" zusammen, welches mir die IP-Adressen in eine Datenbank schreibt.
Das klappt soweit auch.
Jetzt wollte ich aber doppelte Einträge vermeiden.
Dafür nutze ich das folgende Skript:PHP
Alles anzeigen<?php if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } $host = gethostbyaddr($ip); echo "IP Adresse: $ip<br>"; echo "Hostname: $host"; $sql = " INSERT INTO `adressen` ( `id` , `ip_adresse` , `host` ) VALUES ( NULL , '$ip', '$host' ); "; $db_erg = mysqli_query($db_link, $sql) or die("Anfrage fehlgeschlagen: " . mysqli_error()); $control = 0; $abfrage = "SELECT ip_adresse FROM adressen WHERE ip_adresse = '$ip'"; //prüfen ob ip berereits vorhanden $ergebnis = mysqli_query($db_link, $abfrage); while($row = mysqli_fetch_object($ergebnis)) { $control++; } if($control !=0) { //wenn ip bereits eingetragen echo "<br /> IP bereits vorhanden"; } else { $eintrag = "INSERT INTO adressen (ip_adresse, host) VALUES ('$ip', '$host')"; $eintragen = mysqli_query ($db_link, $eintrag); if ($eintragen == true) { echo "IP-Adresse wurde eingetragen"; } else { echo "Fehler im System"; } } ?>
Ja ich weiß aus dem anderen Topic, dass man Variablen nicht direkt in die SQL-Befehle schreiben soll. Das ändere ich noch, sobald ich mich mehr mit pdo beschäftigt habe.
Theoretisch sollte die IP-Adresse nur einmal eingetragen werden. Wenn sie schon in der Datenbank steht, sollte die IP-Adresse nicht eingetragen werden. Stattdessen, sollte die Meldung kommen, dass die IP-Adresse schon existiert.
Wenn ich diese Seite aufrufe, erscheint die Meldung zwar, aber trotzdem wird die Datenbank nocheinmal mit der selben Adresse befüllt.
Aber warum? Wenn die If-Anweisung zutrifft, sollte die Else-Anweisung, welche die Daten in die Datenbank schreibt doch übersprungen werden?Außerdem steht meine IP-Adresse im folgenden Format in der DB: 2a02:8109:91c0:19dc:105b:404d:cda4:55c9 liegt es daran, dass es eine IPV6 IP-Adresse ist? Oder kann ich den Hexadezimalen wert einfach in einen normalen Wert umrechen?
-
Danke für eure Hilfe.
die Datenbankverbindung habe ich nun hinbekommen...
Kann ich das jetzige Skript einfach in pdo umschreiben?
Wenn ich das richtig verstanden habe, muss ich dafür nur den Befehl für die Datenbankverbindung ändern, sowie den mysqli_query() - Befehl?
Oder muss ich noch mehr beachten? -
Hallo,
ich habe mich jetzt doch entschieden ein eigenes Login- und Registrierungsskript zu schreiben.
Dafür habe ich mich in den letzten Tagen etwas eingelesen und habe jetzt ein Skript für die Registrierung geschrieben, welches meiner Meinung nach funktionieren sollte...
Einige MySQL- Befehle bereiten mir aber noch Probleme.Und zwar bekomme ich folgende Fehlermeldung auf meinem lokalen Testserver (XAMPP):
ZitatFatal error: Call to undefined function mysql_query() in C:\xampp\htdocs\test\register.php on line 33
Auf meinem realen Server erhalte ich:
ZitatWarning: mysql_query(): Access denied for user ''@'localhost' (using password: NO) in /home/stud/t/toro4621/public_html/test/register.php on line 33
Zeile 32-33 sieht bei mir so aus.
Kann mir jemand sagen wo genau der Fehler liegt? Ich finde es selbst leider nicht raus.