Permalänk

updatering av mysql i php

Hej!
jag sitter och försöker få ihop ett script som ska uppdatera min mysql server när man fyller i ett formulär i php. Jag kan inte fatta varför det inte fungerar. Den är till en medlems sida. Skulle någon kunna hjälpa mig?

Jag har en conection till en databass include "config.php"

<?php session_start(); if(!session_is_registered(username)){ header("location:login.php"); } ?> <?php include ("config.php"); $sql = "SELECT * FROM users WHERE username='$username' "; $result=mysql_query($sql); while($row=mysql_fetch_array($result)){ $username = $row["surname"]; $firstname = $row["firstname"]; $surname = $row["surname"]; $weight = $row["weight"]; $height = $row["height"]; } function filter($date) { return trim(htmlspecialchars($date)); } $username = filter($_POST['username']); $firstname = filter($_POST['firstname']); $surname = filter($_POST['surname']); $weight = filter($_POST['weight']); $height = filter($_POST['height']); if (username) { $sql = mysql_query ("UPDATE users SET username='$username', firstname='$firstname', surname='$surname', weight='$weight', height='$height' WHERE username='$username'") or die (mysql_error()); } ?> <form action="konto.php" method="post"> Username: <input type="text" name="username" id="username" value="<?php echo $username; ?>"><br /> Firstname: <input type="text" name="firstname" id="firstname" value="<? echo $firstname; ?>"><br /> Surname: <input type="text" name="surname" id="surname" value="<?php echo $surname; ?>"><br /> weight: <input type="text" name="weight" id="weight" value="<?php echo $weight; ?>"><br /> height: <input type="text" name="height" id="height" value="<?php echo $height; ?>"><br /> <input type="submit" value="Submit"> </form>

Permalänk
Medlem

1. skriv inte i mysql längre, språket är övergivet för det är fyllt av säkerhetshål. använd pdo eller mysqli istället.
2. varför cleanar du datumet men inte användarnamnet?
3. din form action ser väldigt konstig ut med alla echos.
4. felet ligger här: "if (username)"

Visa signatur

Min dator: Silent Base 600 | 1700X @ 3.9Ghz | MSI Gaming X 1080TI | RM750X | 512Gb M2 | 16Gb 3200mhz Ram | S34E790C @ 3440x1440
Tjejens dator: Define r4 | i5 3570k @ 4.2ghz | GTX Titan | 750w Supernova | 240gb SSD | 32gb ram
Citera/Tagga för svar!

Permalänk
Skrivet av Christley:

1. skriv inte i mysql längre, språket är övergivet för det är fyllt av säkerhetshål. använd pdo eller mysqli istället.
2. varför cleanar du datumet men inte användarnamnet?
3. din form action ser väldigt konstig ut med alla echos.
4. felet ligger här: "if (username)"

okej tack.
Är pdo bara en koppling mellan en mysql server ? eller vad är de?

Permalänk
Medlem
Skrivet av mattias1998:

okej tack.
Är pdo bara en koppling mellan en mysql server ? eller vad är de?

ja det är det

Visa signatur

Min dator: Silent Base 600 | 1700X @ 3.9Ghz | MSI Gaming X 1080TI | RM750X | 512Gb M2 | 16Gb 3200mhz Ram | S34E790C @ 3440x1440
Tjejens dator: Define r4 | i5 3570k @ 4.2ghz | GTX Titan | 750w Supernova | 240gb SSD | 32gb ram
Citera/Tagga för svar!

Permalänk
Legendarisk

@mattias1998: Koden du postade bör ge ett antal varningar, och fungerar inte alls i nyare versioner av PHP. Har du inte sett något av detta så kontrollera dina loggar och inställningar för felrapportering, medans du skriver vill du antagligen bara aktivera fullständig rapportering så att du kan fånga så mycket som möjligt direkt:
http://php.net/manual/en/errorfunc.configuration.php


if(!session_is_registered(username)){ header("location:login.php"); }

  • Funktionen session_is_registered() är borttagen sedan PHP 5.4.0. Har du upptäckt den via någon tutorial så är det dags att slänga det bokmärket.

  • Utan $ framför namnet kommer username tolkas som en konstant. Det verkar dock varken finnas någon konstant eller variabel med namnet username vid det här tillfället.

  • Funktionen header() sätter endast en ny svarsheader (illustration), den kommer inte avbryta scriptet innan det har kört till slutet. Är det inte din avsikt så måste du själv strukturera scriptet så att det avslutas efter det anropet; ett lätt sätt att göra det är att anropa die(); efteråt (men var försiktig med när du dödar scriptet på det sättet - det skapar lätt kod som är rörig och svår att följa).


