Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak najlepiej rozwiazac aktualizacje wpisow w bd?
Forum PHP.pl > Forum > PHP
ins@ne
Heh, to moj pierwszy post w php (ale teoretycznie tu sie nadaje).
W panelu administracyjnym robie edytowanie wpisow w bazie danych MySQL. Obawiam sie, ze niestety momentami nie jest to do konca dobrze rozwiazane wiec zalaczam kod fragmentu do edycji:
[php:1:4d48f993af]<?php
function EdytujWpis()
{
?>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=iso-8859-2">
<link rel="stylesheet" href="../../css/style.css" type="text/css">
<title>Panel administracyjny</title>
</head>
<body style="background-image: none; background-color: #222; margin: 5px;">
<?
switch ($_GET['Edytuj'])
{
case 0: Edytowanie(); break;
case 1: PotwierdzenieEdytowania(); break;
case 2: NadpisanieDanych(); break;
default: Header('Location: panel.php?Akcja=0'); break;
}
?>
</body>
</html>
<?
}

function Edytowanie() // Wyswietla formularz do edytowania wpisu
{
global $SQLHost,$SQLUser,$SQLPass,$SQLDBName;
@mysql_connect($SQLHost,$SQLUser,$SQLPass);
mysql_select_db($SQLDBName);

$SQLQuery = mysql_query('select * from kopia where Nr='.$_GET['Nr'].'');
$SQLRekord = mysql_fetch_array($SQLQuery);

?>
<table width="780" border="0" cellspacing="0" cellpadding="0">
<form method="get">
<?
print '
<tr>
<td width="160" class="panel" id="bright">Nr strony:</td>
<td class="panel" id="bright">'.$SQLRekord['Nr'].'</td>
</tr>
<tr>
<td width="160" class="panel" id="bright">Tytuł strony:</td>
<td class="panel" id="bright"><input class="login" id="edit" type="text" name="Tytul" value="'.$SQLRekord['Tytul'].'"></td>
</tr>
<tr>
<td width="160" class="panel" id="bright">Data:</td>
<td class="panel" id="bright"><input class="login" id="edit" type="text" name="Data" value="'.$SQLRekord['Data'].'"></td>
</tr>
<tr>
<td width="160" class="panel" id="bright">Poziom:</td>
<td class="panel" id="bright"><input class="login" id="edit" type="text" name="Poziom" value="'.$SQLRekord['Poziom'].'"></td>
</tr>
<tr>
<td width="160" class="panel" id="bright">Strona nadrzędna:</td>
<td class="panel" id="bright"><input class="login" id="edit" type="text" name="Nadrzedna" value="'.$SQLRekord['Nadrzedna'].'"></td>
</tr>
<tr>
<td width="160" valign="top" class="panel" id="bright" style="padding-top: 8px;">Zawartość (treść):</td>
<td class="panel" id="bright"><textarea name="Zawartosc" cols="100" rows="26" style="border: #222 1px solid; font-family: verdana, sans-serif; color: #222; font-size: 11px; text-decoration: none;">'.$SQLRekord['Zawartosc'].'</textarea></td>
</tr>
<tr>
<td colspan="2" height="50" align="center" valign="bottom" class="panel" id="bright">
<input type="hidden" name="Akcja" value="2">
<input type="hidden" name="Nr" value="'.$SQLRekord['Nr'].'">
<input type="hidden" name="Edytuj" value="1">
<input type="submit" value="Zapisz zmiany">';
?>
&nbsp;&nbsp;&nbsp;<input type="button" value="Powrót do spisu" onClick="document.location.href='panel.php?Akcja=0'">
</td>
</tr>
</form>
</table>
<?
}

function PotwierdzenieEdytowania()
{
global $SQLHost,$SQLUser,$SQLPass,$SQLDBName;
@mysql_connect($SQLHost,$SQLUser,$SQLPass);
mysql_select_db($SQLDBName);

$SQLQuery = mysql_query('select * from kopia where Nr='.$_GET['Nr'].'');
$SQLRekord = mysql_fetch_array($SQLQuery);

print '<p align="center" class="normal" id="bright">Na pewno nadpisać wpis nr '.$_GET['Nr'].'?<br><span class="small" id="bright">(Tytuł: '.$SQLRekord['Tytul'].')</span></p>';
print '<p align="center" class="normal" id="bright"><a class="normal" id="bright" href="panel.php?Akcja=2&Edytuj=2&Nr='.$_GET['Nr'].'&Tytul='.$_GET['Tytul'].'&Data='.$_GET['Data'].'&Poziom='.$_GET['Poziom'].'&Nadrzedna='.$_GET['Nadrzedna'].'&Zawartosc='.$_GET['Zawartosc'].'"><b>TAK</b></a>&nbsp|&nbsp;<a class="normal" id="bright" href="panel.php?Akcja=0"><b>NIE</b></a>';
}

