Nie mogę dodawać rekordu do bazy danych

Nie mogę dodawać rekordu do bazy danych

Wątek przeniesiony 2020-06-20 10:53 z Bazy danych przez cerrato.

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 84
2

Masz niezdefiniowane zmienne.

Linia 83:

Kopiuj
if ($imie and $nazwisko and $marka and $model and $pojemnosc and $moc and $rok) {

Prawidłowy kod:

Kopiuj
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel="stylesheet" href="style.css">
    <title>Dodaj klienta</title>
</head>

<body>

    <div><br>
    <a href="" class="btn btn-primary">Strona główna</a><br><br>
    <a href="klienci.php" class="btn btn-danger">Klienci</a>
    <a href="naprawy.php" class="btn btn-danger">Naprawy</a>
    <h2>Dodaj nowego klienta</h2>
    <p>Wypełnij dane aby dodać nowego kienta.</p>
    <form name="form1" method="post" action="klienci.php">
        <label>Imię:</label> <br>
        <input name="imie" type="text"><br>
        <label> Nazwisko: </label> <br>
        <input type="text" name="nazwisko" size="20"><br>
        <label>Marka: </label><br>
        <input type="text" name="marka" size="20"><br>
        <label>Model:</label> <br>
        <input type="text" name="model" size="20"><br>
        <label>Pojemność:</label><br> 
        <input type="text" name="pojemnosc" size="20"><br>
        <label>Moc:</label><br> <input type="text" name="moc" size="20"><br>
        <label>Rok: </label><br><input type="text" name="rok" size="20"><br><br>
        <input type="submit" class="btn btn-danger" value="Dodaj">
        <input type="reset" class="btn btn-primary" value="Wyczyść">
    </form>
    </div>
    </br>
    <a href="klienci.php"></a>
</body>

</html>
<?php

$link = mysqli_connect(
    'localhost',
    'root',
    '',
    'zamówienia'
);

if (!$link) {
    printf("Brak połączenia z serwerem MySQL. Kod błędu: %s\n", mysqli_connect_error());
    exit;
}

if (isset($_POST['imie']) && isset($_POST['nazwisko']) && isset($_POST['marka']) && isset($_POST['model']) && isset($_POST['pojemnosc']) && isset($_POST['moc']) && isset($_POST['rok'])) {

    // miejsce na walidację danych
    $imie = $_POST['imie'];
    $nazwisko = $_POST['nazwisko'];
    $marka = $_POST['marka'];
    $model = $_POST['model'];
    $pojemnosc = $_POST['pojemnosc'];
    $moc = $_POST['moc'];
    $rok = $_POST['rok'];

    $zapytanie = "INSERT INTO klienci (imie, nazwisko, marka, model, pojemnosc, moc, rok) VALUES ('$imie', '$nazwisko', '$marka', '$model', '$pojemnosc', '$moc', '$rok')";
    $result = mysqli_query($link, $zapytanie) || trigger_error("Błąd bazy danych: " . mysqli_error($link), E_USER_ERROR); // wyświetli błąd jeśli coś pójdzie nie tak z zapytaniem

    if ($result) {
        echo 'Prawidłowo dodano do bazy danych';
    }    
}

Pamiętaj że w zapytaniu SQL, zmienne typu string(varchar) należy pisać z apostrofami np. '$imie'. Dobrze by było również dodać kolumnę ID (typu int) do tabeli która będzie kluczem głównym.

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Skopiowałem ten kodzik i nie wyświetla żadnego błędu na stronie. Tylko po poprawnym wypełnieniu danych i kliknięciu przycisku Dodaj nie dodaje rekordu.

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 84
0
arokos123 napisał(a):

Skopiowałem ten kodzik i nie wyświetla żadnego błędu na stronie. Tylko po poprawnym wypełnieniu danych i kliknięciu przycisku Dodaj nie dodaje rekordu.

Wygląda na to że nie jest spełniony warunek. Spróbuj wyświetlić zawartość $_POST.

Kopiuj
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel="stylesheet" href="style.css">
    <title>Dodaj klienta</title>
</head>

<body>

    <div><br>
    <a href="" class="btn btn-primary">Strona główna</a><br><br>
    <a href="klienci.php" class="btn btn-danger">Klienci</a>
    <a href="naprawy.php" class="btn btn-danger">Naprawy</a>
    <h2>Dodaj nowego klienta</h2>
    <p>Wypełnij dane aby dodać nowego kienta.</p>
    <form name="form1" method="post" action="klienci.php">
        <label>Imię:</label> <br>
        <input name="imie" type="text"><br>
        <label> Nazwisko: </label> <br>
        <input type="text" name="nazwisko" size="20"><br>
        <label>Marka: </label><br>
        <input type="text" name="marka" size="20"><br>
        <label>Model:</label> <br>
        <input type="text" name="model" size="20"><br>
        <label>Pojemność:</label><br> 
        <input type="text" name="pojemnosc" size="20"><br>
        <label>Moc:</label><br> <input type="text" name="moc" size="20"><br>
        <label>Rok: </label><br><input type="text" name="rok" size="20"><br><br>
        <input type="submit" class="btn btn-danger" value="Dodaj">
        <input type="reset" class="btn btn-primary" value="Wyczyść">
    </form>
    </div>
    </br>
    <a href="klienci.php"></a>
</body>

</html>
<?php

$link = mysqli_connect(
    'localhost',
    'root',
    '',
    'zamówienia'
);

if (!$link) {
    printf("Brak połączenia z serwerem MySQL. Kod błędu: %s\n", mysqli_connect_error());
    exit;
}

if (isset($_POST['imie']) && isset($_POST['nazwisko']) && isset($_POST['marka']) && isset($_POST['model']) && isset($_POST['pojemnosc']) && isset($_POST['moc']) && isset($_POST['rok'])) {

    // miejsce na walidację danych
    $imie = $_POST['imie'];
    $nazwisko = $_POST['nazwisko'];
    $marka = $_POST['marka'];
    $model = $_POST['model'];
    $pojemnosc = $_POST['pojemnosc'];
    $moc = $_POST['moc'];
    $rok = $_POST['rok'];

    $zapytanie = "INSERT INTO klienci (imie, nazwisko, marka, model, pojemnosc, moc, rok) VALUES ('$imie', '$nazwisko', '$marka', '$model', '$pojemnosc', '$moc', '$rok')";
    $result = mysqli_query($link, $zapytanie) || trigger_error("Błąd bazy danych: " . mysqli_error($link), E_USER_ERROR); // wyświetli błąd jeśli coś pójdzie nie tak z zapytaniem

    if ($result) {
        echo 'Prawidłowo dodano do bazy danych';
    }    
}
else {
   var_dump($_POST);
}

Zanim wypełnisz formularz, otwórz sobie zakładkę sieć w konsoli przeglądarki i sprawdź czy jakiekolwiek dane są dołączane przy wysłaniu (submicie) formularza.

Jeśli używasz innej przeglądarki to musisz sobie wygooglować jak uruchomić w niej konsolę.

Po wysłaniu formularza, odśwież zakładkę w phpmyadmin aby upewnić się czy nie pojawił się nowy rekord. Jeśli nadal nie będzie rekordu oznacza to że coś jest nie tak z połączeniem z bazą gdyż kod na 100% jest poprawny.

Na początek proponowałbym zmianę nazwy bazy danych jak i ewentualnych tabeli tak aby nie było w nich polskich znaków takich jak ą,ę,ć, gdyż może to powodować problemy. Następnie zajrzyj tutaj aby dowiedzieć jak prawidłowo przetestować połączenie z bazą:
https://www.php.net/manual/en/function.mysqli-connect.php

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Działa mi już poprawnie. Usunąłem po prostu przekierowanie do tabeli klienci.php i teraz po kliknięciu przycisku Dodaj zostaje w pliku dodaj_klienta.php i wyświetla się komunikat
'Prawidłowo dodano do bazy danych'

Teraz dodałem jeszcze jedno pole numer klienta w celu aby można było wpisywać numer takiego klienta jeśli przykładowo mam 30 klientów a z bazy danych usunę klienta numer 17. A potem dodając nowego klienta przypisać mu numer 17. Niestety nie działa mi to poprawnie i nie wiem czy da się takie coś zrobić.

Kopiuj
$zapytanie = "INSERT INTO klienci (numer, imie, nazwisko, marka, model, pojemnosc, moc, rok) VALUES (' ','$imie', '$nazwisko', '$marka', '$model', '$pojemnosc', '$moc', '$rok')";
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 84
3

Numer klienta powinien być odpowiednikiem ID czyli spełniać warunek unikalności. Zamiast nadpisywać numer 17 lepiej utworzyć numer 31. Najprościej możesz to osiągnąć ustawiając opcję A_I (autoincrement) w phpmyadmin przy kolumnie numer. Wtedy przy każdym insercie, nowy rekord będzie otrzymywał kolejny numer i nie będzie trzeba obsługiwać tego z poziomu PHP - w takim przypadku trzeba usunąć kolumnę numer z zapytania SQL.

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Wiem mam autoincrement tylko jeśli usunę przykładowo rekord 17 z bazy to już mi go nie przypisze tylko poleci dalej.

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
1

I tak to ma działać. Po co Ci te same ID raz wykorzystane?
Załóżmy, że to ID klienta wykorzystywane jest gdzieś indziej np. w jakichś zamówieniach. Jak nie będziesz o tym pamiętał to może zdarzyć się, że jak masz to id 17 w zamówieniach to się okaże, że masz nagle zamówienia nie dla tego klienta.
Lepszym podejściem zamiast kasowania rekordu jest dostawienie kolumny np. active z wartością 1 lub 0 i jeśli klient jest kasowany to tak naprawdę zmienia się tylko wartość w tej kolumnie.

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

A jakbym chciał usuwać dane to rozwiązanie z DELTE jest słabe?

Przykładowo:

Kopiuj
$zapytanie = "DELETE FROM klienci WHERE numer='$numer'";

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 84
1
arokos123 napisał(a):

A jakbym chciał usuwać dane to rozwiązanie z DELTE jest słabe?

Przykładowo:

Kopiuj
$zapytanie = "DELETE FROM klienci WHERE numer='$numer'";

Nie. Słaby jest pomysł przypisywania starego numeru po kimś nowemu klientowi.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

A jakbym chciał usuwać dane to rozwiązanie z DELTE jest słabe?

Podstawowe pytanie: dlaczego chciałbyś cokolwiek usuwać?

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Szczerze mówiąc usuwać chciałem po to jak zdarzy mi się jakiś błąd przy dodawaniu i mam błędny rekord dodany.
Wydaje mi się że stworzenie przycisku Usun danego rekordu jest łatwiejsze niż stworzenie jakiejś edycji

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
1

Możesz robić jak uważasz, na razie się uczysz. Było już o SQL injection np.
Po prostu musisz nabyć wyobrażenie co się dzieje jak sobie coś w jakiś sposób oprogramowujesz.
W wypadku takiego ordynarnego delete masz kilka rzeczy. Ten klient i jego id może być kluczem obcym w innej tabeli i baza po prostu nie pozwoli na jego usunięcie.
Możesz użyć cascade i usuwać wszystko wszędzie, ale czy warto? Np. musisz trzymać faktury nawet jeśli klient już nie istnieje lub z nim nie współpracujesz.
W tej chwili np. jak robisz insert klienta to nie sprawdzasz czy oby taki rekord istnieje. Nie walidujesz niczego i tak możesz mieć klienta z wartościami 1,1,1,1,1 w każdym polu.

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Zaczne od zwykłego Delte który usunie dany rekord. Ten cascade to trochę ciężki dla mnie.
Mam taki kodzik

Kopiuj
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<link rel="stylesheet" href="style.css">
	<style>
	 body{ font: 14px sans-serif; }
     .wrapper{ width: 350px; padding: 20px; }
	</style>
    <title>Usuń klienta</title>
</head>

<body>
	<div class="wrapper">	
	<a href="witaj.php" class="btn btn-primary">Strona główna</a><br><br>
	<a href="klienci.php" class="btn btn-danger">Klienci</a>
	<a href="naprawy.php" class="btn btn-danger">Naprawy</a>
	<h2>Usuń klienta</h2>
	<p>Podaj id klienta aby go usunąć</p>
    <form name="form1" method="post" action="usun_klienta.php">
        <label>Numer klienta</label> <br>
		<input name="numer" type="text" class="form-control"required>  <br><br>
        <input type="submit" class="btn btn-danger" value="Usuń">
		<input type="reset" class="btn btn-primary" value="Wyczyść">
    </form>
	</div>
    </br>
    
</body>

</html>
<?php

session_start();
 

if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){
    header("location: logowanie.php");
    exit;
	
	$link = mysqli_connect(
    'localhost',
    'root',
    '',
    'zamówienia'
);

if (!$link) {
    printf("Brak połączenia z serwerem MySQL. Kod błędu: %s\n", mysqli_connect_error());
    exit;
}

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

    
    $numer = $_POST['numer'];
    

    $zapytanie = "DELETE FROM klienci WHERE numer='$numer'";
    $result = mysqli_query($link, $zapytanie) || trigger_error("Błąd bazy danych: " . mysqli_error($link), E_USER_ERROR); 

    if ($result) {
        echo 'Prawidłowo usunięto z bazy danych';
    }    
}
}
?>
'''

I mi nie usuwa rekordu po wpisaniu dowolnego numeru.
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 84
0

Numer jest typem varchar czy typem liczbowym? Jeżeli jest typem liczbowy to taki zapis:

Kopiuj
"DELETE FROM klienci WHERE numer='$numer'"

Jest błędny. Należy przekształcić $numer pod postać int'a.

Kopiuj
if (isset($_POST['numer'])) {

    $numer = intval($_POST['numer']);

    if (!$numer) {
       echo "Błędny numer";
       exit;
   }

    $zapytanie = "DELETE FROM klienci WHERE numer=$numer";
    $result = mysqli_query($link, $zapytanie) || trigger_error("Błąd bazy danych: " . mysqli_error($link), E_USER_ERROR); 

    if ($result) {
        echo 'Prawidłowo usunięto z bazy danych';
    }    
}

Poza tym masz błąd w logice.

Kopiuj
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){
    header("location: logowanie.php");
    exit;

    $link = mysqli_connect(
    'localhost',
    'root',
    '',
    'zamówienia'
);

if (!$link) {
    printf("Brak połączenia z serwerem MySQL. Kod błędu: %s\n", mysqli_connect_error());
    exit;
}

    // kod na zapytanie
}
}
?>

Według tego jeśli użytkownik nie jest zalogowany to dostanie przekierowanie, następnie skrypt zostanie przerwany a dopiero potem masz kod z zapytaniem...

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Zrobiłem to usuwanie i działa poprawnie. A jakbym chciał dodać alert w phpie zrobiłem coś takiego ale nie działa:

Kopiuj
if ($result) {
	alert ("Usunięto");
    }    

I druga sprawa znacie może jakieś naprawdę dobre tutoriale aby się nauczyć sqla i phpa. Bo ciężko mi idzie z tym

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 84
1
arokos123 napisał(a):

Zrobiłem to usuwanie i działa poprawnie. A jakbym chciał dodać alert w phpie zrobiłem coś takiego ale nie działa:

Kopiuj
if ($result) {
	alert ("Usunięto");
    }    

I druga sprawa znacie może jakieś naprawdę dobre tutoriale aby się nauczyć sqla i phpa. Bo ciężko mi idzie z tym

Polecam książki oraz dużo praktyki.
https://hackr.io/blog/best-php-books-for-beginners-and-advanced-programmers

Co do alerta, to musisz użyć JavaScript'u.

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Coś mi się połączenie z bazą danych wysypało

Komunikat błędu na stronie:

Kopiuj
Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES) in D:\xampp\htdocs\stronka\config.php on line 8
Brak połączeniaAccess denied for user 'root'@'localhost' (using password: YES)

Plik config.php

Kopiuj
<?php

define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'logowanie');

$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
 
if($link === false){
    die("Brak połączenia" . mysqli_connect_error());
}
?>
jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
1

A Twoja baza ma nazwę "logowanie"? Sprawdź wszystkie wartości.

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Tak ma nazwę wszystko wcześniej działało tylko teraz się coś wysypało

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
1

Ale cała baza ma nazwę "logowanie"? Ja bym raczej tak bazy nie nazwał. To mi się kojarzy z nazwą tabeli.
Sprawdź wszystko jeszcze raz.

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

No właśnie tak ją nazwałem logowanie a w niej tabelę użytkownicy. Wczoraj jeszcze mi działało a dziś coś sobie popsułem i nie wiem jak naprawić

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
0

I przy phpmyadmin masz połączenie na tych danych?

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Przy phpmyadmin to normalnie wchodzę bez żadnego hasła ani loginu, więc nie wiem. W sumie nie wiem jak to sprawdzić ale to co może być złe to hasło którego nie zmieniałem ale może być już ustawione albo coś popsułem i się ustawiło

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
0

To zobacz sobie czy masz bazę o tej nazwie z poziomu phpmyadmin. Sprawdź czy masz użytkownika root.
Możesz testowo założyć nowego użytkownika i nadać mu nowe hasło i uprawnienia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.