check op geldige items in database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Robert Deiman

Robert Deiman

13/03/2008 11:00:00
Quote Anchor link
@Sander

Heb je nu die tutorial al doorgelezen? Volgens mij namelijk niet, er komt een koppeltabel aan te pas. Ga die tutorial eens doorwerken, en als je dan ergens niet uit komt vraag het dan nog eens op het forum.
Een goed genormaliseerde database is veel gemakkelijker te onderhouden/ uit te breiden dan een slecht opgebouwde database!
 
PHP hulp

PHP hulp

30/11/2024 11:22:19
 
Sander C

Sander C

13/03/2008 11:06:00
Quote Anchor link
@Robert

Heb die tutorial wel doorgelezen..maar snapt er geen barst van. Eerst had ik 4 verschillend tabellen..en blijkt dat het niet goed is..heb ik maar teruggebracht naar 1..en blijkt nu ook weer niet.

Ik vind het soms een beetje vaag hier..ik kan ook wel antwoord of hulp elders vinden.
 
Joren de Wit

Joren de Wit

13/03/2008 11:14:00
Quote Anchor link
Quote:
Heb die tutorial wel doorgelezen..maar snapt er geen barst van.
Misschien slim om hem nog eens te lezen of dáár eens een vraag over te stellen?

Jij vindt het een beetje vaag hier? Tja als het krijgen van juiste antwoorden jouw definitie van 'vaag' is, dan zal dat inderdaad zo zijn. Alleen hebben jij en ik dan een hele andere opvatting van dat woord.

Het opzetten van een goed datamodel is niet zomaar het samenvoegen van 4 tabellen tot 1 tabel, daar komt wel iets meer bij kijken. Normaliseren is en blijft het sleutelwoord en hoewel dat op de eerste manier niet eenvoudig zal lijken, is het toch iets dat je jezelf aan zou moeten leren. Als je het principe eenmaal doorhebt is het niet zo lastig meer...
 
Sander C

Sander C

13/03/2008 11:15:00
Quote Anchor link
Goed..ik ga maar iets anders doen..ga nu 2 tabellen maken ipv 1.

serials
---------
id
serial
user_id
product_id
provided
in_use

version
----------
id
version

@blanche..jij zegt dat in_use ook daadwerkelijk in gebruik is..maar hoe wou jij oplossen dat die nog niet in gebruik is, maar wel aangevraagd is...en dat de persoon besluit om later pas in te voeren. Moet er ook dus weer een aparte tabel voor komen..

serialused
---------
id
user_id
provided

Zodra de persoon de serial invoer, wordt het eerst nagekeken in serialused of datum overeenkomt met provided in serials...zo ja..dan wordt die in_use gemarkeerd als gebruikt...toch?
 
Joren de Wit

Joren de Wit

13/03/2008 11:19:00
Quote Anchor link
In de kolom in_use zou je een 1 of 0 kunnen zetten al naar gelang of de serial in gebruik is of niet.

Verder heb je nu wel een tabel 'version' maar ontbreekt de relatie met de serials tabel nog. Je zult in die tabel dus nog een kolom 'version_id' op moeten nemen waarin je het id van de betreffende versie opslaat...

ps. Misschien is het logischer om van in_use iets van 'activated' te maken. Deze zet je dan op 1 als de verstrekte serial voor het eerst gebruikt wordt.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Sander C

Sander C

13/03/2008 11:29:00
Quote Anchor link
dat die van version_id in tabel serials had ik al toegevoegd..vond ook logischer..anders is er geen link tussen. De in_use heeft int 1, standaardwaarde 0.

Heb nu er 2 tabel..
jos_serials
------------
id
serial
user_id
product_id
provided
in_use
version_id

jos_serialversion
----------
id
version met daarin 3 ids (nfr, online en box)
 
Frank -

Frank -

13/03/2008 11:31:00
Quote Anchor link
Sander schreef op 13.03.2008 11:15:
Goed..ik ga maar iets anders doen..ga nu 2 tabellen maken ipv 1.
Dat is dus wederom de verkeerde aanpak....

Je gaat normaliseren. Dan blijkt vanzelf wel of je 25, 38 of slechts 2 tabellen nodig hebt. Dat is namelijk het resultaat en het is dus geen doel.
 
Joren de Wit

Joren de Wit

13/03/2008 11:31:00
Quote Anchor link
Dan mis je nu nog tabellen voor je gebruikers en producten. Ook moet je nog nadenken over de manier waarop je verschillende versies van producten wilt kunnen onderscheiden. Ga je dat als apart record in de producten tabel behandelen of gebruik je een aparte tabel voor de versies en een koppeltabel om een versie aan een product te koppelen.

Je bent dus nog niet klaar...
 
Sander C

Sander C

13/03/2008 13:38:00
Quote Anchor link
Na wat paar uurtjes hebt opnieuw geprogrammeerd heb ik 3 tabellen..

jos_serials
----------
id
serial
user_id
product_id
uniek
in_use
version_id

jos_serialversion
----------
id
version

jos_serialused
---------
id
user_id
uniek

In beide uniek veld komt een unieke key dmv uniqid. Als men een request doet voor 2e serial, wordt er een unieke key toegevoegd in jos_serials en jos_serialused.

Ook zijn de hele reeksen van beveiliging goed doorgelopen zonder dubbele serials, foutieve product of version.

controleren of user een unieke key heeft..zo niet..
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
         // controleren of user al uniek key heeft..zo niet..dan gewoon toevoegen.
         $query = "SELECT seri.uniek, seri.in_use, seriused.uniek FROM #__serials AS seri, #__serialused AS seriused WHERE seri.user_id='".$uid."' AND seri.in_use=0 AND seriused.uniek=seri.uniek ";
         $database->setQuery( $query );
         $exists = $database->loadResult();
              if ( !$exists ) {
              $uniekkey=true;
              }
         if ($userchecks = $database->loadObjectList() ) {
              foreach($userchecks as $usercheck){
              $uniek = $usercheck->uniek;
              $uniekkey=false;
              }
          }


Als unieke key niet aanwezig is..
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
          if ($uniekkey=true){
         // check for serialnumber
         $query = "SELECT * FROM #__serials WHERE serial='".$_POST['serial']."' AND product_id='".$_POST['product']."' AND version_id='".$_POST['versionid']."'";
         $database->setQuery( $query );
         $exists = $database->loadResult();
         if ( !$exists ) {
         echo $query;
                echo "<script> alert('Productname are wrong with these serial.'); window.history.go(-1); </script>\n";
                exit();
         }
         if ($serial_checks = $database->loadObjectList() ) {
              foreach($serial_checks as $serial_check){
              $serialnumber = $serial_check->serial;
              $serialtrue = $serial_check->in_use;
              $userid =  $serial_check->user_id;
              $productid = $serial_check->product_id;

                  if ($serialtrue==1){
                  echo "<script> alert('This serial is used.'); window.history.go(-1); </script>\n";
                  exit();
                  }
              }
         $query ="UPDATE #__serials SET in_use='1', user_id='".$uid."' WHERE serial='".$_POST['serial']."' AND product_id='".$_POST['product']."' AND version_id='".$_POST['versionid']."'";
         $database->setQuery( $query );
         $database->query();
         $msg = "Serial are adding to your list.\n";
         mosRedirect( 'index.php?option='.$option.'&task=UserDetails&Itemid=21', $msg );
         }
       }


Wel unieke key aanwezig..
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
       if ($uniekkey=false){
       $query = "SELECT * FROM #__serials WHERE uniek='".$uniek."' AND serial='".$_POST['serial']."' AND product_id='".$_POST['product']."' AND version_id='".$_POST['versionid']."'";
       $database->setQuery( $query );
         $exists = $database->loadResult();
         if ( !$exists ) {
                echo "<script> alert('This serial is used.'); window.history.go(-1); </script>\n";
                exit();
         }
         if ($serial_checks = $database->loadObjectList() ) {
              foreach($serial_checks as $serial_check){
              $serialnumber = $serial_check->serial;
              $serialtrue = $serial_check->in_use;
              $userid =  $serial_check->user_id;
              $productid = $serial_check->product_id;

                  if ($serialtrue==1){
                  echo "<script> alert('This serial is used.'); window.history.go(-1); </script>\n";
                  exit();
                  }
              }
         $query ="UPDATE #__serials SET in_use='1' WHERE uniek='".$uniek."' AND user_id='".$uid."'";
         $database->setQuery( $query );
         $database->query();
       $msg = "Serial are adding to your list.\n";
         mosRedirect( 'index.php?option='.$option.'&task=UserDetails&Itemid=21', $msg );
         }
       }


Als men een request doet voor 2e serial ziet de code zo 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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
         $uniek=uniqid('uid');

         // emailadres en naam ophalen uit users tabel
         $query = "SELECT email, name FROM #__users WHERE id='$uid'";
         $database->setQuery( $query );
        if ($user_rows = $database->loadObjectList() ) {
         foreach($user_rows as $user_row){
         $email = $user_row->email;
         $name = $user_row->name;
         }
        }
        // random serialnummer ophalen en markeren als gebruikt.
        $query = "SELECT * FROM #__serials WHERE in_use=0 AND uniek=0 AND product_id='".$prodid."' AND version_id='".$versionid."' ORDER BY RAND() LIMIT 0,1";
        $database->setQuery( $query );
        if ($random_serials = $database->loadObjectList() ) {
         foreach($random_serials as $random_serial){
         $serialnumber = $random_serial->serial;
         }
        }
        $query = "UPDATE #__serials SET user_id='".$uid."', uniek='".$uniek."' WHERE serial='".$serialnumber."' AND product_id=".$prodid." AND version_id='".$versionid."'";
        $database->setQuery( $query );
        $database->query();
        $query = "INSERT INTO #__serialused SET uniek='".$uniek."', user_id='".$uid."'";
        $database->setQuery( $query );
        $database->query();

        // gegevens verzamelen voor verzending.
         $subject ="2nd activation key";
         $header ="Bcc: \r\n";
         $header .= "From: \r\n";
         $header .= "Return-Path: \r\n";
         $header .= "Reply-To: \r\n";
         $body ="Hi $name,\n\n Here's a 2nd activation key.\n\nCopy the following Code to the clipboard\n $serialnumber\n\nAdd these serial to your list with same version you have choosen.";
//         mail($name ."<".$email.">", $subject, $body, $header);

         $msg="2nd request activation are sending to your email. \n";
         mosRedirect( 'index.php?option='.$option.'&task=UserDetails&Itemid=21', $msg );


De output van de serials zijn..
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
$query = "SELECT prod.name, prod.id, seri.*, versi.version FROM #__menu AS prod, #__serials AS seri, #__serialversion AS versi WHERE seri.user_id = '" . $uid . "' AND seri.product_id=prod.id AND seri.version_id=versi.id AND seri.in_use=1 ORDER BY seri.product_id";
$database->setQuery( $query );
 if ($serial_rows = $database->loadObjectList() ) {
     foreach($serial_rows as $serial_row){
     $productname = $serial_row->name;
     $serialnumber = $serial_row->serial;
     $versionname = $serial_row->version;
     $versionid = $serial_row->version_id;
     $productid = $serial_row->product_id;
     $userid = $serial_row->user_id;
     $used = $serial_row->in_use;
     $uniekkey = $serial_row->uniek;
     $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 ($uniekkey=="" && $used==1){
     $query = "SELECT * FROM #__serials AS seri, #__serialused AS versi WHERE seri.user_id='".$userid."' AND seri.in_use=1 AND seri.uniek=versi.uniek";
     $database->setQuery( $query );
      if ($serial2_rows = $database->loadObjectList() ) {
       foreach($serial2_rows as $serial2_row){
       $serialnumber2 = $serial2_row->serial;
       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\"><input type=\"hidden\" name=\"prodid\" value=\"$productid\"><input type=\"hidden\" name=\"version\" value=\"$versionid\"><input type=\"hidden\" name=\"userid\" value=\"$userid\"><input type=\"hidden\" name=\"option\" value=\"$option\"><input type=\"hidden\" name=\"task\" value=\"request2nd\"></form></td>";
     }
     $serial_content .="</tr>";
     }
   }
   echo $serial_content;


De hele code werkt wel goed..de gegevens zijn goed en normaal uit database gehaald. Alleen krijg ik toch nog steeds die 2e serial te zien boven de 1e serial.

Product
Version
Serial
2nd Serial
----------
Predator
Online
74548199504253499605
request button

Predator
Online
22723027373457755228
74548199504253499605

Heb er al van alles gedaan om op te lossen..en heb ook gedaan wat jullie om vraagt..een database normaliseren..of is dit nog niet voldoende?
 
Frank -

Frank -

13/03/2008 13:54:00
Quote Anchor link
Wat doet die kolom 'uniek' in jouw tabellen? UNIQUE is een eigenschap van een kolom, een UNIQUE-constraint. Dat kan dus nooit een kolom zijn. Hiermee wordt de SELECT-query om te kijken of iets uniek is, ook direct overbodig. Wanneer jij wilt weten of een unieke waarde al bestaat, gooi met je met een INSERT-query gewoon de waarde die je wilt opslaan in je database. Deze query zal keurig op zijn bek gaan wanneer de waarde al bestaat: unique-violation!

En nogmaals, steek je tijd in het normaliseren en niet in het programmeren. Normaliseren is de basis, zonder goede basis kun jij nooit een fatsoenlijk systeem krijgen. En is dus alle tijd in het programmeerwerk voor niets geweest...
 
Sander C

Sander C

13/03/2008 14:05:00
Quote Anchor link
Als je leest waar die uniek voor is..er komt een uniqid in..en UNIQUE-constraint..wat is dat nou? is dat in mysql zelf?

pgFrank..jij zegt altijd normaliseren..waarmee moet ik nou normaliseren..heb er van alles al gedaan..voor mij is de basis al goed..ben niet zo erg expert als jij.

Als ik vel uniek UNIQUE toevoeg, krijg ik melding:
ALTER TABLE `jos_serials` ADD UNIQUE (
`uniek`
)

MySQL retourneerde: Documentatie
#1062 - Duplicate entry '' for key 2
Gewijzigd op 01/01/1970 01:00:00 door Sander C
 
Frank -

Frank -

13/03/2008 14:15:00
Quote Anchor link
Sander schreef op 13.03.2008 14:05:
Als ik vel uniek UNIQUE toevoeg, krijg ik melding:
ALTER TABLE `jos_serials` ADD UNIQUE (
`uniek`
)

MySQL retourneerde: Documentatie
#1062 - Duplicate entry '' for key 2

Gefeliciteerd! Dat is precies wat je hebben wilt! Nu weet je 100% zeker dat een waarde reeds bestaat, alle andere zogenaamde oplossingen zijn namelijk onbetrouwbaar. Een SELECT-query gaat namelijk altijd over het verleden en nooit over de huidige situatie. Huidig als in nu nu nu nu nu nu nu nu nu nu nu nu nu nu nu nu nu nu nu nu etc.

Quote:
Als je leest waar die uniek voor is..er komt een uniqid in..en UNIQUE-constraint..wat is dat nou? is dat in mysql zelf?
constraint betekent beperking, dat is een eigenschap dit je in de tabel aanmaakt op een kolom. Dit speelt zich dus af in de database en niet in onbetrouwbare PHP-code.

Quote:
pgFrank..jij zegt altijd normaliseren..waarmee moet ik nou normaliseren..heb er van alles al gedaan..voor mij is de basis al goed..ben niet zo erg expert als jij.
Normaliseren doe je met de data die je wilt gaan gebruiken, bv. de gegevens voornaam, achternaam, woonplaats, email, telefoonnummer, etc. Al deze gegevens ga je op papier zetten, je gaat de onderlinge relaties bepalen, bepalen hoevaak iets voor kan komen en zo ga je de boel keurig indelen. Hier komt geen database aan te pas, integendeel! Zodra jij gaat denken in tabellen of kolommen, ga je de mist in. Je gaat eerst normaliseren en wanneer dat klaar is ga je pas denken aan tabellen en kolommen. Dan ga je pas de database opstellen. Vandaar dat je nooit kunt zeggen 'ik ga 3 tabellen gebruiken', dat weet je vooraf namelijk niet.

Dat je geen expert bent, geeft niks, maar geeft wel aan dat je dit onderwerp serieus moet nemen. Pak dus pen en papier en ga de boel netjes op papier uitschrijven en uitwerken. Wanneer dat klaar is, maak je de database aan.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
Sander C

Sander C

13/03/2008 14:19:00
Quote Anchor link
Als ik tutorial over normaliseren doorleest..heb ik me wel aan gehouden...die heb ik opnieuw doorgelezen..

http://www.phphulp.nl/php/tutorials/3/150/259/

In de tabel serials staan maar slechts 7 velden..
id
serial
user_id
product_id
uniek
in_use
version_id

serial is dus zelfstandig, bevat alleen maar duizenden verschillend serialnummers.
user_id is gekoppeld aan de id, name uit jos_users
product_id is gekoppeld aan de id en name uit jos_menu
uniek is zelfstandig, maar ook gekoppeld aan uniek en user_id uit jos_serialused voor 2e request.
in_use is zelfstandig
version_id is gekoppeld aan id en version uit jos_serialversion

en wat betreft UNIQUE in mysql..ik krijg alleen maar foutmelding..er is dus nog geen enkel unique key.
Fout

SQL-query:

ALTER TABLE `jos_serials` ADD UNIQUE (
`uniek`
)

MySQL retourneerde: Documentatie
#1062 - Duplicate entry '' for key 2
Gewijzigd op 01/01/1970 01:00:00 door Sander C
 
Frank -

Frank -

13/03/2008 14:25:00
Quote Anchor link
uniek is een eigenschap, geen ding. Die kolom lijkt mij dus niet goed. Wat wil je daar in gaan zetten?

Een serial kan uniek zijn, die maak je dus UNIQUE. Wanneer het aanmaken van de constraint mislukt, staat er blijkbaar dubbele data in je tabel. En een NULL (leeg) is ook dubbele data, dat kan dus evenmin.
 
Sander C

Sander C

13/03/2008 14:35:00
Quote Anchor link
Ik weet niet of serial ook uniek is..er zijn misschien ook wel van ander versie of ander product dezelfde serial als nu.

bv: predator_box: 14296293433240896405
blue_nfr: 14296293433240896405

Ik wil geen risico nemen om serial een unieke veld van te maken. Wat de kolom uniek betreft..die is leeg.., de veld in_use is op standaardwaarde 0 gezet. en user_id is ook op 0..er heeft nog geen enkel user aangemeldt..

In kolom uniek komt een uniqid in staan..$uniek=uniqid('uid');. Omdat de serial niet zeker een unique is, heb ik daarom gewoon kolom uniek toegevoegd met randon unieke key die aan ieder persoon toewijst.
 
Bo az

Bo az

13/03/2008 14:40:00
Quote Anchor link
Quote:
In kolom uniek komt een uniqid in staan..$uniek=uniqid('uid');. Omdat de serial niet zeker een unique is, heb ik daarom gewoon kolom uniek toegevoegd met randon unieke key die aan ieder persoon toewijst.

Daar is een boel over te zeggen, maar om te beginnen. Op welk(e) veld(en) ligt je primary key? (die veld(en) zijn dan toch al uniek!)
Gewijzigd op 01/01/1970 01:00:00 door Bo az
 
Sander C

Sander C

13/03/2008 14:47:00
Quote Anchor link
primary key is een id in serials.
 
Bo az

Bo az

13/03/2008 15:00:00
Quote Anchor link
Sander schreef op 13.03.2008 14:47:
primary key is een id in serials.

Dan heb je toch al een veld met een unieke waarde, waarom wil je dan nog een veld met een unieke waarde toevoegen?

Daarbij komt dat deze fout melding:
Quote:
#1062 - Duplicate entry '' for key 2

Al aangeeft dat de waarde niet eens uniek is.
Gewijzigd op 01/01/1970 01:00:00 door Bo az
 
Frank -

Frank -

13/03/2008 15:10:00
Quote Anchor link
Sander schreef op 13.03.2008 14:35:
Ik weet niet of serial ook uniek is..er zijn misschien ook wel van ander versie of ander product dezelfde serial als nu.

en
Quote:
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.

Dat is wat tegenstrijdig, of niet dan? Ga hier eerst maar eens over nadenken, hoe wil jij gaan bepalen of je een melding moet geven of het record wilt toevoegen. Jij weet blijkbaar niet hoe je een item kunt herkennen, daar valt dan ook niet op te controleren.
 
Sander C

Sander C

13/03/2008 15:25:00
Quote Anchor link
@pgFrank..

Die 2e quote is eigenlijk niet goed...de serialnummers krijgt de klant van de verkoper en die verkoper heeft een lijstje met alle serialnummers en die wordt alles in database opgeslagen dmv importfunctie. De lijstje is in *.txt file.

Er zijn dus meerdere lijstjes..blue_nfr.txt, predator_box.txt etc. In ieder lijstje zitten dus alle serialnummers. Ik weet zelf niet of de serialnummer in ieder txt file dezelfde zijn of niet.

De klant krijgt dus een serialnummer bij het aanschaf van product en moet daarna de serialnummer invoeren in de systeem..en wordt dus gecontroleerd of serial overeenkomt met de gegevens in database. Is de serial dezelfde..wordt het gemarkeerd als gebruikt..dus is_used=1.

Mocht de klant daarna een 2e serial wilt aanvragen, voor bv op 2e computer ..moet hij een request doen..daarna krijgt die een mailtje met 2e serialnummer die uit database komt. Daarna kan die klant die 2e serialnummer invoeren in systeem..wordt het weer hele process doorgelopen voordat die ook gemarkeerd is als gebruikt..

Verder heb ik een uniek kolom verwijderd uit jos_serials. De ID is unique zelf en in jos_serialused heb ik uniek gewijzigd in serialid.
 

Pagina: « vorige 1 2



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.