• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP Updatowanie rekordów z bazy MySQL

VPS Starter Arubacloud
0 głosów
515 wizyt
pytanie zadane 13 stycznia 2017 w PHP przez nielotweb Bywalec (2,240 p.)

Wyciągnąłem wszystkie rekordy z bazy do tabeli ( użytkownicy ), następnie po prawej stronie dodałem pole gdzie jest input z tekstem i submit czyli malutki formularz. Ma ona edytować dany rekord w którym to siedzi. 

Formularz ma action ustawiony do do plik updateuser.php w którym zrobiłem cały kod który ma realizować edycję (update) danego użytkownika czyli danego rekordu w którym to ten forumlarz siedzi. 

Screen:

Problem tkwi w tym że gdy coś wpisuje w tym polu to edytuje wszystkie naraz rekordy ALBO rekord o ID 22 .. nie wiem w czym problem. I czy w ogóle takie rozwiązanie jest dobre?

Kod:  test.php


echo '<table width="1000" border="1" bordercolor="#d5d5d5"  cellpadding="0" cellspacing="0">';

    echo '<tr>';
        echo '<td align="center" bgcolor="e5e5e5">ID</td>';
        echo '<td align="center" bgcolor="e5e5e5">UserName</td>';
        echo '<td align="center" bgcolor="e5e5e5">Email</td>';
        echo '<td align="center" bgcolor="e5e5e5">DateRegister</td>';
        echo '<td align="center" bgcolor="e5e5e5">IDAdmin</td>';
        echo '<td align="center" bgcolor="e5e5e5"></td>';
        echo '<td align="center" bgcolor="e5e5e5"></td>';
    echo '</tr>';

    foreach ($tbl as $value) {

      $id = $value['id'];
      $_SESSION['user'] = $value['user'];
      $email = $value['email'];
      $register = $value['dataRes'];
      $id_admin = $value['adminid'];


        //DATE register
          //przekształcamy datę w przeszłości do formatu unix'owego
           $date = strtotime($register);
          //pobieramy bieżący czas
           $now = time();
          //różnice dzielimy przez jeden dzień czyli 60 s. * 60 m. * 24 godz.
           $date_r = ($now - $date) / (60 * 60 * 24);
          //część całkowita z dzielenia to liczba dni
           $date_c = floor($date_r);
          //wyswietlamy ile dni temu uzyt. sie zarejestrowal
           $register_score = $date_c." dni temu"."<br /> (".$register." )";

        //ID adminid
          if ( $id_admin == 1 )
          {
            $group = "Group Admin";
          }
          else
          {
            $group = "Group User";
          }

echo<<<END
        <tr>

            <td align="center">$id</td>
            <td align="center">{$_SESSION['user']}</td>
            <td align="center">$email</td>
            <td align="center">$register_score</td>
            <td align="center">$group</td>
            <td align="center"><a class="button_red" href="delete_user.php?id='$id'">Delete</a></td>
            <td align="center">
            <form action="updateuser.php" method="post">
               <input type="text" name="user" /><br />
               <input type="submit" value="EDIT" name="submit" />
            </form>
            </td>

        </tr>
END;

    }

echo '</table>';

 

updateuser.php

<?php

session_start();

require_once "connect.php";
$con = @new mysqli($host, $db_user, $db_password, $db_name); //Połączenie z bazą danych

$user = $_POST['user'];

$query = "UPDATE users SET user='$user' WHERE user='" . $_SESSION['user'] . "'";
$result = $con->query($query);

echo "Succes";
header("Refresh:3; url=test.php");


//header("Refresh:3; url=admin-profil.php");

mysqli_close($con);

?>

 

komentarz 13 stycznia 2017 przez CzikaCarry Szeryf (75,340 p.)
Tak w ogóle to używaj PDO, a nie MySqli, PDO ma fajniejsze bindowanie zmiennych i ogólnie jest według mnie i wieelu innych osób lepsze.

1 odpowiedź

+1 głos
odpowiedź 13 stycznia 2017 przez Szymon Lisowiec Mądrala (7,150 p.)

O ile dobrze rozumiem twój skrypt...

...dodaj do formularza

<input type="hidden" value="$id" name="id" />

i zamień

$query = "UPDATE users SET user='$user' WHERE user='" . $_SESSION['user'] . "'";

na:

$query = "UPDATE users SET user='$user' WHERE id=".(int)$_POST['id']

 

 

PS.

  • Dlaczego używasz sesji do przechowywania użytkownika, którego chcesz wyświetlić? Jeżeli używasz $_SESSION['user'] do sprawdzenia czy jesteś zalogowany, to robisz to serio źle, bo powinno przelogowywać Cię na konto, które ma to id 22 (bodajże ostatnie).
  • Google -> SQL injection
komentarz 13 stycznia 2017 przez nielotweb Bywalec (2,240 p.)
To co napisałeś zrobiłem i działa :) Dzięki wielkie! Teraz tak paczę i tak źle to strasznie zrobiłem. Inaczej to zrobię..

Użytkownika trzymałem w sesji ponieważ chciałem go przerzucić do tego pliku updateuser.php do tego zapytania. Wiem, beznadziejny pomysł.

A co do SQL injection to wiem, tylko narazie się uczę i jak to ogarnę to oczywiście zabezpieczę skrypt.
komentarz 13 stycznia 2017 przez nielotweb Bywalec (2,240 p.)

Mam pytanie jeszcze a jakbym zrobił tak że tam w tabeli dał takie coś:

    <td align="center"><a href="updateuser.php?id=$id">EDIT</a></td>

A w updateuser.php 

<?php

session_start();

require_once "connect.php";
$con = @new mysqli($host, $db_user, $db_password, $db_name); //Połączenie z bazą danych

$id = isSet( $_POST['id'] ) ? intval( $_POST['id'] ) : 0;

if( isset($_POST['submit']) ) {

    $user = $_POST['user'];

    $query = "UPDATE users SET user='$user' WHERE id='$id'";
    $result = $con->query($query);

    echo "Succes";
    header("Refresh:3; url=test.php");
}

echo<<<END
<form action="updateuser.php" method="post">
  <input type="hidden" value="$id" name="id" />
  <input type="text" name="user" /><br />
  <input type="submit" value="Zaloguj" name="submit" />
</form>
END;

mysqli_close($con);

?>

Czyli z tabeli przekazał ID Getem i odebrał tutaj w pliku. Dałem też tutaj formularz i odrazu kod który się ma wykonać. To jest dobry pomysł czy nie? A i coś w nim nie pyka, bo nie ma żadnego błędu ale rekord czyli nazwa się nie zmienia :/

1
komentarz 14 stycznia 2017 przez korey Nowicjusz (140 p.)

Wydaje mi sie ze jesli uzywasz takiej metody:

<a href="updateuser.php?id=$id">

to znaczy ze przekazujesz ID metoda $_GET a nie $_POST. :)

Pozdrawiam

 

 

Podobne pytania

0 głosów
1 odpowiedź 2,431 wizyt
0 głosów
1 odpowiedź 555 wizyt
pytanie zadane 20 lutego 2017 w JavaScript przez krystian904 Mądrala (6,820 p.)
0 głosów
2 odpowiedzi 13,333 wizyt

92,454 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...