Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]problem z usuwaniem rekordów
Forum PHP.pl > Forum > Przedszkole
polkm2000
Witam, mam problem z dodaniem funkcjonalności która pozwoli usuwać z tabelki konkretne rekordy. Wygląda to tak:

$mysqli = new mysqli("localhost", "root", "" , "magazyn");
$id = $_GET["id"];
$usun = "DELETE FROM zlecenia_mag WHERE id='$id'";
mysqli_query($mysqli, $usun);
mysqli_close($mysqli);

błąd: wyskakuje mi przy poleceniu get, mam 3 tabelki a polecenie GET pobiera id z tabeli pierwszej.
Jak zrobić żeby pobierał z tabeli drugiej?

Proszę o pomoc, góry dzięki!
trueblue
GET/get to nie jest polecenie, a zmienna.
W $_GET['id'] jest wartość jaką przekażesz w query string, np. index.php?id=100
Jeśli chcesz, aby znajdywała się tam wartość z id konkretnego rekordu, to taki link musisz spreparować i wstawić w kodzie HTML.
polkm2000
Pokazuje jak to u mnie wygląda, mam wrażenie że robię jakiś głupi błąd, nie za bardzo rozumiem jak miałbym zrobić to o czym mówisz. Wstawiam więcej kodu:
Męczę się z tym od kilku dni i próbuje na różne sposoby ale już nie mam pomysłów :/

<table>
<tr>
<th>Nazwa towaru</th>
<th>Ilość towaru w produkcji</th>
<th>Ilość towarów uszkodzonych</th>
<th>Ilość towarów gotowych</th>
<th>Data zlecenia</th>
</tr>

<?php

$connection = mysqli_connect('localhost', 'root', '', 'magazyn');
$result = mysqli_query($connection, "SELECT zlecenia_id nazwa, ilosc_produkcja, ilosc_uszkodzone, ilosc_gotowe, data FROM zlecenia_mag ORDER BY data DESC");
while ($row = mysqli_fetch_row($result)) {
if ($row[3] > $row[4]) echo '<tr class="uszkodzone">';
else echo '<tr class="gotowe">';
echo '<td>'.$row[0].'</td>';
echo '<td>'.$row[1].'</td>';
echo '<td>'.$row[2].'</td>';
echo '<td>'.$row[3].'</td>';
echo '<td>'.$row[4].'</td>';
echo '<td><a href="index.php?id='.$row[0].'">Usuń</a></td>';

}
mysqli_close($connection);


$mysqli = new mysqli("localhost", "root", "" , "magazyn"); // tak nas uczą na studiach, podobny przykład był na zadaniu w uczelni tylko tam była jedna tabelka i to działało
$id = $_GET["zlecenia_id"];
$usun = "DELETE FROM zlecenia_mag WHERE id='$id'";
mysqli_query($mysqli, $usun);
mysqli_close($mysqli);
?>
</table>
viking
A to $id = $_GET["zlecenia_id"]; skąd się bierze? W kodzie masz index.php?id='.$row[0] przy czym indeks 0 to nazwa a nie id.
polkm2000
Sugerowałem się tym:
Undefined array key id to błąd ktory mi wyskoczył
viking
A masz w tej tabeli w ogóle kolumnę zlecenia_mag.id? Bo wybierasz zlecenia_id i chcesz na tej podstawie kasować id. Mylisz zmienne GET. i nie zgadza się ilość th z td.
trueblue
Cytat(polkm2000 @ 13.01.2023, 19:33:31 ) *
  1. SELECT zlecenia_id nazwa, ilosc_produkcja,

Tu brakuje przecinka, będziesz miał przesunięte dane w zmiennej $row;
polkm2000
Cytat(viking @ 13.01.2023, 20:05:20 ) *
A masz w tej tabeli w ogóle kolumnę zlecenia_mag.id? Bo wybierasz zlecenia_id i chcesz na tej podstawie kasować id. Mylisz zmienne GET. i nie zgadza się ilość th z td.

mam kolumne: "zlecenia_id"

Udało mi się już rozwiązać problem usuwania:

<form action="index.php" method="post">
<label>Nazwa towaru: </label>
<input type="text" name="nazwa">
<br><br>
<label>Ilośc gotowych towarów: </label>
<input type="number" name="gotowe">
<br><br>
<label>Ilość towarów uszkodzonych: </label>
<input type="number" name="uszkodzone">
<br><br>
<label>Ilość towarów w produkcji: </label>
<input type="number" name="produkcja">
<br><br>
<label>Data zlecenia </label>
<input type="date" name="data">
<br><br>
<button class="btn" type="submit">Wyślij</button>
</form>

<?php

if (!empty($_POST['nazwa'])) {
echo var_dump($_POST['nazwa']);
$connection = mysqli_connect('localhost', 'root', '', 'magazyn');
$nazwa = $_POST["nazwa"];
$gotowe = $_POST["gotowe"];
$uszkodzone = $_POST["uszkodzone"];
$produkcja = $_POST["produkcja"];
$data = $_POST["data"];

$result = mysqli_query($connection, "INSERT INTO zlecenia_mag(nazwa, ilosc_gotowe, ilosc_produkcja, ilosc_uszkodzone, data) VALUES('$nazwa', '$gotowe', '$produkcja','$uszkodzone', '$data');");
mysqli_close($connection);

unset($_POST);
header("Location: ".$_SERVER['PHP_SELF']);
}
?>
<table>
<tr>
<th>ID</th>
<th>Nazwa towaru</th>
<th>Ilość towaru w produkcji</th>
<th>Ilość towarów uszkodzonych</th>
<th>Ilość towarów gotowych</th>
<th>Data zlecenia</th>
</tr>

<?php

$connection = mysqli_connect('localhost', 'root', '', 'magazyn');
$result = mysqli_query($connection, "SELECT zlecenia_id, nazwa, ilosc_produkcja, ilosc_uszkodzone, ilosc_gotowe, data FROM zlecenia_mag ORDER BY data DESC");
while ($row = mysqli_fetch_row($result)) {
if ($row[3] > $row[4]) echo '<tr class="uszkodzone">';
else echo '<tr class="gotowe">';
echo '<td>'.$row[0].'</td>';
echo '<td>'.$row[1].'</td>';
echo '<td>'.$row[2].'</td>';
echo '<td>'.$row[3].'</td>';
echo '<td>'.$row[4].'</td>';
echo '<td>'.$row[5].'</td>';
echo '<td><a href="index.php?id='.$row[0].'">Usuń</a></td>';

}
mysqli_close($connection);


$mysqli = new mysqli("localhost", "root", "" , "magazyn");
$row[0] = $_GET["id"];
$usun = "DELETE FROM zlecenia_mag WHERE zlecenia_id='$row[0]'";
mysqli_query($mysqli, $usun);
mysqli_close($mysqli);

?>
</table>


Ale nadal wyskakuje błąd w linijce $row[0] = $_GET["id"];
Po pierwszym kliknięciu usuń znika błąd: Undefined array key "id"
Po drugim kliknięciu usuwa rekord

Ale dalej nie rozumiem co jest nie tak ;((
polkm2000
Cytat(viking @ 14.01.2023, 00:00:09 ) *


Niestety nic mi to nie mówi, mógłbyś podpowiedzieć lub dać wskazówki w którą stronę się kierować lub co powinienem zrobić a sam poszukam rozwiązania.
z góry dzięki!
Salvation
Po pierwsze, to nie pobiera się wartości bezpośrednio z $_GET czy $_POST. Jeżeli już to robisz, bo np. się uczysz, to musisz pamiętać, że to jest po prostu globalna tablica. Jeżeli wiesz co to jest tablica w programowaniu i jak działa, to już jesteś na dobrej drodze.

Błąd, który dostajesz, informuje cię o braku wymaganego klucza - w twoim przypadku "id". Jakbyś popracował trochę z tablicami, to problem byłby błahy.
Musisz pamiętać, że w tablicy może nie być klucza, który próbujesz pobrać. Dlatego zanim zrobisz przypisanie, musisz sprawdzić czy klucz w tablicy istnieje.

Jest kilka rozwiązań Twojego problemu, jednak najpopularniejszym będzie to:
  1. $orderId = $_GET['id'] ?? null;
  2.  
  3. if (is_int($orderId)) {
  4. $orderId = (int)$orderId;
  5. }
  6.  
  7. if ($orderId !== null && $orderId > 0) {
  8. $mysqli = ...;
  9. mysqli_query($mysqli, sprintf('DELETE FROM zlecenia_mag WHERE zlecenia_id=\'%d\'', $orderId));
  10. mysqli_close($mysqli);
  11. }
polkm2000
Dzięki faktycznie pomogło, usuwa dany rekord i nie wyświetla błędu, jedynie zastanawia mnie dlaczego trzeba kliknąć 2 razy usuń aby rekord został usunięty.
Domyślam się że trzeba pokombinować przy tej linijce kodu:

echo '<td><a href="index.php?id='.$row[0].'">Usuń</a></td>';

Lub zmienić coś przy przycisku wyślij
viking
Zapewne usuwa za pierwszym razem ale ponieważ kasowanie masz po wyświetlaniu to pokaże to dopiero po odświeżeniu strony.
Salvation
Przekierowanie na tą samą stronę po usunięciu powinno rozwiązać problem.
polkm2000
Dzięki przekierowanie pomogło biggrin.gifD

A mam pytanie jeszcze odnośnie dodanie klasy żeby mój link lepiej wyglądał jeżeli dodaje class="btn" to mi nie działa, oczywiście w css jest wszystko dobrze bo przycisk wyślij ma tą samą klase i działa

echo '<td><a href="index.php?id='.$row[0].'" class="btn" >Usuń</a></td>';

Jakaś podpowiedź?
nospor
Cytat
Dzięki przekierowanie pomogło

Przekierowanie tylko zamaskowalo problem jaki masz.
Przeciez to jest prosta logika: teraz najpierw wyswietlasz dane z bazy, potem kasujesz dane z bazy i sie dziwisz ze na wyswietlaniu przed kasowaniem te dane sa....
Najpierw sie kasuje, potem sie wyswietla. Przeciez to jest tak logiczne i oczywiste. Wowczas nie ma problemu ktory to zaobserwowales.

Co to klasy to przeciez button i A to dwie rozne rzeczy ktore leza w innych miejscach a klasa w css jest pewnie tak skonstruwaona ze dziala tylko dla tego buttona
polkm2000
tak mam przygotowany css:

.btn{
text-decoration: none;
color: black;
background-color: #ffffff;
padding: 0px 25px;
}
.btn:hover{
color: white;
background-color: #000000;
}
Salvation
@nospor ma rację co do tego skryptu na usuwanie rekordu.
Zasada główie jest taka, że najpierw wykonywalny kod PHP (najlepiej zamknięty co najmniej w funkcjach), a dopiero później echo i wyświetlenie HTML-a.

A wracając do problemu z buttonem, to ciężko pomóc, bo CSS jest poprawny, ale skoro nie widać zmian, to coś musi go nadpisywać. A żeby to pomóc musielibyśmy mieć dostęp do LIVE strony, którą robisz.
Ewentualnie sam to ogarnij używając "zbadaj element".
polkm2000
Udało mi się rozwiązać problem wyglądu (problem był w tym że class='btn' było w złym miejscu z usuwaniem jeszcze podziałam.
Dzięki za pomoc!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.