function NadpisanieDanych()
{
global $SQLHost,$SQLUser,$SQLPass,$SQLDBName;
@mysql_connect($SQLHost,$SQLUser,$SQLPass);
mysql_select_db($SQLDBName);

$SQLQuery = mysql_query('select * from kopia where Nr='.$_GET['Nr'].'');
$SQLRekord = mysql_fetch_array($SQLQuery);

if ($_GET['Tytul'] != $SQLRekord['Tytul'])
{
mysql_query('update kopia set Tytul="'.$_GET['Tytul'].'" where Nr='.$SQLRekord['Nr'].'');
}

Standard();
}
?>[/php:1:4d48f993af]
Teraz wyjasnienia:
Standard() - funkcja, ktora laduje sie gdy Akcja == 0 i wyswietla po prostu wszystkie wpisy z bazy zeby mozna bylo wybrac, ktory edytowac, usunac itp.
I pytanie:
1. Nie wiem czy przekazywanie zawartosci <textarea> przez GET jest bezpieczne - nie wiem czy przy wiekszych rozmiarach tekstu mi cos nie zginie? Zdaje sobie sprawe, ze jest to troche amatorskie rozwiazanie, ale nie przyszlo mi nic innego do glowy jak moglbym pobierac potwierdzenie od uzytkownika i zeby w miedzyczasie mi nie zginela zawartosc formularza sad.gif
2. Jak moge usprawnic edytowanie tych pol, ktore byly zmienione? W kodzie uwzglednilem jedynie Tytul, ale normalnie wszystkie pola musza byc sprawdzone i jesli wystapily zmiany to trzeba je nadpisac w bazie. Troche malo wygodne z punktu widzenia objetosci kodu jest pisanie tej instrukcji warunkowej dla kazdego pola z osobna...
3. Czy ta linia: default: Header('Location: panel.php?Akcja=0'); break; jest poprawna z punktu widzenia poprawnosci skladni php? Konkretnie chodzi mi o to czy tak moge uzywac funkcji Header?
Cudi
1. Nie jest bepieczne, w adresie możesz przesłac max 256 znaków. Wysyłaj dane metodą POST, a jeśli nie chcesz ich utracić wsadź je w sesje, ciacho, lub wysyłaj w inputach typu hidden.
2. Pętla foreach, z tym że najpierw musisz powyrzucać z $_POST dane których porównywać nie chcesz (lub utworzyć nową tablice bez zbędnych danych.).
3. Nie ma w tym nic złego.
bamboos
Witam!!
1. A nie możesz przekazywać przez POST. Tak samo wygodnie odczytać dane, a nie masz kilomerowego adresu (który chyba nie może być aż nadto długi).
[xml:1:4d3d940f5b]<form action="panel.php?Edytuj=1" method="post">[/xml:1:4d3d940f5b]
i zane wyciągasz nie z $_GET a z $_POST,
Dalej przy potwierdzaniu, zapisujesz wszystko do sesji i z panel.php?Edytuj=2 odczytujesz zamiast z $_GET to z $_SESSION
ewentualnie możesz (jak masz taką możliwość) zrobić tymczasową tabelę w MySQL'u i do niej wrzucać treść do potwierdzenia, a w linku przesyłać id tego wpisu:
Kod
panel.php?Edytuj=2&id=<numerek>
;P
Potem tylko go wyciągnąć, nanieść zmiany i usunąć tymczasowy wpis.
2. Na mój gust poprostu zmień cały wpis, wiele czasu na tym nie stracisz, a może nawet zyskasz, bo nie będziesz musiał wyciągać danych z bazy dla porównania.
3. Jak najbardziej, ale zamiast tego nagłówka, nie lepiej poprostu wsadzić funkcję Edytowanie()
ins@ne
1. Jesli w post mozna rzeczywiscie przesylac dlugie zmienne to rzeczywiscie lepsze rozwiazanie...
3. W sumie nie zauwazylem, ze tak samo moglbym wywolac funkcje smile.gif
Dzieki
ins@ne
Kurcze mam teraz inny problem jeszcze wiekszy... Gdy przesylam ten formularz przez POST, a pozniej zapisuje te zmienne (w funkcji potwierdzenie() ) do zmiennych sesyjnych to nie mam w jaki sposob przeslac poprzez GET parametrow do funkcji EdytujWpis(). Chodzi o to, ze ta funkcja sprawdza w GET wartosc zmiennej Edytuj i zaleznie od niego skacze do wybranej funkcji. Teraz jesli formularz leci przez POST to nie mam jak tym GETem przeslac wartosci dla Edytuj sad.gif Nie moge za nic wymyslic rozwiazania tego problemu - pewnie w ogole od poczatku troche nie tak podszedlem do problemu, ale teraz chce ratowac swoj pomysl smile.gif Jakies pomysly, sugestie, propozycje?
halfik
wiec po prostu wsadz do formularza pola typu hidden:

<INPUT TYPE="hidden" name="akcja" value="0">

a pozniej normalnie masz $_POST['akcja']

no i masz to samo co przy gecie, tyle ze nei ma ograniczen co do ilosci wysylanych znakow i nikt Ci nie bedzie podgladal w pasku adresu przegladarki co tam siewyslalo winksmiley.jpg
ins@ne
no tak... to juz wczesniej ustalilismy. Chodzi jednak o to, ze w kilku miejscach nie mam mozliwosci przekazania zmiennych przez POST (chyba, ze z <a href...> da sie jakos przez post przeslac) wiec funkcje, ktora "rozdziela" zadania w zaleznosci od wartosci zmiennej Edytuj musialem zbudowac na GET... Prawdopodobnie bede musial calosc przebudowac, moze zbudowac na kilku plikach dlatego licze na pomoc, jakas propozycje rozwiazania, ktore dziala, ktore jest sprawdzone. Pozdrawiam!
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.