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.
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.
<?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?
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:
, 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ś.
<?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
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?
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:
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...