$sql = "SELECT * FROM users WHERE username='$username' "; $result=mysql_query($sql); while($row=mysql_fetch_array($result)){ $username = $row["surname"]; $firstname = $row["firstname"]; $surname = $row["surname"]; $weight = $row["weight"]; $height = $row["height"]; }

  • Som @Christley påpekade så bör inte ext/mysql användas längre, för att prata med MySQL bör du istället använda PDO eller ext/mysqli. Här finns ett tidigare svar i ämnet med exempel på hur du använder båda: #15625697. Hittar du guider som använder sig av de här gamla mysql_-funktionerna (utan i) så är även det ett bra tecken på att de är utdaterade.

  • Har du deklarerat $username utanför loopen? Det används i din sql-fråga, men verkar sakna värde vid det tillfället och borde generera en varning.

  • Undvik att återanvända variabelnamn. Utanför loopen verkar $username betyda en sak, men inuti något annat.

  • Var noggrann med hur du formaterar din kod. Ett litet indrag för raderna i loopen gör det mycket lättare att läsa och minskar risken för misstag:

    while(someCondition()) { doThis(); doThat(); }


if (username)

  • Även här saknas $ framför variabelnamnet.

  • Du bör även förtydliga vad det är du testar. $username är antagligen en textsträng och PHP kommer evaluera den till sant/falskt på olika sätt beroende på vad den innehåller, det kanske är precis vad du vill men för andra som läser koden ser det lätt ut som ett misstag. Se http://php.net/manual/en/types.comparisons.php. I det här fallet vill du nog hellre kontrollera if( strlen($username) > 0 ).


function filter($date) { return trim(htmlspecialchars($date)); } $username = filter($_POST['username']); $firstname = filter($_POST['firstname']); $surname = filter($_POST['surname']); $weight = filter($_POST['weight']); $height = filter($_POST['height']); $sql = mysql_query ("UPDATE users SET username='$username', firstname='$firstname', surname='$surname', weight='$weight', height='$height' WHERE username='$username'")

  • UPDATE `users` SET `username` = $newUsername WHERE `username` = $newUsername;? Har detta något att göra med att $username tycks användas på olika sätt utanför och inuti loopen?

  • Hellre än att identifera konton via användarnamn så borde de tilldelas id-nummer.

  • filter($_POST['username']) kommer generera varningar om värdet inte är satt i $_POST. Du behöver kontrollera det med isset() innan du försöker använda värdet.

  • Värden i $_GET/$_POST kan vara antingen strängar eller arrayer. Kontrollera om värdet är en sträng innan du försöker använda det som sådan.

  • Varför heter parametern till filter $date? God namngivning gör koden lättare att arbeta med.

  • När du skickar värden till databasen direkt i frågan så måste dessa escapas för att undvika att de påverkar strukturen; annars riskerar du att bli utsatt för SQL injection, att någon lurar scriptet att uföra något annat än vad du avsett. I ditt nuvarande bibliotek gör du det via mysql_real_escape_string(). Det finns motsvarigheter i PDO och ext/mysqli. Ett bättre alternativ är dock att försöka använda parameteriserade frågor, det blir lättare att göra rätt på det sättet. Både PDO och ext/mysqli har stöd för det, men det äldre ext/mysql har det inte. Här finns exempel på hur man gör det i PDO: http://www.php.net/manual/en/pdo.prepare.php

  • filter() gör inte tillräckligt mycket för att kontrollera om värdet är giltigt. De olika namnen bör kontrolleras för längd, om de är giltiga för din teckenkodning, kanske om det finns dubletter av användarnamnet osv., och för bredd/höjd kanske du borde testa om de är numeriska och inom rimliga intervall.


Hoppas att det inte blev för mycket information på en gång.

Visa signatur

Abstractions all the way down.

Permalänk
Inaktiv
Skrivet av Christley:

1. skriv inte i mysql längre, språket är övergivet för det är fyllt av säkerhetshål. använd pdo eller mysqli istället.

"språket" som du kallar det är inte övergivet, men själva mysql api delen i PHP är. ville bara poängtera det.