Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z update przy dwóch tabelach
Forum PHP.pl > Forum > Przedszkole
Anonymous
Mam 2 tabele:
1. Auta (auto_id, auto_marka_id)
2. Marka (marka_id, marka_nazwa)
Funkcja edit _auta wyświetla mi poprawnie formularz z id i nazwa marki samochodu, które mogę edytować. jednak gdy kliknę w przycisk akceptuj - (wywolywana jest funkcja post_edit_auta) nie updatuje mi danych
------------------------
ta część działa dobrze:
[php:1:1689619966]<?php
function edit_auta($auto_id)
{
echo '<h3><p align="center">Edytuj auto</p></h3>';
$r = mysql_query("SELECT auto_id , marka_nazwa FROM auta, marka WHERE marka.marka_id=auto_marka_id and auta.auto_id = $auto_id") or die("error: auta.php - edit_auta");
$a = mysql_fetch_array($r);

echo '<form action="auta.php" method="get">';
echo '<input type="hidden" name="action" value="post_edit">';
echo '<input type="hidden" name="auto_id" value="'.$a["auto_id"].'">';
echo '<table width="320" align="center">';

echo '<tr>';
echo '<td width="60">Marka</td>';
echo '<td width="260"><input type="text" name="marka_nazwa" value="'.$a["marka_nazwa"].'" class="big"></td>';
echo '</tr>';
?>[/php:1:1689619966]


tutaj jest gdzieś błąd:
[php:1:1689619966]<?php
function post_edit_auta($auto_id)
{
mysql_query("update auta set auto_id=$auto_id, auto_marka_id = '$auto_marka_id' where marka.marka_id=$auto_id") or die("error: osoby.php - post_edit_player");
return 1;
}

echo '</table>';
echo '<p align="center"><input type="submit" value="Akceptuj"></p>';
echo '</form>';
echo '<p align="center"><a href="index.php?aaction=auta">Powrót do listy aut</a></p>';
}
?>[/php:1:1689619966]
Prosiłbym o pomoc bo nie bardzo wiem jak formułować zapytania jeśli dotyczą 2 róznych powiązanych ze sobą tabel.


Poprawione by hwao
hwao
BBcode prosze uzywac... na przyszlosc
I podaj jaki blad wywala...
ToPeR
Taka sugestia:
nawałęś funkcję: POST_edit_auta a użyłeś methody: GET...
Sprawdź czy masz wogóle włączone Register Globals smile.gif
Propobuję przejść na: $_GET[] i $_POST[]
cboot
[sql:1:c448394792]update auta set auto_id=$auto_id, auto_marka_id = '$auto_marka_id'
where marka.marka_id=$auto_id[/sql:1:c448394792]
Skąd tu się wzięło nagle: marka.marka_id? Każde zapytanie jest realizowane oddzielnie, więc nie możesz się odwoływać nagle do tabeli marka z poprzedniego zapytania.
Anonymous
No tak: - marka.marka_id nie ma tu sensu, więc co powinienem wpisać po poleceniu UPDATE jesli chce zrobić update pola auto_id i auto_marka_id questionmark.gif? Czy to co jest wpisane po SET jest dobrze?? Jeśli tak co ma być po WHERE?questionmark.gif

Dzięki za odpowiedzi:)
cboot
Po usunięciu błędów to zapytanie wygląda tak:
[sql:1:9b79a8deed]UPDATE auta SET auto_id = $auto_id, auto_marka_id = $auto_marka_id
WHERE auto_id = $auto_id[/sql:1:9b79a8deed]
... ale jest bezsensowne w tym wypadku, bo po co wstawiać w pole auto_id zmienną $auto_id, skoro w myśl warunku WHERE obie te wartości są sobie równe dla tego wiersza. Więc nie wiem, o co Ci chodzi i sprecyzuj, co ma robić to zapytanie. Albo dla danego wiersza update'uj tylko auto_marka_id:
[sql:1:9b79a8deed]UPDATE auta SET auto_marka_id = $auto_marka_id
WHERE auto_id = $auto_id[/sql:1:9b79a8deed]
Albo może chodziło Ci o insert, a nie update (czyli wstawienie nowego wiersza):
[sql:1:9b79a8deed]insert into auta ( auto_id, auto_marka_id ) values ( $auto_id, $auto_marka_id )[/sql:1:9b79a8deed]
Ale opisz może dokładniej, co dane zapytanie ma robić, bo tu tylko tak zgaduję, o co może Ci chodzić.
Anonymous
Chodzi o to że w formularzu do edycji pobierana jest "marka_nazwa" z tabeli marka ale mi nie chodzi o update "marka_nazwa". Chce zrobić update tabeli auta gdzie jest auto_marka_id.

