Avatar billede AnyFellow Mester
08. juni 2012 - 10:05 Der er 7 kommentarer og
1 løsning

Er shoppingcart.php kaldt via jquery eller via normal klik

Jeg er ved at lave en indkøbskurv.

Varer tilføjes i kurven vha et link:
<a class="add_basket" href="shoppingcart.php?item=123">+</a>

Jeg bruger jquery til at fange klikket og via shoppingcart.php tilføjes varen i min inkøbskurv. Shoppingcart.php returnerer indholdet af indkøbskurven som json. En jquery-funktion viser den opdaterede indkøbskurv (uden at siden generelt reloades).

Jeg vil dog også gerne have at min indkøbskurv kan bruges af personer der ikke har javascript aktiveret i deres browser, men jeg er i tvivl om hvordan jeg kan gøre dette.

Hvis brugeren ikke har javascript aktiveret, og klikke på linket, vil brugerens browser naturligvis åbne shoppingcart.php.

Hvordan kan jeg styre hvornår shoppingcart.php skal returnere json (når javascript er aktiveret) eller opdatere indkøbskurven og reloade min vareside med den opdaterede indkøbskurv (når javascipt er deaktiveret)?
Avatar billede Soeren_K_K Nybegynder
08. juni 2012 - 10:58 #1
Havde du givet os din JQuery havde det være noget nemmere at tilpasse det til dit projekt, men siden du ikke har må du prøve at modificere det jeg giver her til dit projekt.


Jeg går ud fra du bruger en post værdi på din shoppingcart.php.

Derfor kan du via endnu en $_GET variabel vælge om det er JQuery eller A-tagget der skal aktiveres.


Start med at ændre dit A-tag til:

<a class="add_basket" href="shoppingcart.php?item=123&type=href">+</a>


Løsning 1:

JQuery:


$('#opdater_vare').click(function() {

    var vare_id = $('#vare_id').val();
    var type = "jquery";

    $.ajax({
    url: 'shoppingcart.php',
    type: 'GET',
    data: 'vare_id=' + vare_id + '&type=' + type,

        success: function(result) {

              // her indsætter du hvad der skal ske når der er fuldført

        }
    })
});



Det som scriptet her gør er at sende data (fra en form) af sted når der klikkes på en bestemt knap.


PHP scriptet:


<?php

if ($_GET['type'] == "JQuery")
{

  // her skal det der skal ske gøres hvis det er med JQuery

}
elseif ($_GET['type'] == "href")
{

  // her skal det der skal ske gøres hvis det er via A-tagget (fordi JavaScript er deaktiveret)

  // husk her at smide en header("location: fil.php"); ind da brugeren ellers vil sidde fast på shoppingcart.php

}
else
{

  echo "Fejl";

}

?>



Løsning 2:


Derefter kommer vi til

JQuery:


$('#opdater_vare').click(function() {

    var vare_id = $('#vare_id').val();
    var type = "jquery";

    $.ajax({
    url: 'shoppingcart.php',
    type: 'POST',
    data: 'vare_id=' + vare_id + '&type=' + type,

        success: function(result) {

              // her indsætter du hvad der skal ske når der er fuldført

        }
    })
});



Det som scriptet her gør er at sende data (fra en form) af sted når der klikkes på en bestemt knap.


PHP scriptet:


<?php

if ((isset($_POST['type'])) AND ($_POST['type'] == "JQuery"))
{

  // her skal det der skal ske gøres hvis det er med JQuery

}
elseif (isset($_GET['type']) == "href")
{

  // her skal det der skal ske gøres hvis det er via A-tagget (fordi JavaScript er deaktiveret)

  // husk her at smide en header("location: fil.php"); ind da brugeren ellers vil sidde fast på shoppingcart.php

}
else
{

  echo "Fejl";

}

?>



Her gør vi sådan at selvom en bruger skulle pille ved dit script sådan at form-taggets action er "shoppingcart.php?item=123" samt ændre din JQuery til at sende dig videre til shoppingcart.php og på den måde eventuelt øge antallet af varer pga de fejl, vi gør her at hvis POST (JQuery) er den måde som bliver brugt vil vi bruge den, også selvom $_GET['href'] (A-tagget) er sat.

Der er fordele og ulemper men det vil virke lige så godt som løsning 1. Grunden til det er at JQuery er JavaScript og du kan ikke "gemme" din JavaScript for dine besøgende derfor kan de besøgende se hvad dit script indeholder og derved kan de lave deres egne scripts til og masse bestille varer. Derfor skal du også sørge for at tjekke om måde der er blevet bestilt på (den side de kom fra, passer med dit domæne, hvis ikke skal der ikke lægges varer i kurven) er fra din side.

Håber du kunne bruge en af mine løsninger.

// Søren_K_K
Avatar billede AnyFellow Mester
08. juni 2012 - 11:09 #2
Data overføres med GET.

Ud fra det du skriver kan jeg udlede at det nemmeste vil være at jeg i min jquery medsender yderligere en variabel, som jeg så kan kontrollere i shoppincart.php.

Er variablen sat er kaldet kommer via jquery og der skal returneres data i json-format.

