Gjest Skrevet 3. juni 2016 Del Skrevet 3. juni 2016 Hei! Jeg er 18 år og ny med php. Har støtt på et problem som jeg håper noen her kan hjelpe meg med. Jeg har laget en database med to tabeller, "kunde" og "produkt". Når en kunde bestiller et produkt så må kunden skrive inn sin kunde-ID. Denne kunde-ID-en er lagret i kunde-tabellen, sammen med kontaktinformasjon for kunden. Men hvis en kunde gjør en bestilling og fyller ut en kunde-ID som ikke finnes (i kunde-tabellen), så går bestillingen gjennom, men med feil kunde-ID. Det blir da umulig å kontakte kunden og si at han/hun fylte inn feil ID, fordi denne ID-en er nødvendig for å finne kontaktinfo. Jeg vil derfor at når dette skjer så skal kunden få opp en melding à la "Du skrev inn et kundenummer som ikke er i bruk. Prøv igjen eller kontakt oss på tlf. ****" Her er php-koden min: <?php $servername = "MITTSERVERNAVN"; $username = "MITTBRUKERNAVN"; $password = ""; $dbname = "DATABASENAVN"; $kundeid=$_POST[kundeid]; $produkttype=$_POST[produkttype]; $produktstorrelse=$_POST[produktstorrelse]; $produktfarge=$_POST[produktfarge]; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("<center>Vi kunne ikke koble til våre systemer. Vennligst ring oss på tlf. ****.</center>" . $conn->connect_error); } $sql = "INSERT into Produkt (kundeid, produkttype, produktstorrelse, produktfarge, bestillingstid) VALUES ('$kundeid', '$produkttype', '$produktstorrelse', '$produktfarge', NOW())"; if ($conn->query($sql) === TRUE) { echo "<center>Bestilling bekreftet!</center>"; } else { echo "<center>Vi kunne ikke hente ut informasjonen. Vennligst ring oss på tlf. ****. </center>" . $sql . "<br>" . $conn->error; } $conn->close(); ?> Noen som vet hva jeg bør gjøre? Lenke til kommentar
Crowly Skrevet 3. juni 2016 Del Skrevet 3. juni 2016 Her er det flere ting du må lese deg opp på, for det er mange muligheter for missbruk: Alltid valider og saniter input, aldri stol på brukeren. filter_input() og filter_var() er ett sted å starte. filter oversikt. $kundeid = filter_input(INPUT_POST, 'kundeid', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW); // FILTER_FLAG_STRIP_LOW fjerne alle tegn med acsii verdi <= 32 $produkttype = filter_var($_POST['produkttype'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW); // hvis du vil bruke filter_var i stedet for, begge gjør mer eller mindre det samme $produktstorrelse = filter_var($_POST['produktstorrelse'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW); $produktfarge = filter_var($_POST['produktfarge'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW); Å sette variabler rett inn i sql'en slik du gjør, og spesielt uten validering og sanitering, åpner for sql injections. Ta i bruk mysqli_real_escape_string() og/eller les deg opp på prepared statements.Ikke send feilmeldinger fra databasen og slikt til brukeren, dette kan synliggjøre informasjon som potensielt kan missbrukes. Kjør det til en log fil i stedet for. Til problemet ditt så må du først kjøre en select som sjekker at kunde id'en er gyldig, og tilhører innlogget bruker (slik at ingen andre kan legge inn bestillinger for andre), er den det kan du fortsette med insert'en, hvis ikke så vis en feilmelding. Skal du videreutvikle dette så er ikke kunde id noe bruker skal trenge å forholde seg til. Etter innlogging så lagrer du det i session variabelen ($_SESSION['kunde_id'] = $kundeID;) Lenke til kommentar
Gjest Skrevet 3. juni 2016 Del Skrevet 3. juni 2016 (endret) Til problemet ditt så må du først kjøre en select som sjekker at kunde id'en er gyldig, og tilhører innlogget bruker (slik at ingen andre kan legge inn bestillinger for andre), er den det kan du fortsette med insert'en, hvis ikke så vis en feilmelding. Skal du videreutvikle dette så er ikke kunde id noe bruker skal trenge å forholde seg til. Etter innlogging så lagrer du det i session variabelen ($_SESSION['kunde_id'] = $kundeID;) Hei, takk for råd, jeg skal prøve ut alt dette som neste prosjekt, men vil så gjerne ha denne enkle versjonen til å fungere. Skal ikke bruke den som en ekte butikk altså (foreløpig i alle fall). Men hvor skal jeg sette select-spørringen. Skal det stå sånn $sql = "select-spørring" if () echo " " else echo" " foran inset-spørringen, eller er de i samme "$sql="-linje? Og hva skal select-spørringen være, skal det være noe i nærheten av SELECT kundeid FROM Kunde WHERE kundeid=notNULL Jeg vet jeg er superdårlig på php, men håper du vil svare, dette er det siste jeg mangler på nettsiden (er hakket bedre i html/css). Endret 3. juni 2016 av Gjest Lenke til kommentar
Crowly Skrevet 3. juni 2016 Del Skrevet 3. juni 2016 (endret) $sql = "SELECT ...."; $result = $conn->query($sql); $gyldigKundeID = ($result->num_rows === 1); // eller noe annet fra select'en som angir at kundeid er gyldig if ($gyldigKundeID) { // prepared statement $statement = $conn->prepare("INSERT into Produkt (kundeid, produkttype, produktstorrelse, produktfarge, bestillingstid) VALUES (?, ?, ?, ?, NOW())"); $statement->bind_param('dsss', $kundeid, $produkttype, $produktstorrelse, $produktfarge); // regner med at kundeid er integer (d), og de andre er string (s) $statement->execute(); } else { // feilmelding } Codecourse på youtube (har også sin egen side: https://www.codecourse.com)har gode videoer, vil tro denne kan være nyttig (har ikke sett den) Build a Shopping Cart with PHP. https://laracasts.com er en annen god side med mange gode videoer (noen må du ha en abonnement for å se). Laravel From Scratch kan være ett greit sted å begynne når du føler det klar for å se på ett rammeverk, i dette tilfellet Laravel, som er ett godt og populært rammeverk for php. Rammeverk sparer deg for masse arbeid da mye funksjonalitet er allerede på plass. Endret 3. juni 2016 av Crowly Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå