Check E-mail plus check ...

rernanded

Erfahrenes Mitglied
Hallo,
ich habe folgendes Problem:

In meiner Datenbank sind zig Personen u.a. mit Email und Nicknamen gespeichert. Alles rechtskonform mit Double Opt In usw usf

Nun will ich sie an internen Umfragen teilnehmen lassen und checke dafür ob ihre Email-Adressen und ihre Namen sowie ihre Einverständnisse vorhanden sind.

Sie dürfen pro Jahr sechs Mal voten, zu beliebigen Zeiten, d.h. es gibt keine Deadlines für die Votes.

Die Aufgabe ist nun die sechs Votes pro Jahr getrennt in die dafür vorgesehenen Spalten der DB-Tabelle zu schreiben.

1. Vote in 'vote1', 2. Vote in 'vote2', 3. Vote in 'vote3' usw usf.

Dazu muß ich aber pro Person abfragen ob und welcher Vote schon erfolgt ist und den entsprechenden neuen Vote in die nächstfolgende freie Vote-Spalte schreiben.

Beispiel: Petra hat bereits 2mal gevotet, also sind vote1 und vote2 bereits "belegt", nun müsste ihr 3. Vote in vote3 gespeichert werden.

Tja und da bin beim Problem wie das zu lösen wäre.

Moni



PHP:
<p>Bitte hier EMAIL und NAME (= NICKNAME) eingeben um am VOTING teilnehmen zu können.</p>

  <form action="voting.php" method="post">
  
      <label>EMAIL</label>
      <input name="email" type="text" value="" size="100">
<br />
      <label>NAME</label>
      <input name="name" type="text" value="" size="100">
<br />
      <button type="submit">los zum VOTING</button>
   
  </form>
<?php
$email = $_POST["email"];
$name = $_POST["name"];
$pdo = new PDO('mysql:host=localhost;dbname=... ... ...);
$stmt = $pdo->prepare("SELECT * FROM blablabla WHERE email='$email' AND name='$name' AND approved='1'");
$stmt->execute([$email]); 
$user = $stmt->fetch();
if ($user) {
    echo "email AND name found"; // UND WEITERE AKTIONEN
} else {
    echo "email AND name NOT found";
} 
?>
 
Alles rechtskonform mit Double Opt In usw usf
Respekt, das war sicher keine triviale Aufgabe!

Mein Lösungsvorschlag: Lege keine festen 6 Spalten an sondern eine für alle Votes und dort die Votes im JSON-Format. Dann kannst Du mit den Mitteln deiner Programmiersprache über die Votes arbeiten und, wenn Du keine Leerelemente für nicht vorhandene Votes anlegst, ein neues Vote einfach anhängen.
 
Hi sempervivum, das ging ja fix. Nur habe ich wenig Erfahrung mit der json-Idee. Gibt es dazu eine gute und verständliche Doku?

Ist das eine gutes Beispiel?
PHP:
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "db-blablabla";

$conn = mysqli_connect($servername, $username, $password, $dbname);

if (!$conn) {
  die("Connection failed: " . mysqli_connect_error());
}

$sql = "UPDATE blablabla
SET votes = JSON_SET(votes, '$.wow', '123')
WHERE email = beispiel@weebbb.de";

if (mysqli_query($conn, $sql)) {
  echo "JSON field updated successfully";
} else {
  echo "Error updating JSON field: " . mysqli_error($conn);
}

mysqli_close($conn);

Und kann ich mit der json-Lösung auch die Anzahl der Votes (sechs pro Jahr) beschränken?
Moni
 
JSON wird von MySQL/MariaDB unterstützt. Ich habe bisher nicht intensiv damit gearbeitet, daher kenne ich auch kein Tutorial.
Erster Ansatz: Du kannst z. B. ein Array mit deinen Votes in einen JSON-String umwandeln mit der Funktion json_encode. Und anders herum auch wieder dekodieren mit json_decode.
Also in etwa so:
Code:
$votes = json_decode($deine_votes_aus_der_datenbank);
if (count($votes) < $maxVotes) {
    $votes[] = $newVote;
} else {
    // eine geeignete Behandlung dieses Falls
}
$sql = "UPDATE blablabla
SET votes = $votes
WHERE email = beispiel@weebbb.de";
Wenn ich mich richtig erinnere gibt es aber auch Datenbankfunktionen, die das Arbeiten mit JSON-Spalten unterstützen. Da bin ich aber noch nicht eingestiegen, Du müsstest es in der Doku nachlesen. Das wäre dann ein zweiter Ansatz.
 
Das ist in meinen Augen das falsche DB-Design. Ich würde es mit zwei Tabellen lösen.
Beispiel:
SQL:
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `email` varchar(64) NOT NULL,
  `approved` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
)
SQL:
CREATE TABLE `votes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`)
)
 
