Avatar billede dallan2007 Nybegynder
11. februar 2013 - 12:13 Der er 15 kommentarer og
1 løsning

Grundlæggende indsæt i mysql database? (ordreindlæggelse)

Lad mig springer ud i det:

Når en kunde har færdighandlet og bliver viderestillet til den afslutende side, så har jeg 3 grundlæggende funktioner som skal fungere:

1) Ordren lægges endegyldt i databasen.
2) Der sendes en kvittering til kunden.
3) Der laves et kort resume på selv den afsluttende side.

Og alt dette funger for det meste uden problemer, men alligevel sker det en gang i mellem, at der ikke bliver lagt en ordre i databasen.

Jeg bruger følgende (sikkert håbløst gammeldags) kode til at lægge ordren i databasen (den faktisk kode har langt mere data der bliver indsat, men for overskueligheden har jeg kortet det ned):

$checkordreid = mysql_query("SELECT final_ordre_id FROM bestillinger WHERE final_ordre_id = '$_SESSION[final_ordre_id]'") or die(mysql_error());
$checkordreiddata = mysql_fetch_array($checkordreid);

if(($checkordreiddata['final_ordre_id'] == "") and ($_SESSION['final_alle_produkter'] != "")){
mysql_query("insert into bestillinger(final_faktura_email,final_ordre_id) values ('$_SESSION[final_faktura_email]', '$_SESSION[final_ordre_id]')");
}
elseif($_SESSION['final_alle_produkter'] != "")
{
$temp_ordre_id = $checkordreiddata['final_ordre_id'] + 5000;
mysql_query("insert into bestillinger(final_faktura_email,final_ordre_id) values ('$_SESSION[final_faktura_email]', '$temp_ordre_id ')");
}


Kort forklaring: jeg har tidligere i forløbet sikret at hver kunde opererer med et unikt ordrenummer, men for en sikkerhedsskyld laver jeg alligevel et hurtigt check for at sikre, at der ikke bliver lagt det samme ordrenummer ind 2 gange. Hvis uheldet er ude, og kunden på mystisk vis har fået et ordrenummer som allerede eksisterer i databasen, så tager jeg selvsamme ordrenummer og forøger det med 5000.

Et "dirty hack" javel, men det sikre at jeg ikke får redundant data.

Og det gør jeg da heller ikke, men ud af de sidste 40 ordre mangler jeg data på 4 stk. Dvs. jeg har information via en temp_bestilling, men af en eller anden årsag bliver ordren ikke oprettet korrekt via det ovenstående og smidt i bestillinger.

Så spørgsmålet er hvad jeg gør forkert? Selvom koden nok er horrible, så ser den ud til at virke i de fleste tilfælde, men altså bare ikke 100%

Thoughts?
Avatar billede repox Seniormester
11. februar 2013 - 12:55 #1
For mig lyder det som om du har tilføjet et ekstra led unødigt?

Normalt gemmer du din indkøbskurvs data i en session til købet reelt set skal gennemføres. Når kunden har bekræftet sin bestilling, gemmer du ordren i databasen og bruger ordre ID'et derefter (som typisk er baseret på et auto increment felt i tabellen).
Avatar billede dallan2007 Nybegynder
11. februar 2013 - 13:04 #2
Jamen det er stort set også såleds jeg har lavet. Alt kører i sessioner indtil kunden rammer den ovenstående side, hvorpå det hele gemmes i databasen.
Avatar billede repox Seniormester
11. februar 2013 - 13:06 #3
Hvordan ser din tabel struktur ud?
11. februar 2013 - 13:30 #4
Hvad skal der ske, hvis hvis $_SESSION['final_alle_produkter'] == ""?  Skal koden du viser kun kaldes hvis $_SESSION['final_alle_produkter'] != ""?  Kunne man forestille sig, at der ved de fire manglende ordrer har været knas med $_SESSION['final_alle_produkter'] ?  Det kunne du muligvis fange med sådan en kode struktur:

if($_SESSION['final_alle_produkter'] != "")
{
    ....
}
else
{
    echo "FAULT";
    die;
}

Samtidig med at du fanger fejl undgår du sammensatte betingelser if ... AND ...

Så søger du på allerede bestående ordrernumrer lig med $_SESSION[final_ordre_id].  Hvis select queryen giver et resultat, så lægger du 5000 til $_SESSION[final_ordre_id].  Ordren skal så bevares med den oprindelige eller den ændrede ordre_id.  Du kunne undgå to forskellige insert queries med en kode som denne:

if($_SESSION['final_alle_produkter'] != "")
{
    $ordreid = $_SESSION[final_ordre_id];
    $checkordreid = mysql_query("SELECT final_ordre_id FROM bestillinger WHERE final_ordre_id = $ordreid") or die(mysql_error());
    if (mysql_num_results) $ordreid = $ordreid + 5000;
   
    $ok = mysql_query("insert into bestillinger(final_faktura_email, final_ordre_id) values ('$_SESSION[final_faktura_email]', $ordreid)")
}
else
{
    echo "FAULT";
    die;
}

