check op geldige items in database
Ben een scriptje in elkaar aan het bouwen dat het serialnummers toevoegt aan database, maar dat die eerst hele reeks beveiliging naloopt.
Dus als de serialnummer niet aanwezig is in database, mag die opgeslagen worden in ander tabel. Mocht er dezelfde serial is toegevoegd door de ander gebruiker, krijgt die gebruiker melding dat die serial al is gebruikt.
Ook al als die gebruiker wel goeie serial heeft ingevoerd, maar dan in verkeerde versie of product, krijgt die ook melding dat het fout is.
Alleen..het wil niet werken bij mij..de 1e beveiliging werkt wel...de 2e niet..die om te controleren of versie e/o product wel goed is ingevuld.
De code ziet er uit..
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// check for serialnumber
$query = "SELECT * FROM #__productserial as prod, #__serial_".$_POST['versionid']." as seri WHERE seri.serialnumber='".$_POST['serial']."' AND seri.serialprodid='".$_POST['product']."'";
$database->setQuery( $query );
if ($serial_checks = $database->loadObjectList() ) {
foreach($serial_checks as $serial_check){
$serialnumber = $serial_check->serialnumber;
$serialtrue = $serial_check->serialused;
$childserial = $serial_check->childserial;
$userid = $serial_check->userid;
$productid = $serial_check->serialprodid;
if ($serialtrue==1 || $serialnumber==$childserial && $userid!=$uid){
echo "<script> alert('This serial is used.'); window.history.go(-1); </script>\n";
exit();
}
if ($productid!=$_POST['product']){
echo "<script> alert('Productname are wrong with these serial.'); window.history.go(-1); </script>\n";
exit();
}
}
}else{
// check for child
$query = "SELECT * FROM #__productserial as prod, #__serial_".$_POST['versionid']." as seri WHERE seri.serialnumber='".$_POST['serial']."' AND seri.serialprodid='".$_POST['product']."'";
$database->setQuery( $query );
if ($serial_checks = $database->loadObjectList() ) {
foreach($serial_checks as $serial_check){
$serialnumber = $serial_check->serialnumber;
$serialtrue = $serial_check->serialused;
$childserial = $serial_check->childserial;
$userid = $serial_check->userid;
$productid = $serial_check->serialprodid;
if ($serialtrue==1 || $serialnumber==$childserial && $userid!=$uid){
echo "<script> alert('This serial is used.'); window.history.go(-1); </script>\n";
exit();
}
if ($productid!=$_POST['product']){
echo "<script> alert('Productname are wrong with these serial.'); window.history.go(-1); </script>\n";
exit();
}
}
}else{
// check for child
Wie kan mij helpen met probleem..waar doe ik verkeerd?
Mvgr. Sander
Quote:
Wat zijn dit voor tabelnamen? Allereerst slaat die #__ natuurlijk nergens op en bovendien doet de tweede tabelnaam vermoeden dat je met een verkeerd datamodel bezig bent.#__productserial
#__serial_".$_POST['versionid']."
#__serial_".$_POST['versionid']."
Het lijkt er namelijk op dat jij voor elke verschillende versie een nieuwe tabel aanmaakt voor de serials? Dat is fout, je hoort gewoon 1 tabel voor alle serials te gebruiken. Bij welke versie ze horen is een eigenschap die je in een kolom in die tabel plaatst.
Om te voorkomen dat er dubbele serials toegevoegd kunnen worden, breng je een UNIQUE constraint aan op de kolom waarin de serial komt te staan. Als je dat per versie wilt voorkomen, kun je een UNIQUE aanbrengen op de combinatie van de kolommen 'serial' en 'versie'. Op die manier is er maar 1 serial mogelijk per versie en zal het invoeren van een dubbele serial een foutmelding opleveren.
Een gegeven de ene keer in tabel 1 opslaan en de andere keer in tabel 2, is ook wat vreemd, dat doet vermoeden dat het datamodel niet goed is, dat er niet (volledig) is genormaliseerd.
Gewijzigd op 01/01/1970 01:00:00 door Sander C
Kortom, kijk nog eens goed naar je datamodel en ga normaliseren als dat nodig is (en ik vermoed van wel).
de datamodel van tabel jos_productserial zijn:
id, userid, productid, serial, version, s2nd, s1nd, child, childserial
$_POST['versionid'] kan verschillend zijn..version, box en nfr.
jos_serial_version:
serialid, serialnumber, serialused, serial2nd, serial1nd, serialprodid
Nou bedankt pgFrank..ik wordt hier niks wijzer van..heb in mijn leven nog nooit normaliseren van datamodel.
Sander schreef op 12.03.2008 15:56:
En waarom denk je dat ik je deze tutorial voorschotel? Wellicht om er iets van op te steken?Nou bedankt pgFrank..ik wordt hier niks wijzer van..heb in mijn leven nog nooit normaliseren van datamodel.
Graag gedaan!
Ps. Normaliseren leer je niet even in een uurtje, daar zul je echt wel even tijd in moeten steken. Het is onmisbaar wanneer je met databases wilt gaan werken, de tijd is dus goed besteed.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Quote:
Wat houden deze waarden in dan? Het lijkt mij niet correct aangezien het vermoedelijk eigenschappen van serials zijn? In dat geval zou dat gewoon in een aparte kolom in de tabel met serials moeten komen te staan.$_POST['versionid'] kan verschillend zijn..version, box en nfr.
Verder vraag ik me af wat je in de kolommen serial1nd en serial2nd op wilt slaan? Genummerde kolomnamen duiden in 9 van de 10 gevallen op een incorrect datamodel, dus de kans is groot dat dat hier ook het geval is.
Als ik aan een productregistratie systeem denk waarbij gebruikers hun serials kunnen registreren, denk ik al snel aan deze basis:
users
------
id
naam
producten
------------
id
product
serials
--------
id
serial
product_id
user_id
Dit kun je natuurlijk veel verder uitbreiden met bijvoorbeeld verschillende versies van producten, complete boxen, etc. Maar afhankelijk van jouw situatie, zul je daar een specifiek datamodel voor moeten opstellen.
Feit blijft dat je zo'n datamodel kunt verkrijgen door te gaan normaliseren, dus het inventariseren welke data je hebt en bepalen hoe je dat in je database onder gaat brengen...
jos_productserial:
id, int 11, autoincrement, primary key
userid, int 11 -> hier komt userid in. -> gekoppeld aan jos_users.id
productid, int 11 -> hier komt productid in -> gekoppeld aan jos_serial_online.id
serial, varchar 20
s2nd -> int 1, kan 0 of 1 zijn.
s1nd -> int 1, kan 0 of 1 zijn.
child -> int 11 -> gekoppeld aan de id
childserial -> varchar 20, gekoppeld aan de nieuwe serial die uit jos_serial_online komt.
jos_serial_online: (geldt ook evenals voor serial_box, serial_nfr..ze zijn alle 3 dezelfde..alleen verschillend versie).
serialid, int 11, autoincrement, primary key
serialnumber, varchar 20 -> hier zitten 100+ serialnummers
serialused, int 1, kan 0 of 1 zijn.
serial2nd, int 1, kan 0 of 1 zijn.
serial1nd, int 1, kan 0 of 1 zijn.
serialprodid, int 11 -> gekoppeld aan productlijst uit ander tabel.
Waarom ga je zelf niet normaliseren? Het is niet moeilijk, maar je moet er wel even voor gaan zitten.
Quote:
Nogmaals dat is dus niet correct! De versie is een eigenschap van een serial, die sla je dus op in een aparte kolom in een tabel. Je gaat niet verschillende tabellen voor verschillende versies maken.(geldt ook evenals voor serial_box, serial_nfr..ze zijn alle 3 dezelfde..alleen verschillend versie)
Quote:
Ik snap nog steeds niet wat hier het doel van is? Ik krijg echter wel het vermoeden dat dit geen correcte aanpak is.s2nd -> int 1, kan 0 of 1 zijn.
s1nd -> int 1, kan 0 of 1 zijn.
s1nd -> int 1, kan 0 of 1 zijn.
Wat houden verder die kolommen child en childserial in? Een serial is in mijn ogen een serial, hoe kunnen daar childs aan gekoppeld zijn?
Kortom, duik nu eens in die tutorial over normaliseren die Frank je al gaf en ga dat eens toepassen op jouw datamodel. Op die manier weet je zeker dat je met een correct datamodel aan de slag gaat, iets dat aan de basis van ieder goed systeem staat...
Nu nog ander tabel aanpassen..
Die s1nd en s2nd is voor 1e request en 2e request..in ieder geval krijgt de klant 1e serial en krijgt gratis 2e serial, maar moet wel 2e request aanvragen..en als die aanvraagt..wordt in database op 1 gezet..die wordt niet meer gebruikt..dus staat geblokkeerd.
Stel nu dat jij in de toekomst 3 gratis serials wilt geven, dan zou dat betekenen dat jij je datamodel aan moet gaan passen, en dat is niet wat je wilt!
ps. Verder zou ik er niet voor kiezen om alle kolomnamen in die serials tabel met 'serial' te beginnen. Het komt de overzichtelijkheid niet echt ten goede...
Alleen..als de gebruiker 2 serials heeft, wordt de 1e serial als 1e getoond en 2e serial als 2e request getoond..
In mijn script..wordt alles getoond..de 2e serial wordt als 1e getoond onder de 1e serial met juiste 2e serial.
De tabel van database ziet er uit:
id, number, used, s2nd, s1nd, prodid, version, userid en request.
Wat de gratis serials betreft..het blijft bij 2 serials.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$query = "SELECT prod.name, prod.id, seri.* FROM jos_menu AS prod, jos_serialversion AS seri WHERE seri.userid = '" . $uid . "' AND seri.prodid=prod.id AND seri.used=1 AND seri.s1nd=1 ORDER BY seri.prodid";
$database->setQuery( $query );
if ($serial_rows = $database->loadObjectList() ) {
foreach($serial_rows as $serial_row){
$productname = $serial_row->name;
$serialnumber = $serial_row->number;
$versionname = $serial_row->version;
$product = $serial_row->prodid;
$userid = $serial_row->userid;
$s2nd = $serial_row->s2nd;
$s1nd = $serial_row->s1nd;
$used = $serial_row->used;
$request = $serial_row->request;
$serial_content .="<tr>
<td><div style=\"font-family: Verdana; font-color: #8a8a8a; font-size:10px;\">$productname</div></td>
<td><div style=\"font-family: Verdana; font-color: #8a8a8a; font-size:10px;\">".ucfirst($versionname)."</div></td>
<td><div style=\"font-family: Verdana; font-color: #8a8a8a; font-size:10px;\">$serialnumber</div></td>";
if ($s1nd!=0 && $used!=0 && $request!=0){
$query = "SELECT number, s1nd, s2nd, userid FROM jos_serialversion WHERE userid='".$userid."' AND used=1 AND s2nd=1 ";
$database->setQuery( $query );
if ($serial2_rows = $database->loadObjectList() ) {
foreach($serial2_rows as $serial2_row){
$serialnumber2 = $serial2_row->number;
if ($serialnumber2==""){
$serial_content .="<td>Check your mail for 2nd serialnumber</td>";
}else{
$serial_content .="<td><div style=\"font-family: Verdana; font-color: #8a8a8a; font-size:10px;\">$serialnumber2</div></td>";
}
}
}
}else{
$serial_content .="
<td><form method=\"post\" action=\"index.php\" name=\"mosUserForm\"><input type=\"submit\" name=\"request\" class=\"requestbutton\" value=\"\" alt=\"Request\"></form></td>";
}
$serial_content .="</tr>";
}
}
echo $serial_content;
$database->setQuery( $query );
if ($serial_rows = $database->loadObjectList() ) {
foreach($serial_rows as $serial_row){
$productname = $serial_row->name;
$serialnumber = $serial_row->number;
$versionname = $serial_row->version;
$product = $serial_row->prodid;
$userid = $serial_row->userid;
$s2nd = $serial_row->s2nd;
$s1nd = $serial_row->s1nd;
$used = $serial_row->used;
$request = $serial_row->request;
$serial_content .="<tr>
<td><div style=\"font-family: Verdana; font-color: #8a8a8a; font-size:10px;\">$productname</div></td>
<td><div style=\"font-family: Verdana; font-color: #8a8a8a; font-size:10px;\">".ucfirst($versionname)."</div></td>
<td><div style=\"font-family: Verdana; font-color: #8a8a8a; font-size:10px;\">$serialnumber</div></td>";
if ($s1nd!=0 && $used!=0 && $request!=0){
$query = "SELECT number, s1nd, s2nd, userid FROM jos_serialversion WHERE userid='".$userid."' AND used=1 AND s2nd=1 ";
$database->setQuery( $query );
if ($serial2_rows = $database->loadObjectList() ) {
foreach($serial2_rows as $serial2_row){
$serialnumber2 = $serial2_row->number;
if ($serialnumber2==""){
$serial_content .="<td>Check your mail for 2nd serialnumber</td>";
}else{
$serial_content .="<td><div style=\"font-family: Verdana; font-color: #8a8a8a; font-size:10px;\">$serialnumber2</div></td>";
}
}
}
}else{
$serial_content .="
<td><form method=\"post\" action=\"index.php\" name=\"mosUserForm\"><input type=\"submit\" name=\"request\" class=\"requestbutton\" value=\"\" alt=\"Request\"></form></td>";
}
$serial_content .="</tr>";
}
}
echo $serial_content;
De output ziet uit:
Product
Version
Serial
2nd Serial
------
Predator
Online
12825228840951557863
request button
--------
Predator
Online
22723027373457755228
12825228840951557863
Die moet er eigenlijk niet zijn..er is al een request gedaan voor 2e serial en is al in 2nd serial getoond na het toevoeging van 2e serial.
Waar doe ik verkeerd?
Het is je al meerdere malen gezegd, maar je zult echt moeten gaan normaliseren. Doe je dat niet, ga dan niet zeuren dat jouw systeem niet gaat werken, daar kies jij dan heel bewust voor.
De basis van jouw systeem ontbreekt nog, de php-code doet dus totaal niet ter zake. Ga eerst een goede database opzetten, dat is onmisbaar.
Quote:
Je hebt nog steeds die kolommen s2nd en s1nd erin staan?De tabel van database ziet er uit:
id, number, used, s2nd, s1nd, prodid, version, userid en request.
id, number, used, s2nd, s1nd, prodid, version, userid en request.
Dat betekent dat je nog steeds met een incorrect datamodel aan het rommelen bent en later zal dat dus hoogstwaarschijnlijk tot problemen gaat leiden. Voordat je aan scripten in PHP kunt gaan denken, zul je eerst moeten zorgen dat je een goede basis, dus een goed datamodel hebt.
Verder zet ik ook mijn vraagtekens nog bij de kolom 'version' in de serials tabel. Als dat een eigenschap van een product is, hoort deze hier natuurlijk niet thuis. Als het een soort serial betreft, zijn er waarschijnlijk beperkt aantal mogelijkheden. In dat geval zou je die mogelijkheden in een aparte tabel op moeten slaan en in de serials tabel enkel het corresponderende id opnemen.
Stel nu dat je je serials tabel zo opbouwt:
serials
-------
id
serial
user_id
product_id
provided
in_use
In de kolom provided van het type DATETIME sla je het tijdstip op waarop je de betreffende serial aan de gebruiker verstrekt hebt. In de kolom in_use kun je opslaan of de serial ook daadwerkelijk in gebruik is.
Met een eenvoudige SELECT query kun je nu het aantal serials bepalen dat een bepaalde gebruiker heeft:
Per gebruiker kun je nu het aantal serials dat ze bezitten uitlezen. Heeft een gebruiker er maar 1, dan kun je een request button tonen. Heeft hij er al twee, dan doe je dat dus niet...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
De bedoeling is dat ik 3 verschillend *.txt file met honderden serials moeten gaan uploaden. Je hebt txt file voor product_online, product_nfr, product_box. In elk txt file staan verschillend serialnummers..die zijn nooit dezelfde..een unieke nummers dus.
De bedoeling is dat klant die serialnummer krijgt, moeten invoeren in hun systeem..en dat die serial wordt aangezien als gemarkeerd in database dat die serial al is gebruikt..het kan bv in product_online. Mocht de klant graag 2e serialnummer willen hebben, moet hij de request doen voor 2e serial. Daarna krijgt die persoon via email een nieuw serialnummer van dezelfde product en dezelfde versie..die moet dus gemarkeerd worden als 2nd request. Nadat die persoon die nieuw 2e serial invoer in systeem..is die serial gemarkeerd als gebruikt. Krijgt daarna die persoon een overzicht met productnaam, versie, serial en 2nd serial.
Er is geen 3 verschillend *.txt file..maar meerdere..
product_online_predator, product_online_blue, etc..waar online voor versie staat en die laatste een product.
Quote:
Ja prima, maar in je database resulteert dat in maar 1 tabel met serials! Dat het een 'online', 'box' of 'nfr' serial is, is een eigenschap van een serial. Die mogelijke versies sla je dus op in een aparte tabel en enkel het id van de betreffende versie komt in de serials tabel te staan.Je hebt txt file voor product_online, product_nfr, product_box.
Wat betreft het tweede gedeelte van je verhaal, dat verandert ook niets aan de opzet die je nu al meerdere malen aangereikt is. Bepalen van het aantal serials dat een gebruiker heeft en welke dan de laatst aangevraagde is, doe je door een query uit te voeren op de serials tabel. Je kijk dan naar het aantal records per gebruiker per product en naar de datum waarop een serial uitgegeven is.
Je kunt nu wel heel eigenwijs zijn en vinden dat jouw aanpak correct is, maar dat is gewoon niet het geval. Ga normaliseren, dan zal vanzelf blijken hoe ja datamodel eruit moet komen te zien. Daar heb je veel meer aan...
ps. Uiteraard zul je aan enkel een tabel 'serials' niet voldoende hebben. Je zult ook tabellen nodig hebben van je gebruikers, producten en eventueel productversies. Welke tabellen je precies nodig hebt en hoe de onderlinge relaties eruit zien, kun je alleen achterhalen door te gaan normaliseren.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit