PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SQL] Gutscheine automatisch als eingelöst markieren



MrChicken
20.03.2013, 18:19
Hallo,

auf meiner Webseite gibt es die Möglichkeit Gutscheine einzulösen und auch selbst Gutscheine zu erstellen.

Nun ist es so, dass ein User der einen Gutschein erstellt, diesen auch selbst einlösen kann. Genau das möchte ich verhindern.



Ich habe für die Gutscheine 2 Tabellen.
In der einen stehen die Gutscheincodes mit fortlaufender ID (Tabelle Gutscheine):


ID|Code |Rest|Lose|geheim
1 |Test |124 |1000|1
...
7 |bla |33 |64534|1
...
23|Test |124 |1000|1
...
38|Keks |7 |5555|1

Dann gibt es eine Tabelle in der das einlösen eines Gutscheins gespeichert wird, damit er nicht mehrmals abgerufen werden kann (Tabelle: Gutschein_reload).



ID|UID |GutscheinID |Zeit
1 |36242 |1 |timestamp beim einlösen
2 |36242 |38 |timestamp beim einlösen

(User 36242 könnte also nur noch die Gutscheine 7 und 23 einlösen)
ID ist dabei auch fortlaufend, UID die KlammID des Users, GutscheinID ist aus Tabelle Gutscheine die ID, Zeit dürfte klar sein.


Nun habe ich das Formular für das Einlösen und das Erstellen von Gutscheinen auf der gleichen Seite (das soll auch so bleiben).

Beim erstellen wird generell nun in der Tabelle Gutscheine der Gutschein erstellt:

db_query("INSERT INTO ".$db_prefix."_gutscheine (code,rest,lose,geheim) VALUES usw usf.");

Wie löse ich es jetzt, dass dieser neue Gutschein in der Reloadtabelle gespeichert wird? Das einzige was eindeutig ist, ist die ID aus Tabelle Gutscheine.
Code, Wert, Rest usw. können doppelt vorkommen (Im Beispiel Gutschein 1 und 23).
Gibt es also eine Möglichkeit gleich nach dem erstellen des Gutscheines die ID abzugreifen und in die Tabelle Gtuschein_reload einzutragen??

Lokutos
20.03.2013, 19:01
db_query("INSERT INTO Gutschein_reload (UID,GutscheinID,Zeit) VALUES '".$_SESSION['uid']."', '".$GUTSCHEINVARIABLE."', ".time()." ");

unter der annahme das zeit timestamp ist die tabellen und spalten so heissen wie es da steht
code ist definitive so nicht einsatzfähig da ich z.b. auch die variablen des addons nicht kenne...

einfach gesagt mach der code nix anderes wie den ersteller in den reload zu schreiben beim erstellen.

Iwan933
21.03.2013, 16:26
Hallo MrChicken,

Evtl. Solltest du bissle umdenken. Statt alle benutzten Gutscheine aufzuschreiben UND in der ersten Tabelle stehen zu lassen, könntest du einfach die Gutscheine aus der ersten in die zweite Tabelle verschieben, so hast du eine klare Trennung zwischen noch nicht benutzten und schon benutzen Gutscheinen.

Ist aber nur ein Vorschlag, weis ja nicht ob du die in der ersten Tabelle noch brauchst. :O

MfG Iwan

MrChicken
21.03.2013, 23:04
Hallo MrChicken,

Evtl. Solltest du bissle umdenken. Statt alle benutzten Gutscheine aufzuschreiben UND in der ersten Tabelle stehen zu lassen, könntest du einfach die Gutscheine aus der ersten in die zweite Tabelle verschieben, so hast du eine klare Trennung zwischen noch nicht benutzten und schon benutzen Gutscheinen.

Ist aber nur ein Vorschlag, weis ja nicht ob du die in der ersten Tabelle noch brauchst. :O

MfG Iwan

Naja wenn ich die aus der ersten Tabelle nehme, können andere User die Gutscheine ja nicht mehr einlösen. Das ist ja auch nicht Sinn der Sache.

@Lokutos: Das funktioniert ja nicht, da ".$GUTSCHEINVARIABLE." ja nicht existiert. Die passende Variable (nämlich die ID) bekommt der Gutschein ja erst wenn er in die Datenbank eingetragen wird.
Mal schauen ich setz mich die Tage nochmal dran und versuche zumindest erstmal einen Workaround.

Lokutos
22.03.2013, 00:58
bei einem mysql insert in eine tabelle mit einem autoincrement wert kann man mit
http://php.net/manual/de/function.mysql-insert-id.php
ganz einfach die ID abfragen...

eaxo
29.03.2013, 23:50
Ich halte das für Tinnef den Gutscheinersteller in vms_Gutschein_reload einzutragen, er hat doch keinen Gutschein eingelöst. Sinnvoller und naheliegend ist doch der Eintrag in vms_Gutscheine:

SQL:
ALTER TABLE vms_Gutscheine ADD ersteller INT(6) ZEROFILL
Beim Einbuchen der Gutscheine:

db_query("INSERT INTO vms_gutscheine (code,rest,lose,geheim,ersteller) VALUES ('$code',$anzahl,$wert,$status,$uid)");
und bei der Anzeige bzw. beim Einlösen darauf achten das

&& $gutschein['ersteller'] != $_SESSION['uid'] ist, damit der Ersteller nicht Einlöser wird...

Iwan933
30.03.2013, 09:37
Irgendwie doppelpost Oo