Das war mir klar, das das kommt. "Falsches Datenbankdesign" ist eine nichts sagende Pauschalaussage, mit der man alles und jedes fordern und ablehnen kann. Zweite Tabelle ist der klassische Lösungsansatz aber hier gilt "Haben wir schon immer so gemacht" ist kein guter Grund, etwas zu tun oder zu unterlassen. Sinnvoller: Sich die Nachteile vor Augen halten, wenn man n Spalten für gleiche Elemente anlegt:
Entweder man verschenkt Platz, wenn man nicht alle definierten Spalten nutzt. Oder anders herum, der Platz den man mal vorgesehen hat, reicht nicht. Beides trifft auf Monis Situation nicht zu, weil fest steht, dass sie nicht mehr als 6 Spalten braucht. Weiterer Nachteil: Man kann diese Spalten nicht z. B. mit einer Schleife bearbeiten. Dieser Nachteil entfällt, wenn man JSON verwendet.
Auch die Lösung mit einer zweiten Tabelle hat einen Nachteil: Unnötig kompliziert bei den Abfragen und der Pflege.
Die Entwickler der Datenbank unterstützen ausdrücklich JSON und es besteht kein rationaler Grund, davon keinen Gebrauch zu machen. Das rückwärts gewandte Vorgehen mit der zweiten Tabelle ist in diesem speziellen Fall nicht angebracht.
 
"Falsches Datenbankdesign" ist eine nichts sagende Pauschalaussage
Normalisierung besser?

Mit der Json-Lösung musst du jedes mal den String zerlegen, wenn ein Eintrag dazu kommt, alleine das ist doch schon Grund genug, das nicht zu machen.

Und nur, weil (im Moment) etwas nicht zutrifft, kann man es trotzdem besser machen.

Ich werde das hier aber nicht weiter diskutieren, da ich die Erfahrung gemacht habe, dass du ja sowieso alles besser weißt.
 
Hallo Ihr zwei,
also die json-Idee wirkt smart auf mich. Selbst wenn ich noch nicht genau weiß wie es funktioniert.
Um die Sache abzukühlen: Das ist jetzt keine Bevorzugung von irgendjemand.

Nochmals: Ich biete max. sechs Votes im Jahr, also brauche ich in dem json auch genau sechs Mal "Platz" dafür. Das kann ich mir noch nicht genau vorstellen.

Insoweit muß ich mich erstmal schlau machen wie das konkret script-technisch geht.
Eine Ableitung aus XML ist da sicherlich ein wenig hilfreich.

Wie zB sähe meine json Struktur aus, so?

{"votes":[
{ "vote1":"hillybilly" },
{ "vote2":"dullymully" },
{ "vote3":"tollykolly" },
{ "vote4":"" },
{ "vote5":"" },
{ "vote6":"" }
]}

Und wie wird festgestellt, dass 4-6 noch leer sind?

JSON-Feld in der MySQL-Datenbank - MyOOS Community Forum


MONI
 
Zurück