check op geldige items in database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Sander C

Sander C

12/03/2008 15:26:00
Quote Anchor link
Hallo,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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


Wie kan mij helpen met probleem..waar doe ik verkeerd?

Mvgr. Sander
 
PHP hulp

PHP hulp

27/11/2024 05:05:22
 
Joren de Wit

Joren de Wit

12/03/2008 15:31:00
Quote Anchor link
Quote:
#__productserial
#__serial_".$_POST['versionid']."
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.

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.
 
Frank -

Frank -

12/03/2008 15:33:00
Quote Anchor link
Ik zeg UNIQUE-constraint. Zie de handleiding van jouw database voor de details, de SELECT-query kan in elk geval richting schroothoop. Dat is per definitie onbetrouwbaar wanneer het aankomt op unieke gegevens.

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.
 
Sander C

Sander C

12/03/2008 15:37:00
Quote Anchor link
Deze tabelnamen zijn voor Joomla..de #__ wordt automatisch vervangen door jos_
Gewijzigd op 01/01/1970 01:00:00 door Sander C
 
Joren de Wit

Joren de Wit

12/03/2008 15:41:00
Quote Anchor link
Maar goed, dan nog kan die tweede tabelnaam niet correct zijn. Er is namelijk niets variabels aan een tabelnaam en dat is bij jou nu wel het geval...

Kortom, kijk nog eens goed naar je datamodel en ga normaliseren als dat nodig is (en ik vermoed van wel).
 
Sander C

Sander C

12/03/2008 15:49:00
Quote Anchor link
Oke..leg dan maar eens verder uit. De eerste check..This serial is used werkt wel..alleen de 2e niet.

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
 
Frank -

Frank -

12/03/2008 15:52:00
Quote Anchor link
Tip: Pak pen en papier en de volgende tutorial van A tot Z haarfijn uitwerken:
klikkerdeklik

Een datamodel is wel even ietsjes meer dan wat je hier opnoemt...
 
Sander C

Sander C

12/03/2008 15:56:00
Quote Anchor link
Nou bedankt pgFrank..ik wordt hier niks wijzer van..heb in mijn leven nog nooit normaliseren van datamodel.
 
Frank -

Frank -

12/03/2008 15:58:00
Quote Anchor link
Sander schreef op 12.03.2008 15:56:
Nou bedankt pgFrank..ik wordt hier niks wijzer van..heb in mijn leven nog nooit normaliseren van datamodel.
En waarom denk je dat ik je deze tutorial voorschotel? Wellicht om er iets van op te steken?

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 -
 
Joren de Wit

Joren de Wit

12/03/2008 15:59:00
Quote Anchor link
Quote:
$_POST['versionid'] kan verschillend zijn..version, box en nfr.
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.

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...
 
Sander C

Sander C

12/03/2008 16:09:00
Quote Anchor link
Zal eens uitleggen welke tabellen er zijn en wat er allemaal in moeten komen.

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.
 
Frank -

Frank -

12/03/2008 16:11:00
Quote Anchor link
Waarom ga je zelf niet normaliseren? Het is niet moeilijk, maar je moet er wel even voor gaan zitten.
 
Joren de Wit

Joren de Wit

12/03/2008 16:14:00
Quote Anchor link
Quote:
(geldt ook evenals voor serial_box, serial_nfr..ze zijn alle 3 dezelfde..alleen verschillend versie)
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.
Quote:
s2nd -> int 1, kan 0 of 1 zijn.
s1nd -> int 1, kan 0 of 1 zijn.
Ik snap nog steeds niet wat hier het doel van is? Ik krijg echter wel het vermoeden dat dit geen correcte aanpak is.

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...
 
Sander C

Sander C

12/03/2008 16:37:00
Quote Anchor link
Heb nu alle 3 tabellen serial_box etc verwijderd en vervangen door 1 tabel jos_serialversion met daarin serialid, serialnumber, serialused, serial2nd, serial1nd, serialprodid en serialversion.

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.
 
Joren de Wit

Joren de Wit

12/03/2008 16:41:00
Quote Anchor link
Zoals ik al dacht, verkeerde aanpak. Of een gebruiker 1 of meerdere serials bezit, leidt je gewoon af uit het aantal serials dat aan een bepaalde gebruiker gekoppeld is. Hetzelfde geldt dan waarschijnlijk ook voor de kolommen serial1nd en serial2nd.

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...
 
Sander C

Sander C

13/03/2008 10:28:00
Quote Anchor link
Ben zo ver om alles vanaf 1 tabel te beheren..ipv 4 tabellen voorheen..

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)
PHP script in nieuw venster Selecteer het PHP script
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
$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;


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?
 
Frank -

Frank -

13/03/2008 10:35:00
Quote Anchor link
Dezelfde data, een serial, staat in verschillende kolommen. Wat je ook doet, je hebt hier 1 tabel met serials nodig waarbij alle serials in 1 kolom staan. Dan kun je namelijk een UNIQUE-constraint aanmaken om af te dwingen dat een serial uniek is.

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.
 
Joren de Wit

Joren de Wit

13/03/2008 10:42:00
Quote Anchor link
Quote:
De tabel van database ziet er uit:
id, number, used, s2nd, s1nd, prodid, version, userid en request.
Je hebt nog steeds die kolommen s2nd en s1nd erin staan?

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT
    user_id,
    COUNT(serial) AS aantal
FROM
    serials
GROUP BY
    user_id

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
 
Sander C

Sander C

13/03/2008 10:53:00
Quote Anchor link
Ik zal opnieuw alles uitleggen..

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.
 
Sander C

Sander C

13/03/2008 10:57:00
Quote Anchor link
Ik heb iets fout gezegd..

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.
 
Joren de Wit

Joren de Wit

13/03/2008 11:00:00
Quote Anchor link
Quote:
Je hebt txt file voor product_online, product_nfr, product_box.
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.

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
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.