Endvidere kan du checke, om ordren bliver indsat ved at teste om $ok er true eller false, noget i retning af:

if($_SESSION['final_alle_produkter'] != "")
{
    $ordreid = $_SESSION[final_ordre_id];
    $checkordreid = mysql_query("SELECT final_ordre_id FROM bestillinger WHERE final_ordre_id = $ordreid") or die(mysql_error());
    if (mysql_num_results) $ordreid = $ordreid + 5000;
   
    $ok = mysql_query("insert into bestillinger(final_faktura_email, final_ordre_id) values ('$_SESSION[final_faktura_email]', $ordreid)")æ
    if(!$ok)
    {
        echo "ERROR";
        die;
    }
}
else
{
    echo "FAULT";
    die;
}
Avatar billede olebole Juniormester
11. februar 2013 - 14:12 #5
<ole>

At man 'normalt' laver en indkøbsvogn som en session er nu en sandhed med modifikationer. Af hensyn til brugervenligheden gøres det ligeså ofte med direkte databaseindsættelse. Ligger kurven 'kun' i en session, dør kurven ved netudfald eller anden afbrydelse - hvilket betyder, brugeren skal begynde helt forfra.

Derudover må jeg vide mere om strukturen i din app, for at kunne komme med forslag til noget bedre  =)

Dog er én ting helt sikkert: Du bør undlade at bruge MySQL-API'et, som er usikkert, langsomt og dybt forældet. Alle PHP-udviklere burde forlængst have skiftet til prepared statements - enten under PDO eller MySQLI.

/mvh
</bole>
Avatar billede repox Seniormester
11. februar 2013 - 14:22 #6
@ole Jeg er basalt set enig - det var også et meget generaliserende statement.
Avatar billede olebole Juniormester
11. februar 2013 - 14:35 #7
@repox: Jeg forventede heller ikke, vi var meget uenige i dette  *o)
Avatar billede dallan2007 Nybegynder
11. februar 2013 - 15:36 #8
Jeg takker for alle jeres forslag og kommentarer, men dælme om jeg tør at poste strukturen i min db, for den er mindst lige så forældet som mit scriptsprog ;)

Jeg har snakket lidt med quickpay (deres betalingsgateway), og konklusionen er vist, at jeg skal gennem ordren INDEN kunden går til betaling, og så efterfølgende validere den via deres callbackurl. På den måde undgår jeg at "miste" ordren, hvis kunden ikke når den afsluttende side.

-----

Hvilke bøger/websider bør man læse for at opdatere sit php-sprog?
Avatar billede dallan2007 Nybegynder
11. februar 2013 - 15:37 #9
*gennem = gemme.
Avatar billede repox Seniormester
11. februar 2013 - 15:47 #10
Ja, det var i princippet også det jeg forelagde.

Med det i mente, skal du sørge for at få fortalt din ordre i tabellen at ordren er betalt. Det gøres med callback funktionen.
Avatar billede olebole Juniormester
11. februar 2013 - 15:49 #11
Indenfor branchen taler man ofte om, at vores videnshalveringstid er ca. tre år. Det betyder, at har man været væk fra faget i tre år, er halvdelen af ens viden forældet. Bevares, det er naturligvis en forenkling, men helt galt er det nok ikke  =)

Med den hastige udvikling, der er indenfor webudvikling, bliver specielt sprog-/platformsspecifikke bøger næsten forældes, før de er trykt.

Med hensyn til webartikler, er skræmmende mange skrevet af folk, der ikke selv er særlig kompetente - og man skal så vidt muligt sørge for at vælge artikler, som ikke er over et-to år gamle.

Ellers er php.net altid et rigtig godt sted at holde sig opdateret.
Avatar billede dallan2007 Nybegynder
13. februar 2013 - 17:59 #12
repox smid et svar ^^

(Ole samler vist ikke på point.)

.oO(Gad vide hvornår eksperten.dk bliver opdateret og pointsystemet ændret...)
Avatar billede olebole Juniormester
13. februar 2013 - 18:08 #13
Det kunne måske tænkes at ske, hvis Eksperten en dag - stik mod al forventning - skulle blive opdateret med en Admin  :o|
Avatar billede repox Seniormester
13. februar 2013 - 20:05 #14
Måske man skulle overveje at starte Explorer version 2? ;)
Avatar billede repox Seniormester
13. februar 2013 - 20:06 #15
Explorer = exp ... auto correct ...
Avatar billede olebole Juniormester
13. februar 2013 - 21:32 #16
Ellers tak ... jeg prøver at holde op  :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester