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

PHP dodawanie danych z formularza do bazy danych

Object Storage Arubacloud
+1 głos
2,851 wizyt
pytanie zadane 2 kwietnia 2021 w PHP przez maciek3621 Nowicjusz (180 p.)
edycja 2 kwietnia 2021 przez maciek3621
Problem polega na tym że nie wiem czemu to co jest wpisane nie dodaje się do bazy danych jeżeli jest taka możliwość proszę o wyjaśnienie 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Wyszukiwarka</title>
    <link rel="stylesheet" href="2.css">
</head>
<body>
<center>

    <form action="" method="post"  >
                Nazwa:<input type="text" name="nazwa"/><br></br>
                Cena: <input type="text" name="cena"/><br></br>
                Typ:  <select><br></br>
                        <option name="typ" value="1">Zupy</option>
                        <option name="typ" value="2">Dania mięsne</option>
                        <option name="typ" value="3">Przystawki</option>
                        <option name="typ" value="4">Napoje</option>
                </select><br></br>
                
                        <input type="submit"  value="Dodaj"/><br></br>
    </form>

                <form action="index.php">
                <input type="submit" value="Wróć" />
    </form>
    
    
<?


$conn = new mysqli('localhost','root','','dane')

    $nazwa = isset($_POST['nazwa']);
    $cena  = isset($_POST['cena']);
    $typ   = isset($_POST['typ']);
    
    
    
    $sql ="INSERT INTO dania (nazwa,cena,typ) Values ('$nazwa','$cena','$typ')";
        

    
?>    
</center>
</body>
</html>        
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

 

3 odpowiedzi

+1 głos
odpowiedź 5 kwietnia 2021 przez VBService Ekspert (252,660 p.)
wybrane 6 kwietnia 2021 przez maciek3621
 
Najlepsza

Już nie powinieneś używać <center>

 

 

Jednym ze sposobów sprawdzenia czy formularz jest uruchomiony pierwszy raz, czy kolejny raz (dane przesłane pochodzą z formularza) to: isset($_POST['submit'])

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

lub empty($_POST)

if (!empty($_POST)) { ... }

można też if ($_POST)

if ($_POST) { ... }

Ja osobiście preferuję

if ($_SERVER["REQUEST_METHOD"] == "POST") { ... }

 

Propozycja  smiley

add_new_dish.php

<?php
  if ($_SERVER["REQUEST_METHOD"] == "POST" && !empty($_POST)) { // 1
    // var_dump($_POST);
    $nazwa = (empty($_POST['nazwa'])) ? '' : trim($_POST['nazwa']);
    $cena  = (empty($_POST['cena']))  ? '' : (int)$_POST['cena'];
    $typ   = (empty($_POST['typ']))   ? '' : $_POST['typ'];

    try { // 2
      $conn = new mysqli('localhost','root','','dane')
              or die('Błąd połączenia z bazą danych!');

      $sql = 'INSERT INTO dania (nazwa, cena, typ) VALUES (?, ?, ?)';
      if ($stmt = $conn->prepare($sql)) {
        $stmt->bind_param('sii', $nazwa, $cena, $typ);
        $stmt->execute();
        $return_message = 'Danie zostało zapisane.';
      } else {
        // echo $conn->errno . ' ' . $conn->error;
        $return_message = 'Wystąpił problem z zapisaniem dania.';
      }

      $stmt->close();
      $conn->close();
    } catch (Exception $e) { // 2
      $return_message = $e->getMessage();
    }
  } else { // 1
    // Dane nie zostały z formularza przysłane
    // np.: pierwsze uruchomienie skryptu
    $return_message = '';
  }