Innymi slowy: Na stronie pojawia sie id i nazwa marki.
Jesli chcę to edytować wyświetla mi sie formularz gdzie mogę poprawić nazwę marki. Po kliknięciu akceptuj nie aktualizuje mi tabeli auta. A przecież powinno zaktualizować się pole auto_marka_id.

Nie ma problemu z update gdy dane są pobierane z jednej tabeli, a tu mam 2 tabele : auta i marka i już nie wiem jak zrobić update:(
cboot
No więc jak chcesz zmienić tylko pole auto_marka_id w tabeli auta, to robi to zapytanie, które podałem, czyli:
[sql:1:2f7c3c06cc]UPDATE auta SET auto_marka_id = $auto_marka_id
WHERE auto_id = $auto_id[/sql:1:2f7c3c06cc]
Jeśli nie o to Ci chodziło, to podaj co jeszcze ma się dziać. Jeśli natomiast o to Ci chodziło, ale powyższe zapytanie nie działa, to podaj cały kod odpowiedzialny za wyświetlanie i zmienianie tych wartości, bo może problem jest gdzieś po drodze.
Anonymous
Przesyłam cały kod odpowiedzialny za powyższy problem:

Tabela auta: auto_id, auto_marka_id
Tabela marka: marka_id, marka_nazwa



[php:1:2ac70ddb46]<?php
<? //funkcja display_auta odpowiada za wyświetlenie aut w komisie
//pominąłem <table><tr>żeby nie pisać nieistotnych spraw

function display_auta()
{
$r = mysql_query("SELECT auto_id , marka_nazwa FROM auta, marka
WHERE marka.marka_id=auto_marka_id") or die("error: auta.php - display_auta");

for ($i = 0; $i < mysql_num_rows($r); $i++)
{
$a = mysql_fetch_array($r);
echo '<td width="6%">'.($i+1)."</td>";
echo '<td width="18%">'.$a["marka_nazwa"]."</td>";
echo '<td width="50" align="center">'.' <a href="auta.php?action=edit&auto_id='.$a["auto_id"].'">edytuj</a>'."</td>";
}

// funkcja edit_auta po kliknięciu w link "edytuj" wyświetla formularz
//do edycji marki samochodu (zmienna marka_nazwa)

function edit_auta($auto_id)
{

$r = mysql_query("SELECT auto_id , marka_nazwa FROM auta, marka WHERE marka_id=auto_marka_id and auto_id = $auto_id") or die("error: auta.php - edit_auta");
$a = mysql_fetch_array($r);

echo '<form action="auta.php" method="get">';
echo '<input type="hidden" name="action" value="post_edit">';
echo '<input type="hidden" name="auto_id" value="'.$a["auto_id"].'">';

echo '<td width="60">Marka</td>';
echo '<td width="260"><input type="text" name="marka_nazwa" value="'.$a["marka_nazwa"].'" class="big"></td>';
echo '</tr>';


echo '<p align="center"><input type="submit" value="Akceptuj"></p>';
echo '</form>';

}
// funkcja post_edit_auta odpowiada za update tabeli auto_id
// no i tu własnie nie updaduje mi tabeli:(

function post_edit_auta($auto_id, $auto_marka_id)
{

mysql_query("update auta set auto_marka_id = $auto_marka_id WHERE auto_id=$auto_id ") or die("error: auta.php - post_edit_auta");
return 1;
}


echo '<h2><p align="center">AUTA W KOMISIE</p></h2>';

connect();
if ($action == "edit")
{
edit_auta($auto_id);
}
elseif ($action == "post_edit")
{
if (post_edit_auta($auto_id, $auto_marka_id ))
{
display_auta();
}
}
else
{
display_auta();
}

disconnect();


?>
?>[/php:1:2ac70ddb46]
cboot
Nie działa dlatego, że w formularzu przekazujesz zmienną $marka_nazwa a w update chcesz wstawić zmienną $auto_marka_id. Tak więc chyba coś pokręciłeś :wink: Jeśli chcesz zmienić pole marka_nazwa, to powinieneś to robić w tabeli marka, a jak chcesz zmienić pole auto_marka_id, to najpierw musisz skądś wczytać wartość zmiennej $auto_marka_id. Jednak zauważ, że $auto_marka_id to jedynie numer pod jakim jest dana nazwa w tabeli marka, a nie sama nazwa marki. Nazwa marki znajduje się tylko w tabeli marka, więc w tabeli auta nie masz czego updatować.
szpula
No to nie rozumiem jak mam to zrobić. :cry:

Zapytanie które jest na początku skryptu wypisuje mi id danego auta które zostalo wprowadzone do komisu i markę tego auta.

Gdy kliknę edycja w polu input pojawia mi się nazwa marki tego samochodu i mogę ją zmienić na inną (ale nie chcę nic zmieniać w tabeli marka! - ona ma być stala ze wszystkimi dostępnymi markami).

Chcę tylko edytować dane samochodu w przypadku blędnego wpisania w celu poprawy tego blędu i żeby te zmiany byly widoczne gdy wyswietlam na stronie spis aut.

No a tak na marginesie to przy edycji chcialbym zeby markę można bylo wybrać z pola listy (z tabeli marka).
szpula
czy ktoś może mi powiedzieć jak mam rozwiązać ten problem?questionmark.gif
Proszę
cboot
To już chyba rozumiem, o co Ci chodzi. W takim razie funkcję edit_auta zrób tak:
[php:1:694cc8fbb3]<?php
// funkcja edit_auta po kliknięciu w link "edytuj" wyświetla formularz
//do edycji marki samochodu (zmienna marka_nazwa)

function edit_auta($auto_id)
{

// w zapytaniu pobieżemy również auto_marka_id
$r = mysql_query("SELECT auto_id , marka_nazwa, auto_marka_id FROM auta, marka WHERE marka_id=auto_marka_id and auto_id = $auto_id") or die("error: auta.php - edit_auta");
$a = mysql_fetch_array($r);

echo '<form action="auta.php" method="get">';
echo '<input type="hidden" name="action" value="post_edit">';
echo '<input type="hidden" name="auto_id" value="'.$a["auto_id"].'">';

echo '<td width="60">Marka</td>';

// tutaj dodamy select ze wszystkimi markami z tabeli marka

echo '<td width="260"><select name="auto_marka_id">';
$r2 = mysql_query("SELECT * FROM marka") or die("error: auta.php - edit_auta");
while($a2 = mysql_fetch_array($r2))
{
if($a2['marka_id']==$a1['auto_marka_id']) // tutaj sprawdzamy, czy dana marka w selekcie jest aktualnie przypisana do danego auta marka i jesli tak, to ta pozycja będzie domyślnie zaznaczona
{
echo '<option value="'.$a2['marka_id'].'" checked>'.a2['marka_nazwa'].'</option>';
}
else
{
echo '<option value="'.$a2['marka_id'].'">'.a2['marka_nazwa'].'</option>';
}
}
echo '</select></td></tr>';


echo '<p align="center"><input type="submit" value="Akceptuj"></p>';
echo '</form>';

}
?>[/php:1:694cc8fbb3]
1. Dodałem tu listę rozwijalną, ze wszystkimi markami (domyślnie wybrana jest aktualna marka).
2. Chociaż na liście pokazuje się nazwa marki, to formularz przesyła dalej id_marki, więc update, który napisałeś powinien teraz już działać.
Anonymous
dzieki bardzo! sprawdze to po 16ej bo teraz jestem w pracy, ale mam nadzieje ze powinno dzialac:)
Anonymous
Wyświtla mi pharse error w tej lini:

echo '<option value="'.$a2['marka_id'].'"
checked>'.a2['marka_nazwa'].'</option>';
szpula
nie było $ przy zmiennej:)
szpula
nie było dolara przy zmiennej
scanner
I do tego potrzebne było zakładanie nowego wątku?
http://forum.php.pl/viewtopic.php?t=17165

Zamykam obydwa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.