Lista rozwijana + zapamiętywanie wyboru.

1

Dzień dobry.
Stworzyłem stronę – formularz który dodaje dane do bazy mysql – dodaj.php.
Formularz dodaje dane z kilku list rozwijanych + dane wpisane z klawiatury.
Listy rozwijane pobierają się z innych tabel mysql.
Zapisane dane wyświetlane są prawidłowo w innej stronie - lista.php.
Stworzyłem również możliwość edycji tych danych, wyświetlana jest lista z dodatkową kolumną zmień – obsługa.php.
Po wyborze zmień uruchamia się zmien.php gdzie wyświetlana jest dana pozycja według ID.
Uruchamiają się listy rozwijane i pola z możliwością wpisania nowych wartości.
Wszytko działa prawidłowo:

  • listy rozwijane ustawiają się na wartościach które użytkownik wybrał wcześniej
  • pola tekstowe wypełniają się wcześniej podanymi danymi
  • jeżeli użytkownik zmienia dane zostają one zaktualizowane w bazie.

Problem pojawia się w momencie zapisywania danych z listy rozwijanej, w aktualnym kodzie zapisuje prawidłowo tylko te pozycje z listy które mają jeden wyraz. Jeżeli na liście rozwijanej jest „wybor” zapisuje w bazie „wybor”. Jeżeli na liście jest „wybor test” zapisuje w bazie „wybor”.
Moje pytanie dlaczego tak się dzieje i jak zmienić kod żeby zapisał w bazie „wybor test”.
Prawdopodobnie ta linia sprawia że tak się dzieje. Zapisuje pierwszy wyraz i robi nową linie.

$select =$select = (isset($data['rodzaj']) && $data['rodzaj'] == $rodzaj)?"selected='rodzaj'":"";
<?php
// Połączenie do bazy 
include "connection_class.php";
    if ($dbConnection->connect_error) {
        die("Connection failed: " . $dbConnection->connect_error);
    } 
    //Wybór tabeli zawierającej dane do listy rozwijanej
    $sql = "SELECT * FROM tabela";
    $result = $dbConnection->query($sql);

    if ($result->num_rows > 0) {
        //lista
        echo "<select name='rodzaj'>"
        while($rodzaj = $result->fetch_assoc()) {
               extract ($rodzaj);
               $select = (isset($data['rodzaj']) && $data['rodzaj'] == $rodzaj)?"selected='rodzaj'":"";
               echo "<option value=$rodzaj $select > $rodzaj</option>\n";
            }
            echo "</select>";
      }
      $dbConnection->close();
        ?>
3

Value powinien być w podwójnych cudzysłowach

echo '<option value="'.$rodzaj.'  '.$select.'">';

Bo tak to pewnie przeglądarka myśli, że value to tylko pierwsza część nie wiedząc czy np. następny string to nie następny atrybut

Wygenerowany HTML powinien wyglądać tak:

<option value="rodzaj test">
0

A to nie wystarczy zwykłe selected przy option?

$select = (isset($data['rodzaj']) && $data['rodzaj'] == $rodzaj) ? 'selected';
echo '<option value="'.$rodzaj.'" '.$select.'>$rodzaj</option>\n';
0

Wcześniej działało tak, ale lista rozwijana ustawia się zawsze w pierwszej pozycji niezależnie co było wybrane:

<?php
include "connection_class.php";
    if ($dbConnection->connect_error) {
        die("Connection failed: " . $dbConnection->connect_error);
    } 
    $sql = "SELECT * FROM tabela";
    $result = $dbConnection->query($sql);
    if ($result->num_rows > 0) {
        echo "<select name='rodzaj'>"
        while($rodzaj = $result->fetch_assoc()) {
          echo "<option value='" . $rodzaj['rodzaj'] . "'>" . $rodzaj['rodzaj'] . "</option>";
        }
        echo "</select>";
    } 
    $dbConnection->close();
    ?>
 <?php
include "connection_class.php";
    if ($dbConnection->connect_error) {
        die("Connection failed: " . $dbConnection->connect_error);
    } 
    $sql = "SELECT * FROM tabela";
    $result = $dbConnection->query($sql);
    if ($result->num_rows > 0) {
        echo "<select name='rodzaj'>";
        while($rodzaj = $result->fetch_assoc()) {
               extract ($rodzaj);
               
               // -> zapisuje tyko „wybor” nie „wybor test”
               $select = (isset($data['rodzaj']) && $data['rodzaj'] == $rodzaj)?"selected='rodzaj'":"";
               echo "<option value=$rodzaj $select >$rodzaj</option>\n"; 
               
               //-> Lista pusta 0 pozycji
               echo '<option value="'.$rodzaj.' '.$select.' '>' '.$rodzaj.''; 
               
               // -> Lista pusta 3 pozycje (czyli tyle ile jest w bazie)
               echo '<option value="'.$rodzaj.'  '.$select.'">';

               //-> syntax error, unexpected ';' [227,16]
               $select = (isset($data['rodzaj']) && $data['rodzaj'] == $rodzaj) ? 'selected'; 
               echo '<option value="'.$rodzaj.'" '.$select.'>$rodzaj</option>\n';
            }
            echo "</select>";
      }
      $dbConnection->close();
        ?>

1.pngpusta.png

3

To może inaczej. Co chcesz zrobić? Zapisać do bazy wybór? Czy wyświetlić listę pozycji z bazy?
Bo przynajmniej ja się troszkę gubię.

0