?>
<!DOCTYPE html>
<html lang="pl">
  <head>
    <meta charset="utf-8">
    <title>Wyszukiwarka</title>
    <link rel="stylesheet" href="2.css">
    
    <style>
      * {
        box-sizing: border-box;
      }
      .form-adding-db-container {
        display: flex;
        justify-content: center;
      }
      .form-adding-db-container .wrap {
        width: 245px;
        font: 1em/1.2em monospace;
      }
      .form-adding-db-container .wrap label, input, select {
        display: block;
        margin: 0.5em;  
      }
      .form-adding-db-container .wrap input[type="text"], select {
        width: 230px;
        padding: 0.2em;
      }
      .form-adding-db-container .wrap .buttons {
        display: flex;
        justify-content: space-between;
        margin: 1em 0.5em;
      }
      .form-adding-db-container .buttons button, a.button {
        font: 1.1em/1.3em monospace;
        width: 60px;
        margin: 0.5em 0;
        cursor: pointer;
        border: 1px solid gray;
        text-align: center;
        text-decoration: none;
        color: black;
        background-color: rgb(239, 239, 239);
      }
      .form-adding-db-container .return-message {
        color: green;
      }
    </style>
  </head>
  <body>
    <div class="form-adding-db-container">
      <div class="wrap">

        <form action="" method="post">
          <label for="nazwa">Nazwa:</label>
          <input type="text" id="nazwa" name="nazwa" required>

          <label for="cena">Cena:</label>
          <input type="text" id="cena" name="cena" value="0" required>

          <label for="typ">Typ:</label>
          <select id="typ" name="typ">
            <option value="1">Zupy</option>
            <option value="2">Dania mięsne</option>
            <option value="3">Przystawki</option>
            <option value="4">Napoje</option>
          </select>

          <div class="buttons">
            <button type="submit">Dodaj</button>
            <a href="index.php" class="button">Wróć</a>
          </div>
        </form>

        <div class="return-message">
          <?php echo $return_message; ?>
        </div>

      </div>
    </div>

  </body>
</html>

 

mysqli_stmt::bind_param ]
How to remove all leading zeros in a string in PHP ? ]

komentarz 5 kwietnia 2021 przez maciek3621 Nowicjusz (180 p.)
edycja 5 kwietnia 2021 przez maciek3621
Ja z takim zapytaniem jaki jest powód tego że gdy dam 
isseta tam $nazwa = $_POST['name'] to działa ale uzupełnia
 tylko np typ 1 i to jest w 
każdej tabeli i zamiast jednej kolumny tworzą się np 4 jaki
 jest tego powód i rozwiązanie. Dodam jest to zadanie na zajęcia a
ja nie lubię iść na łatwiznę z php dopiero zaczynamy i chcę się go nauczyć więc dzikuję za podesłanie propozycji ale wolę otrzymac pomoc 
przy tym zadaniu

<?php
$conn = new mysqli('localhost','root','','dane');
		
	?>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Dodawanie</title>
	<link rel="stylesheet" href="2.css">
</head>
<body>
<center>

	<form action="" method="post"  >
				Nazwa:<input type="text" name="name"/><br></br>
				Cena: <input type="text" name="price"/><br></br>
				Typ:  <select name="type"><br></br>
						<option value="1">Zupy</option>
						<option value="2">Dania mięsne</option>
						<option value="3">Przystawki</option>
						<option value="4">Napoje</option>
				</select><br></br>
				
						<button type="submit" name="dodaj">Dodaj</button><br></br>
	</form>

	<form action="index.php">
				<input type="submit" value="Wróć" />
	</form>
	<?php
	
	?>
	
</center>
</body>
</html>		
<?php
		$nazwa = $_POST['name']  ;
		$cena = $_POST['price'] ;
		$typ  = $_POST['type']  ;
			 echo  $nazwa;
			 echo  $cena;
			 echo  $typ;
	
	
	$sql = "INSERT INTO dania(typ, nazwa, cena) VALUES ($typ,$nazwa,$cena)";
	$conn=$conn->query($sql); 
	echo $sql;
?>
		
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

 

komentarz 5 kwietnia 2021 przez VBService Ekspert (252,660 p.)

Sprawdź do czego służy isset(...) i ewentualne przypisanie wartości (danych do zmiennej) za jego pomocą może tylko nastąpić za pomocą ternary operator

$action = (isset($_POST['action'])) ? $_POST['action'] : 'brak';

jest odpowiednikiem zapisu

if (isset($_POST['action'])) {
  $action = $_POST['action'];
} else {
  $action = 'brak';
}

 