Iwan933
30.03.2013, 09:52
Naja wenn ich die aus der ersten Tabelle nehme, können andere User die Gutscheine ja nicht mehr einlösen. Das ist ja auch nicht Sinn der Sache.

Ich dachte das wär der Sinn der Sache. :D
Also das eingelöste Gutscheine nicht nochmal eingelöst werden können. Benutze selbst Gutscheine und kann dir folgende Lösung Vorschlagen.

Eine Tabelle beinhaltet alle Gutscheine die noch einlösbar sind, sollte es die möglichkeit geben mehrere gleichnamige Gutscheine auf einmal zu erstellen statt fünfzigtausendmal unterschiedliche zu erfinden, so fügt man diese einfach mehrfach hinzu.

Wird ein Gutschein eingelöst, so wird er aus der Gutscheintabelle entfernt.
Ich zeige dir hier mal ein Beispiel wie es bei mir aussieht. (Achtung, ich benutze keine ID für die Gutscheine selbst da diese meiner Meinung nach irrelevant ist.)

Meine Tabellen sehen so aus:

unbenutzteCodes:
| uid | code | amount |


benutzteCodes:
| uid | code | amount | refid


Für dich:

uid = ID des Users der den Code erstellt hat
refid = ID des Users der den Code benutzt hat
code = code
amount = Lose

Gutscheine Erstellen:


#DB_MySQL ist meine Datenbank Klasse

# $uid = id des codeerstellers
# $code = gewünschter code
# $wert = wert des gutscheins

$db = new DB_MySQL();
$exists = $db->row_exists("SELECT uid, code, amount FROM unbenutzteCodes WHERE uid='".$uid."' AND code = '".$code."' AND amount = '$wert'") #ist ein komplett identischer gutschein von demselben user schon vorhanden ? WICHTIG das hier der wert stimmt, so ist es mögliche mehrere gleiche gutscheine zu erstellen

if($exists)
{
$db->query("INSERT INTO unbenutzeCodes (uid, code, amount) VALUES ('".$uid."', '".$code."', '".$wert."')");
}
else if(!$db->row_exists("SELECT uid, code, amount FROM unbenutzteCodes WHERE code = '".$code."'"))
{
#da der code noch nicht benutzt wurde
$db->query("INSERT INTO unbenutzeCodes (uid, code, amount) VALUES ('".$uid."', '".$code."', '".$wert."')");
}
else
{
if($db->row_exists("SELECT uid, code, amount FROM unbenutzteCodes WHERE uid='".$uid."' AND code = '".$code."'"))
{
#gutschein vorhanden, jedoch mit anderem wert
echo "Gutschein bereits benutzt, es kann nur ein Wert pro Code vorhanden sein";
}
else if($db->row_exists("SELECT uid, code, amount FROM unbenutzteCodes WHERE NOT uid='".$uid."' AND code = '".$code."'"))
{
#ein anderer Benutzer hat bereits einen derartigen gutschein erstellt
echo "Gutschein wird bereits verwendet";
}
}




Gutscheine einlösen:





#
# $id ist die userid des users der den gutschein grade benutzt
#

if(isset($_POST['code']) && $_POST['code'] != '')
{
#überprüft ob der code vorhanden ist und ob der benutzer nicht ersteller des Codes ist!
if($db->row_exists("SELECT uid, code FROM unbenutzteCodes WHERE code = '".$_POST['code']."' AND NOT uid = '".$id."' LIMIT 1"))
{
$row = $db->fetchRow();

#den gutscheincode aus der unbenutzen tabelle löschen
$db->query("DELETE FROM unbenutzteCodes WHERE uid = '".$row['uid']."' AND code = '".$row['code']."' LIMIT 1");

#den gutscheincode in die benutzten tabelle eintragen
$db->query("INSERT INTO benutzteCodes (uid, refid, code, amount) VALUE ('".$row['uid']."', '".$id."', '".$row['code']."', '".$row['amount']."')");


#irgendwas mit dem gutschein machen :)
#z.B dem user der den Code eingelöst hat das guthaben gutschreiben via mysql: UPDATE
}
}



MfG Iwan

PS: Hoffe ich hab nix vergessen :D

eaxo
31.03.2013, 11:51
[...]
Achtung, ich benutze keine ID für die Gutscheine selbst da diese meiner Meinung nach irrelevant ist.
[...]

Soll heissen das deine User Gutscheine nicht wiederkehrend auflegen kann?

Gesetzt den Fall, Refjaeger_bln legte monatlich eine DownlineRalley auf und möchte seine Refs am Anfang des Monats auf der Seite wissen, müsste er den Gutscheincode jedesmal neu mitteilen...
Mit ID hat man doch eine deutlich höhere Skalierbarkeit des Gutscheinbereichs.

@MrChicken:
Wenn du soweit bist denk mal über

SQL:
ALTER TABLE vms_Gutscheine ADD
(
zeit_erstellt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
zeit_start TIMESTAMP NULL DEFAULT NULL,
zeit_ende TIMESTAMP NULL DEFAULT NULL,
);
nach.

Iwan933
31.03.2013, 15:00
@eaxo

Ich kann dir leider nicht ganz Folgen, da userid und refid bei benutzten Gutscheinen hinterlegt sind kann im Falle eines Falles der Code 100%tig nachgetrackt werden. Ansonsten tauchen die Gutscheine nie wieder irgendwo auf, da die Refbeziehungen nicht aus den Gutscheinen abgeleitet werden, sondern serperat, beim Einlösen, festgelegt werden.


MfG Iwan