dodanie.PNG
lista.PNG
zmien.PNG
zmiana.PNG

Formularz zawiera 10 pól w których należy coś wpisać i 9 list rozwijanych.
Jeżeli podczas edycji użytkownik potrzebuje zmienić coś tylko w jednej liście, a wszystkie listy ustawione zostały na pierwszą wartość użytkownik miałby niezły problem żeby pozostałe 8 ustawić tak jak zostały ustawione podczas dodawania. Dlatego system sam ustawia listy na odpowiedniej pozycji, a w polach wpisuje to co zostało dodane. Na jednej z list jest ponad 20 pozycji do wyboru. Tak wiem masakra, no ale co zrobić. Problem polega na tym że jeżeli jest jeden wyraz na liście np. tak lub nie to wszystko jest ok i przekazuje do bazy TAK lub NIE. Niestety jeżeli na liście jest „wyraz wyraz dwa” to do bazy zostanie przekazane „wyraz” nie „wyraz wyraz dwa”. Przekazuje tylko jeden pierwszy wyraz i tylko tyle.

1

@mmajkel:
Pytanie pierwsze, czemu jak w bazie trzymasz ID do tych pól to ich nie używasz przy wyświetlaniu a pola nazwa tylko to wyświetlenia co kryje się pod danym ID?

Pytanie drugie, co to jest Lista dodanych I,P / ID, to jakiś raport? Czy co to?

Pytanie trzecie, co zapisujesz do bazy przy tych listach rozwijanych

Uwaga:

 $select = (isset($data['rodzaj']) && $data['rodzaj'] == $rodzaj) ? 'selected';

powinno być:

$select = (isset($data['rodzaj']) && $data['rodzaj'] == $rodzaj) ? 'selected' : ''; 
0

Od końca:

Pytanie trzecie - dodaje wybraną pozycję z listy rozwijanej tak

             <?php
             include "connection_class.php";
             if ($dbConnection->connect_error) {
             die("Connection failed: " . $dbConnection->connect_error);
             } 
             $sql = "SELECT * FROM tabela z zawartością dla listy rozwijanej rodzaj";
             $result = $dbConnection->query($sql);
             if ($result->num_rows > 0) {
             echo "<select name='rodzaj'>";
             while($rodzaj = $result->fetch_assoc()) {
             echo "<option value='" . $rodzaj['rodzaj'] . "'>" . $rodzaj['rodzaj'] . "</option>";
             }
             echo "</select>";
             } 
             $dbConnection->close();
             ?>

Pytanie drugie:
Po prostu użytkownik może zobaczyć wszystkie dodane pozycje.

Wyświetla wszystko na liście + kolumna zmień

<tr>
<td colspan="1"><b>LP</b></td><td colspan="1"><b>Data</b></td> ... <td colspan="1"><b>Rodzaj</b></td> ... <td colspan="1"><b>Zmień</b></td>
</tr>
...
...
...
              <td><?php echo $data['id']; ?></td>
              <td><?php echo $data['data']; ?></td>
              <td><?php echo $data['...']; ?></td>
....
              <td><?php echo $data['rodzaj']; ?></td>
    <td><a href="zmien.php?id=<?php echo $data['id']; ?>">Zmień</a></td>
    <?php
			$i++;
			}
			?>
  </tr>	
<?php

Formularz zmień niestety nadal dodaje tylko jeden wyraz

<?php

                     include "connection_class.php";
                     $id = $_GET['id'];
                     $qry = mysqli_query($dbConnection,"select inne, rodzaj, data, ..., from tabela zawierająca wszystko where id='$id'");
                     $data = mysqli_fetch_array($qry);
                     if(isset($_POST['update']))
                     {
                     $data = $_POST['data'];
                     $rodzaj = $_POST['rodzaj'];
                     ...
                     $inne = $_POST['inne'];
	             ...
                     $edit = mysqli_query($dbConnection,"update tabela zawierająca wszystko set inne='$inne', rodzaj='$rodzaj', data='$data', ... where id='$id'");
                     if($edit)
                     {
                     mysqli_close($dbConnection);
                     header("location:lista.php");
                     exit;
                     }
                     else
                     {
                        echo mysqli_connect_error();
                     }    	
                     }
                     ?>
...
...
...

<?php
include "connection_class.php";
    if ($dbConnection->connect_error) {
        die("Connection failed: " . $dbConnection->connect_error);
    } 
    $sql = "SELECT * FROM tabela z zawartością dla listy rozwijanej rodzaj";
    $result = $dbConnection->query($sql);

    if ($result->num_rows > 0) {

        echo "<select name='rodzaj'>";
        while($rodzaj = $result->fetch_assoc()) {
               extract ($rodzaj);
               $select = (isset($data['rodzaj']) && $data['rodzaj'] == $rodzaj) ? 'selected' : '';
               echo "<option value=$rodzaj $select >$rodzaj</option>\n";
            }
            echo "</select>";
      }
      $dbConnection->close();
        ?>
      </div>
      </div>
2

W kodzie jaki podałeś nie widzę Insert tym samym nie pokazałeś jak zapisujesz.
Zobacz dla opcji powinieneś mieć jakąs tabelę odrębną z. Id| type potem tam gdzie zapisujesz opcje do bazy z użyciem insert lub update zapisujesz tylko Id wybranej opcji.
Wtedy w HTMLu w value dajesz tylko id tej opcji a jako opis type.

1 użytkowników online, w tym zalogowanych: 0, gości: 1