komentarz 6 kwietnia 2021 przez maciek3621 Nowicjusz (180 p.)
Chodziło mi bardziej o powód dlaczego np z jednego zapytanie robi mi się 5 razy spaghheti np
komentarz 6 kwietnia 2021 przez VBService Ekspert (252,660 p.)

A spróbuj "jawnie" zamknąć połączenie z bazą danych ($conn->close())

<?php
  var_dump($_POST);

  $nazwa = $_POST['name'];
  $cena  = $_POST['price'];
  $typ   = $_POST['type'];

  /*   
    echo  $nazwa;
    echo  $cena;
    echo  $typ;
  */ 

  var_dump($nazwa, $cena, $typ);

  $conn = new mysqli('localhost', 'root', '', 'dane');  
  $sql = "INSERT INTO dania(typ, nazwa, cena) VALUES ($typ, $nazwa, $cena)";
  $conn->query($sql); 
  echo $sql;

  $conn->close();
?>

"podglądanie zawartości" zmiennych var_dump(...) 

komentarz 6 kwietnia 2021 przez maciek3621 Nowicjusz (180 p.)
przestało dodwać
komentarz 6 kwietnia 2021 przez VBService Ekspert (252,660 p.)

Spróbuj

<?php
  var_dump($_POST);
 
  $nazwa = $_POST['name'];
  $cena  = $_POST['price'];
  $typ   = $_POST['type'];
 
  /*   
    echo  $nazwa;
    echo  $cena;
    echo  $typ;
  */
 
  var_dump($nazwa, $cena, $typ);
 
  $conn = new mysqli('localhost', 'root', '', 'dane');  
  $sql = "INSERT INTO dania(typ, nazwa, cena) VALUES ($typ, $nazwa, $cena)";
  if ($conn->query($sql) === TRUE) {
    echo "Nowy rekord został dodany";
  } else {
    echo "Błąd: " . $sql . "<br>" . $conn->error;
  }
 
  $conn->close();
?>

 

komentarz 6 kwietnia 2021 przez maciek3621 Nowicjusz (180 p.)

Ja mam pytanie co mogę zmienić w swoim kodzie żeby działało bo teraz mam tak że jak dodaje do dodaje 1 taką jaką powinno z danymi z formularza ale dodaje też 2 pustą. A gdy w form daje action="index.php" żeby po wypełnieniu pokazywało tą stronę to nagle wariuje i dodaje bez sensu jak wcześniej czyli np daje 5 razy sapghheti. Gdy próbuje twoim sposobem to nie działa i wyskakuje dużo błędów

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Dodawanie</title>
	<link rel="stylesheet" href="2.css">
</head>
<body>
<center>

	<form method="post" action="">
				<input type="text" name="name" placeholder="Nazwa Dania..."/><br></br>
				<input type="text" name="price" placeholder="Cena Dania..."/><br></br>
				Typ:<select name="type" ><br></br>
						<option value="1">Zupy</option>
						<option value="2">Dania mięsne</option>
						<option value="3">Przystawki</option>
						<option value="4">Napoje</option>
				</select><br></br>
				
						<button type="submit" name="dodaj">Dodaj</button><br></br>
	</form>

	<form action="index.php">
				<input type="submit" value="Wróć" />
	</form>
	
	
	
	
</center>
</body>
</html>		
<?php
        $nazwa = $_POST['name'];
		$cena  = $_POST['price'];
		$typ   = $_POST['type'];
		
		$conn = new mysqli('localhost','root','','dane');
		$sql = "INSERT INTO dania(typ, nazwa, cena) VALUES ('$typ','$nazwa','$cena')";
		
			$conn=$conn->query($sql); 
			echo $sql;
?>
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

 

komentarz 6 kwietnia 2021 przez VBService Ekspert (252,660 p.)

Rozumiem, że ten kod u "góry"  w Twoim komentarzu to jest ten na który obecnie uruchamiasz, jeżeli tak, to czemu nie dopiszesz, któreś z propozycji na temat

