Meddelande

Minska
No announcement yet.

update

Minska
X
 
  • Filter
  • Klockan
  • Show
Clear All
new posts

  • update

    Hur ska man göra för att få det rätt? 'userID' och 'updateUser' ger rätt värde men det skriver inte till mysql databasen.

    Kod:
    include "conn.php";
    
    $userID     = intval($_GET['id']);
    $updateUser = $_POST['username'];
    
    $sql = "UPDATE members SET user = '$updateUser' where id = $userID";

  • #2
    Har du mer kod? I den koden du visar exekverar du aldrig SQL-frågan.
    "Det finns tre sorters lögn; vanlig lögn, förbannand lögn och statistik" - Mark Twain

    Kommentera


    • #3
      Ja nu såg jag. Är nybörjare som du förstår. Tackar

      Kod:
      $sql = "UPDATE members SET user = '$updateUser', pass = '$updatePass' where id = $userID";
      $result = mysql_query($sql);
         
       header("Location: register.php?action=user");
       exit;

      Kommentera


      • #4
        Du borde verkligen inte passa POST-data direkt in i SQL-satsen. Vad händer om nån postar:

        Kod:
        '; DROP TABLE members; #
        i $_POST['username']?
        Johan Norberg, webbutvecklare.

        @GitHub

        Läs min blogg

        Kommentera


        • #5
          Jag tycker att du ska läsa på om PDO och/eller mysqli. mysql-funktionerna i PHP är deprecated. Det betyder att de kommer att tas bort ur PHP i någon relativt närstående version.

          Det är kanske en lite högre inlärningströskel, speciellt för PDO som är enbart objektorienterad, men det är det värt. Dels för att framtidssäkra din kod, men också ur säkerhetssynpunkt då PDO och mysqli har stöd för prepared statements som ger skydd mot SQL injections som casca gav prov på här ovanför.


          Edit:
          http://www.php.net/pdo
          http://www.php.net/mysqli
          "Det finns tre sorters lögn; vanlig lögn, förbannand lögn och statistik" - Mark Twain

          Kommentera


          • #6
            Vad tror ni om denna variant?

            Kod:
            function DoSafe($string) 
            {
            $string = mysqli_real_escape_string($conn, $string);
            return $string;
            }
            
            
            $userID     = intval($_GET['id']);
            $updateUser = DoSafe($_POST['username']);
            $updatePass = DoSafe($_POST['userpass']);
            $updateNiva = DoSafe($_POST['userniva']);
            $updateMail = DoSafe($_POST['usermail']);
               
            $sql = "UPDATE members SET user = '$updateUser', pass = '$updatePass', niva = '$updateNiva', email = '$updateMail' where id = $userID";
            $result = $conn->query($sql);
               
            header("Location: register.php?action=user");
            exit;

            Kommentera


            • #7
              Klart mycket säkrare, dock borde det generera ett felmeddelande. Du behöver deklarera $conn som global för att kunna använda den i funktionen DoSafe, alternativt skicka med $conn som argument till funktionen. Jag skulle föredra att skicka med $conn som argument till funktionen.

              Eftersom $conn är en instans av klassen mysqli kan du använda den som ett objekt.

              PHP-kod:
              function DoSafe($conn$string) {
                  return 
              $conn->real_escape_string($string);

              Läs gärna på om prepared statements i PHP-manualen. Då skulle du slippa DoSafe-funktionen, eftersom prepare fixar så att datat är säkert.

              Med ett prepared statement skulle det kunna se ut så här:
              PHP-kod:
              $stmt $conn->prepare('UPDATE members SET user=?, pass=?, niva=?, email=? WHERE id=?');
              $stmt->bind_param('ssssi'$_POST['username'], $_POST['userpass'], $_POST['userniva'], $_POST['usermail'], $_GET['id']);
              $stmt->execute(); 
              http://php.net/manual/en/mysqli.prepare.php

              Edit: En liten miss i bind_param()
              "Det finns tre sorters lögn; vanlig lögn, förbannand lögn och statistik" - Mark Twain

              Kommentera


              • #8
                En fråga. Detta gäller väl enbart vid update, skapande av ny user mm där man kan skriva till databasen. När man tex läser ut users behövs det väl inte?

                ex
                Kod:
                include "conn.php";
                
                $id = intval($_GET['id']);
                $sql = 'SELECT * FROM members WHERE id = ?';
                
                if($stmt = $conn->prepare($sql))
                {   
                   $stmt->bind_param('i',$id);
                   $stmt->execute();
                   $stmt->store_result();
                   $num_of_rows = $stmt->num_rows;
                   $stmt->bind_result($id, $user, $pass, $niva, $email);
                
                   while ($stmt->fetch()) 
                   {
                   echo 'ID: '.$id.'<br>';
                   echo 'Namn: '.$user.'<br>';
                   echo 'Lösenord: '.$pass.'<br>';
                   echo 'Nivå: '.$niva.'<br>';
                   echo 'E-Mail: '.$email.'<br>';
                   }
                   $stmt->free_result();
                   $stmt->close();
                }
                $conn->close();
                Och svaret på hela frågan blir då

                Kod:
                $userID     = intval($_GET['id']);
                $updateUser = $_POST['username'];
                $updatePass = $_POST['userpass'];
                $updateNiva = $_POST['userniva'];
                $updateMail = $_POST['usermail'];
                   
                $stmt = $conn->prepare('UPDATE members SET user=?, pass=?, niva=?, email=? WHERE id=?');
                $stmt->bind_param('ssssi', $updateUser, $updatePass, $updateNiva, $updateMail, $userID);
                $stmt->execute();
                   
                header("Location: register.php?action=user");
                exit;
                Är jag rätt nu
                Last edited by MHZ; 2015-11-26, 12:27.

                Kommentera


                • #9
                  Det viktiga är att du inte skickar in data direkt från användaren till SQL-frågan, oavsett om SQL-frågan är en SELECT, UPDATE, INSERT, DELETE eller vad det nu är. Kommer datat från något som användaren kan påverka (som POST, GET eller COOKIE) så måste du se till att datat är säkert och i det format som du förväntar dig (heltal när det ska vara heltal till exempel).

                  Sen spelar det inte så stor roll vilken metod du väljer för att säkra upp data från användaren. Prepared statements tycker jag är användbart i många fall, men i vissa fall kanske det blir onödigt komplicerat.

                  Vid en snabb överblick ser det ut som att dina kodblock ska fungera. Eventuellt kanske du vill kontrollera vad prepare respektive execute returnerar så att det fungerar som det är tänkt
                  "Det finns tre sorters lögn; vanlig lögn, förbannand lögn och statistik" - Mark Twain

                  Kommentera

                  Working...
                  X