Problem z przesłaniem w formularzu zmiennej typu tablicowego

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
bamboo_niga
Posty: 7
Rejestracja: wt lip 27, 2010 5:15 pm

Problem z przesłaniem w formularzu zmiennej typu tablicowego

Post autor: bamboo_niga »

Mam taką bazę danych:
Obrazek
Uploaded with ImageShack.us

W linijce

Kod: Zaznacz cały

<input type='text' name='nazwa['.$IDNazwa.']' value='$Nazwa' style='width: 400px'><br><br>";
w pętli do pól tekstowych ładują się poszczególne nazwy z bazy danych. Chodzi o to, aby użytkownik mógł wpisać w polu tekstowym nowe nazwy i by po naciśnięciiu przycisku skrypt zaktualizował bazę danych.

Kod: Zaznacz cały

<?php
	$db_link = @mysql_connect("localhost", "root");
	mysql_query("SET NAMES 'utf8'");
	@mysql_select_db('kancelaria');
	
	$data = "2010-08-06";
	$godzina = "15:00:00";
	
	if (isset($_POST['zmien']))
	{
		/*obmyslilem ze aby zmienic poszczegolne nazwy to zrobie tak jak ponizej, lecz niestety zmienna $IDNazwa nie jest w tej petli widoczna - jak ja tu 'uwidocznic'?
*/
		foreach ($_POST['nazwa'] as $nowaNazwa)
		{
			$zapytanie2 = "UPDATE dane SET Nazwa = '$nowaNazwa' WHERE ((Data = '$data') && (Godzina = '$godzina') && (IDNazwa = '$IDNazwa'))";
			$rezultat2 = mysql_query($zapytanie2, $db_link);
		}
	}
	
	$zapytanie = "SELECT * FROM dane WHERE ((Data = '$data') && (Godzina = '$godzina'))";
	$rezultat = mysql_query($zapytanie, $db_link);
		
	echo "<p>Istnieją dwie pozycje dla <b>$data</b> i godziny <b>$godzina</b>.</p>
	<p>Poniżej możesz zmienić poszczegolne nazwy:</p>";
			
	// formularz umozliwiajacy zmiene poszczegolnych nazw
	echo "<form action='' method='post'>";
	
	while ($row = mysql_fetch_array($rezultat))
	{
		extract($row);
		echo "
		<input type='text' name='nazwa['.$IDNazwa.']' value='$Nazwa' style='width: 400px'><br><br>";
	}
	echo "<input type='submit' value='Dokonaj zmiany' name='zmien'>
	</form>";
?>
lecz niestety skrypt nie widzi w pętli foreach zmiennej '$IDNazwa i wyświetla błędy: "Undefined index: nazwa", "Invalid argument supplied for foreach() in" w linii dotyczącej pętli foreach.

Jak przesłać tą zmienną, by skrypt ten działał poprawnie?
Theprz3m0
Posty: 17
Rejestracja: wt lip 27, 2010 5:53 pm
Lokalizacja: Radom
Kontakt:

Re: Problem z przesłaniem w formularzu zmiennej typu tablicowego

Post autor: Theprz3m0 »

Debugger PHP się nie myli w tym przypadku - w pętli foreach zawarłeś zmienną $_POST['nazwa'], natomiast takiej nie ma w tej tablicy - zauważ, że w formularzu w polu typu input dałeś nazwę zmiennej: name='nazwa['.$IDNazwa.']', więc do tablicy POST trafia nie 'nazwa', lecz 'nazwacośtam'. Tak więc zaproponowałbym tutaj użycie takiej samej pętli jak w przypadku, gdzie uzyłeś form, znaczy:

Kod: Zaznacz cały

  while ($row = mysql_fetch_array($rezultat))
, by pobrać i tutaj zmienną $IDNazwa, lub oczywiście użyć innego sposobu biorąc pod uwagę, że musisz odwoływać się do zmiennych, które sam zadeklarowałeś.
bamboo_niga
Posty: 7
Rejestracja: wt lip 27, 2010 5:15 pm

Re: Problem z przesłaniem w formularzu zmiennej typu tablicowego

Post autor: bamboo_niga »