Jeg er ikke nervøs for brugerens forsøg på "hacke" min indkøbskurv idet der allerede er taget højde for dette i shoppingcart.php.

Mit ønske var at siden fungerer som den skal når brugeren har deaktiveret javascript, men at oplevelsen forbedres når javascript er aktiveret.

Tak for hjælpen. Læg et svar og der er point på vej.
Avatar billede Soeren_K_K Nybegynder
08. juni 2012 - 11:27 #3
Det jeg ville have du skulle gøre var at give en variabel mere, og så tjekke dens værdi, ikke som du skrev med at tjekke om den er sat, for hvis den kun var sat ville dens værdi være ligegyldig og det vil få nogle script kiddies til at forsøge at hacke dine scripts.

Men så længe det virker for dig er jeg tilfreds.


// Søren_K_K
Avatar billede AnyFellow Mester
08. juni 2012 - 11:58 #4
Jeg kan ikke se forskellen sikkerhedsmæssigt i værdiens indhold, idet en bruger med onde hensigter kan sætte værdien som vedkommende ønsker. Om jeg sætter værdien til "jquery", "href" eller noget helt tredie er kun hjælp til mig selv til at kunne gennemskue min egen kode efterfølgende.

Den kontrol jeg kan laver serverside for referer mener jeg ikke kan anvendes til noget sikkerhedsmæssigt, idet det er brugerens computer der styrer den 100%.

Mit mål er at min side fungerer som den skal uanset om javascript er aktiveret eller ej.

I min verden anvendes javascript til at optimere brugeroplevelsen og ikke andet.

Alt hvad der kommer fra brugerens pc, uanset om det er GET eller POST, jquery eller ikke jquery, skal behandles som usikker, idet brugeren altid har mulighed for at redigere i data.

Min shoppingcart.php laver nogle kontroller på data der modtages. Eneste forskel med den ekstra værdi jeg tilføjer, vil være om data skal sendes som json eller skal echoes via reload af varsiden.
Avatar billede Soeren_K_K Nybegynder
08. juni 2012 - 14:01 #5
I så fald har du ret på det punkt, men forstå fra min side af at man bør oplyse om de ting der kan ske når man ikke kan se hvad du sidder med og kender til din viden.

Men ja du er rigtig på den her.
Avatar billede olebole Juniormester
08. juni 2012 - 18:24 #6
<ole>

Man kan jo også bruge XMLHttpRequest (og jQuery), som det er tænkt. Der er jo netop skabt mulighed for at sætte request headers til dette (og alle mulige andre) formål:

function setHeader(oXHR) {
    oXHR.setRequestHeader("Request-Type", "XHR");
}

$.ajax({
    url: "shoppingcart.php",
    type: "POST", // eller "GET"
    data: "vare_id=" + vare_id,
    beforeSend: setHeader,

    success: function(result) {
          // her indsætter du hvad der skal ske når der er fuldført
    }
});

- så kan du bare kikke efter $_SERVER['Request-Type'] på serveren. Hvis den er sat med værdien XHR, kommer forespørgslen fra et XMLHttpRequest object. Simple as that  =)

"Jeg er ikke nervøs for brugerens forsøg på "hacke" min indkøbskurv idet der allerede er taget højde for dette i shoppingcart.php"

Det lyder flot, men mon det passer?  =)

Hvis du logger ind i din database på formen:

mysql_connect('localhost', 'mysql_user', 'mysql_password');
$db = mysql_select_db('foo');

- er svaret afgjort 'Nej'!

Hvis du, hvergang der logges ind i databasen, bruger samme brugernavn og password ('mysql_user' og 'mysql_password' ovenfor) i din connect, er svaret afgjort 'Nej'!

Kan du garantere, at du ikke ét eneste sted har glemt at slette fejlmeldinger i stil med:

$res = mysql_query(' ... ... ... ') or die (mysql_error());

- ellers er svaret afgjort 'Nej'!

/mvh
</bole>
Avatar billede AnyFellow Mester
08. juni 2012 - 19:25 #7
olebole...>
Selvfølgelig lyder det 'flot' men jeg ligger ikke inde med nogle oplysninger omkring at der skulle være forskel på at shoppingcart.php bliver kaldt via jquery eller via en almindelig http-request fra brugerens browser?

Input fra brugeren bliver valideret som jeg mener de skal valideres. Forespørgsler i min database bliver foretaget med en read-only bruger vha. stored procedures og mysqli. Fejlkoder fra php og 'or die' bliver kun vist hvis mit script bliver sat i debug-mode.

Brugen kan manipulere data på browsersiden lige nøjagtig som vedkommende vil, og mit postulat var at sikkerheden er håndteret som jeg mener den skal håndteres.
Avatar billede olebole Juniormester
08. juni 2012 - 19:54 #8
Således belært om din fornuftige kodestil, tager jeg armene ned og sætter mig roligt tilbage i stolen. Den slags møder man alt for sjældent på E  *o)

- men overvej at identificere XHR på en header. Da der er tale om metainfo, er headeren det mest naturlige sted at anbrige dem  =)
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