1
komentarz 6 kwietnia 2021 przez maciek3621 Nowicjusz (180 p.)
Działa dziękuję za pomoc i cierpliwość
+1 głos
odpowiedź 2 kwietnia 2021 przez radek024 Szeryf (77,160 p.)

Przeanalizuj zapytanie wysyłane do bazy:

INSERT INTO dania(nazwa,cena)Values("'.$nazwa.'","'.$cena.'","'.$typ.'")

czy na pewno tak powinno wyglądać?

komentarz 2 kwietnia 2021 przez VBService Ekspert (252,660 p.)
edycja 2 kwietnia 2021 przez VBService

Dla ułatwienia "analizy"  smiley

INSERT INTO dania (    nazwa,       cena)
           VALUES ("'.$nazwa.'","'.$cena.'","'.$typ.'")

 

komentarz 2 kwietnia 2021 przez maciek3621 Nowicjusz (180 p.)
tylko ja nie do końca rozumiem jeszcze php i nie wiem co tam jest nie tak
komentarz 2 kwietnia 2021 przez VBService Ekspert (252,660 p.)

Ale Ty masz błąd w zapytaniu sql.

INSERT INTO dania (    nazwa,       cena,       ?)
           VALUES ("'.$nazwa.'","'.$cena.'","'.$typ.'")

 

komentarz 2 kwietnia 2021 przez maciek3621 Nowicjusz (180 p.)
czy możesz powiedzieć mi gdzie mam błąd lub jak ma wyglądać poprawne zapytanie SQL
komentarz 2 kwietnia 2021 przez VBService Ekspert (252,660 p.)

Nie wiem jak kolumna się nazywa, ale zgaduję po nazwie zmiennej php $typ, że nazwa pominiętej kolumny w sql-u to, typ   wink

INSERT INTO dania (    nazwa,       cena,       typ)
           VALUES ("'.$nazwa.'","'.$cena.'","'.$typ.'")

 

INSERT INTO dania (nazwa, cena, typ) VALUES ("'.$nazwa.'","'.$cena.'","'.$typ.'")

 

SQL INSERT INTO Statement ]

komentarz 2 kwietnia 2021 przez maciek3621 Nowicjusz (180 p.)
dodałem ale niestety nic to nie dało i nie wiem gdzie jest problem
komentarz 2 kwietnia 2021 przez VBService Ekspert (252,660 p.)
komentarz 2 kwietnia 2021 przez maciek3621 Nowicjusz (180 p.)
a mógłbym się dowiedzieć czy formularz mam dobrze skonstruowany chodzi mi o select
komentarz 2 kwietnia 2021 przez radek024 Szeryf (77,160 p.)
O budowie samych formularzy możesz poczytać tutaj: https://www.tutorialrepublic.com/html-tutorial/html-forms.php. Generalnie sporo jest tego rodzaju treści w sieci. Na początku jednak - jeżeli nie wiesz o co chodzi w bazach - warto, abyś usiadł do SQLa. Nic Ci po dobrze napisanym PHP, skoro nie wiesz jak operować na danych.
+1 głos
odpowiedź 2 kwietnia 2021 przez SzkolnyAdmin Szeryf (86,360 p.)

1. Dla pola select ustaw name="typ" (nie dla option).

2. Wyślij zapytanie do bazy:

$conn->query($sql);

Powinieneś sprawdzić, czy dane z formularza zostały wysłane przed ich odebraniem w liniach 36-38.

komentarz 2 kwietnia 2021 przez maciek3621 Nowicjusz (180 p.)
a jak to się sprawdza nie wiem ponieważ jestem nowy w php i się uczę jeszcze

Podobne pytania

0 głosów
2 odpowiedzi 13,353 wizyt
0 głosów
1 odpowiedź 350 wizyt
pytanie zadane 25 czerwca 2020 w PHP przez Tomcio2287 Nowicjusz (220 p.)
+1 głos
1 odpowiedź 231 wizyt
pytanie zadane 31 stycznia 2022 w PHP przez trixter310 Obywatel (1,440 p.)

92,539 zapytań

141,382 odpowiedzi

319,481 komentarzy

61,928 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...