To jak zatem miałbym to zrobić? Nie bardzo rozumiem przyznam szczerze...
Theprz3m0
Posty: 17
Rejestracja: wt lip 27, 2010 5:53 pm
Lokalizacja: Radom
Kontakt:

Re: Problem z przesłaniem w formularzu zmiennej typu tablicowego

Post autor: Theprz3m0 »

Kod: Zaznacz cały

<?php
   $db_link = @mysql_connect("localhost", "root");
   mysql_query("SET NAMES 'utf8'");
   @mysql_select_db('kancelaria');
   
   $data = "2010-08-06";
   $godzina = "15:00:00";
   
   if (isset($_POST['zmien']))
   {
      /*obmyslilem ze aby zmienic poszczegolne nazwy to zrobie tak jak ponizej, lecz niestety zmienna $IDNazwa nie jest w tej petli widoczna - jak ja tu 'uwidocznic'?

!!!!!Aby ją uwydocznić, musisz wyciągnąć rekord z bazy danych, a ty to robisz dopiero dalej, więc tutaj narazie go nie ma!!!!!!!
   $zapytanie = "SELECT * FROM dane WHERE ((Data = '$data') && (Godzina = '$godzina'))";
   $rezultat = mysql_query($zapytanie, $db_link);
*/
   while ($row = mysql_fetch_array($rezultat)){
	extract($row);
	if(isset($_POST['nazwa['.$IDNazwa.']'])) $nowa_nazwa=$_POST['nazwa['.$IDNazwa.']'];
	if($nowa_nazwa!=$Nazwa){
	$zapytanie2 = "UPDATE dane SET Nazwa = '$nowa_nazwa' WHERE ((Data = '$data') && (Godzina = '$godzina') && (IDNazwa = '$IDNazwa'))";
        $rezultat2 = mysql_query($zapytanie2, $db_link);
	}
	}

   
      
   echo "<p>Istnieją dwie pozycje dla <b>$data</b> i godziny <b>$godzina</b>.</p>
   <p>Poniżej możesz zmienić poszczegolne nazwy:</p>";
         
   // formularz umozliwiajacy zmiene poszczegolnych nazw
   echo "<form action='' method='post'>";
   
   while ($row = mysql_fetch_array($rezultat))
   {
      extract($row);
      echo "
      <input type='text' name='nazwa['.$IDNazwa.']' value='$Nazwa' style='width: 400px'><br><br>";
   }
   echo "<input type='submit' value='Dokonaj zmiany' name='zmien'>
   </form>";
?>
Nie mam pewności, że to zadziała (musiałbym sobie tworzyc bazę danych i to testować - jedynie mam nadzieje, że ruszy jak należy), ale chodzi mi przede wszystkim o formę, o którą mi chodziło. Zobacz jeszcze czy wszystko podomykałem, bo pisałem to od razu tutaj. Napisz czy coś pomogło ;)
bamboo_niga
Posty: 7
Rejestracja: wt lip 27, 2010 5:15 pm

Re: Problem z przesłaniem w formularzu zmiennej typu tablicowego

Post autor: bamboo_niga »

Musiałem powtórzyć

Kod: Zaznacz cały

$zapytanie = "SELECT * FROM dane WHERE ((Data = '$data') && (Godzina = '$godzina'))";
$rezultat = mysql_query($zapytanie, $db_link);
, ponieważ nie widział zmiennej $rezultat i dałem tak:

Kod: Zaznacz cały

if (isset($_POST['zmien']))
	{
		$zapytanie = "SELECT * FROM dane WHERE ((Data = '$data') && (Godzina = '$godzina'))";
		$rezultat = mysql_query($zapytanie, $db_link);
		while ($row = mysql_fetch_array($rezultat))
		{
			extract($row);
			if(isset($_POST['nazwa['.$IDNazwa.']']))
			{
				$nowa_nazwa = $_POST['nazwa['.$IDNazwa.']'];
				$zapytanie2 = "UPDATE dane SET Nazwa = '$nowa_nazwa' WHERE ((Data = '$data') && (Godzina = '$godzina') && (IDNazwa = '$IDNazwa'))";
				$rezultat2 = mysql_query($zapytanie2, $db_link);
			}
		}
	}
Nie aktualizuje jednak bazy, ponieważ nie widzi tym razem zmiennych nazwa[1], nazwa[2], co można zaobserwować po zakomentowaniu if(isset($_POST['nazwa['.$IDNazwa.']']))

Na moje powinno to działać, ale dlaczego nie widzi tych zmiennych z formularza?
Theprz3m0
Posty: 17
Rejestracja: wt lip 27, 2010 5:53 pm
Lokalizacja: Radom
Kontakt:

Re: Problem z przesłaniem w formularzu zmiennej typu tablicowego

Post autor: Theprz3m0 »

OK już chyba widzę, w czym jest problem - zmieniłem form method na GET i wyszło mi tak:

Kod: Zaznacz cały

http://localhost/test/?nazwa[=&zmien=Dokonaj+zmiany:
tak więc przykładowo:

Kod: Zaznacz cały

     print( "<form>
      <input type='text' name='nazwa'.$IDNazwa.']' value='$nazwa' style='width: 400px'><br><br>");
   print( "<input type='submit' value='Dokonaj zmiany' name='zmien'>
   </form>");
trzeba zamienić na:

Kod: Zaznacz cały

?><form>
      <input type='text' name="nazwa[<?print($IDNazwa);?>]" value='<?print($nazwa)?>' style='width: 400px'><br><br>
   <input type='submit' value='Dokonaj zmiany' name='zmien'>
   </form><?
Czyli opuścić na chwilkę php, by móc wstawić [, potem wartość zmiennej $IDNazwa, i zakończyć ] bez łącznika ".", bo coś jak widzę nie działa jakbyś tego chciał.
Efekt:

Kod: Zaznacz cały

http://localhost/test/?nazwa[1]=nazwa+test&zmien=Dokonaj+zmiany
Teraz tylko to musisz zrobić w odwołaniu do swojego projektu.
bamboo_niga
Posty: 7
Rejestracja: wt lip 27, 2010 5:15 pm

Re: Problem z przesłaniem w formularzu zmiennej typu tablicowego

Post autor: bamboo_niga »

Theprz3m0 pisze:Czyli opuścić na chwilkę php, by móc wstawić [, potem wartość zmiennej $IDNazwa, i zakończyć ] bez łącznika ".", bo coś jak widzę nie działa jakbyś tego chciał.
Ale u mnie <input> jest w pętli while, która pobiera IDNazwa z bazy, więc nie mogę tutaj porzucić php...

Po zmianie na:

Kod: Zaznacz cały

while ($row = mysql_fetch_array($rezultat))
	{
		extract($row);
		echo "
		<input type='text' name=\"nazwa[";
		 echo $IDNazwa;
		echo "]\" value='$Nazwa' style='width: 400px'><br><br>";
	}
i wstawieniu metody GET, w pasku adresu mam: http://localhost/proba3.php?nazwa[1]=Na ... naj+zmiany

Co jest z tym phpem?
Theprz3m0
Posty: 17
Rejestracja: wt lip 27, 2010 5:53 pm
Lokalizacja: Radom
Kontakt:

Re: Problem z przesłaniem w formularzu zmiennej typu tablicowego

Post autor: Theprz3m0 »

W takim razie mimo, że się starałem nie umiem ci pomóc.
bamboo_niga
Posty: 7
Rejestracja: wt lip 27, 2010 5:15 pm

Re: Problem z przesłaniem w formularzu zmiennej typu tablicowego

Post autor: bamboo_niga »

Zadziałało! Zamiast

Kod: Zaznacz cały

 $nowa_nazwa = $_POST['nazwa['.$IDNazwa.']'];
należało dać

Kod: Zaznacz cały

$nowa_nazwa = $_POST['nazwa'][$IDNazwa];
Theprz3m0
Posty: 17
Rejestracja: wt lip 27, 2010 5:53 pm
Lokalizacja: Radom
Kontakt:

Re: Problem z przesłaniem w formularzu zmiennej typu tablicowego

Post autor: Theprz3m0 »

No to gratulacje :-D
ODPOWIEDZ