Wątek zablokowany 2016-03-14 21:59 przez dzek69.

usuwanie i edycja danych php + mysql

0

Witam wszystkich.
Stawiam pierwsze kroki w PHP. Mam kod mini panelu administracyjnego, jednak gdy go uruchamiam pojawia się kilka błędów.
Tu kod wyświetlania tabeli oraz usuwania z bazy

 
   $connection = @mysql_connect('localhost', 'root', 'pass')
    or die('Brak połączenia z serwerem MySQL');
    $db = @mysql_select_db('konta', $connection)
    or die('Nie mogę połączyć się z bazą danych');
    
$wynik = mysql_query("SELECT * FROM konta")
or die('Błąd zapytania');

if(mysql_num_rows($wynik) > 0) {

    echo "<table cellpadding=\"8\" border=5>";
    while($r = mysql_fetch_assoc($wynik)) {
        echo "<tr>";
        echo "<td>".$r['imie']."</td>";
        echo "<td>".$r['nazwisko']."</td>";
		echo "<td>".$r['email']."</td>";
		echo "<td>".$r['nick']."</td>";
		echo "<td>".$r['password']."</td>";
        echo "<td>
        <a href=\"administracja.php?a=del&id=$r[id]\">DEL</a>
		<a href=\"edycja.php?a=edit&id=$r[id]\">EDIT</a> 
       </td>";
        echo "</tr>";
    }
    echo "</table>";
}

$a = $_GET['a'];
$id= $_GET['id'];

if($a == 'del' and !empty($id)) {
    
    /* usuwamy rekord */
    mysql_query("DELETE FROM konta WHERE id='$id'")
    or die('Błąd zapytania: '.mysql_error());
    
    echo 'Rekord został usunęty z bazy';
	header('Location: administracja.php');
}

w wyniku pojawia się błąd :

Notice: Undefined index: a in C:\xampp\htdocs\test\administracja.php on line 32

Notice: Undefined index: id in C:\xampp\htdocs\test\administracja.php on line 33 

Tu plik Edycji i update'a:

<?php

    $connection = @mysql_connect('localhost', 'root', 'pass')
    or die('Brak połączenia z serwerem MySQL');
    $db = @mysql_select_db('konta', $connection)
    or die('Nie mogę połączyć się z bazą danych');
    
$wynik = mysql_query("SELECT * FROM konta")
or die('Błąd zapytania');

$a = $_REQUEST['a'];
$id =$_GET['id'];

if($a == 'edit' and !empty($id)) {
    /* zapytanie do tabeli */
    $wynik = mysql_query("SELECT * FROM konta WHERE
    id='$id'")
    or die('Błąd zapytania');
    
    if(mysql_num_rows($wynik) > 0) {
       
        $r = mysql_fetch_array($wynik);
        
        
        echo '<form action="administracja.php" method="post">
        <input type="hidden" name="a" value="save" />
        <input type="hidden" name="id" value="$id" />
        imie:<br />
        <input type="text" name="imie"
        value="'.$r['imie'].'" /><br />
        nazwisko:<br />
        <input type="text" name="nazwisko"
        value="'.$r['nazwisko'].'" /><br />
		email:<br />
        <input type="text" name="email"
        value="'.$r['email'].'" /><br />
		nick:<br />
        <input type="text" name="nick"
        value="'.$r['nick'].'" /><br />
		password:<br />
        <input type="text" name="password"
        value="'.$r['password'].'" /><br />
        <input type="submit" value="popraw" />
        </form>';
    }
}
elseif($a == 'save') {
    /* odbieramy zmienne z formularza */
    $id = $_POST['id'];
    $imie = trim($_POST['imie']);
    $nazwisko = trim($_POST['nazwisko']);
	$email = trim($_POST['email']);
	$nick = trim($_POST['nick']);
	$password = trim($_POST['password']);
    /* uaktualniamy tabelę*/
    mysql_query("UPDATE konta SET imie='$imie', nazwisko='$nazwisko', email='$email', nick='$nick', password='$password' WHERE id='$id'")
    or die('Błąd zapytania');
	
    echo ' Zaktualizowano dane !!!';
	header('location:administracja.php');
}  

usuwanie działa poprawnie bo rekord się usuwa i strona się odświeża, natomiast nie wiem czemu pojawiają się Notice,
Edycję można zrobić, ale nie zapisuje się do bazy i też wyświetlają się notice.
Proszę o podpowiedź skąd te komunikaty.

0

zmieniłem zapis w klikanym linku

 <a href=\"administracja.php?edit=$r[id]\">DEL</a>

Czy to powinno tak wyglądać? bo dalej nie działa

if(isset($_GET['edit'] )) {
    
    /* usuwamy rekord */
    mysql_query("DELETE FROM konta WHERE id='$id'")
    or die('Błąd zapytania: '.mysql_error());
    
    echo 'Rekord został usunęty z bazy';
	header('Location: administracja.php');
}
 
0
global napisał(a)

$connection = @mysql_connect('localhost', 'root', 'pass')

PHP/Biblioteka PDO
Co do ogólnego wykonania: Model-Widok-Kontroler. Nie mówię, że masz od razu się sztywno stosować, warto wiedzieć, że takie cuś istnieje...
Poza tym lepiej używać pojedyńczego cudzysłowie, nie podwójnego. Przy podwójnym string jest dodatkowo parsowany, co jest niepotrzebne przy wyświetlaniu. Nie będzie też konstrukcji typu

echo "<td><a href=\"administracja.php?a=del&id=$r[id]\">DEL</a><a href=\"edycja.php?a=edit&id=$r[id]\">EDIT</a></td>";

na rzecz:

echo '<td><a href="administracja.php?a=del&id='.$r[id].'">DEL</a><a href="edycja.php?a=edit&id='.$r[id].'">EDIT</a></td>';

Co do błędów. Kod jest strasznie nieczytelny, więc mogę się mylić, ale to wiersze:

$a = $_GET['a'];
$id= $_GET['id'];

powodują ostrzeżenia, więc powinno być raczej:

isset($_GET['a']) and $a = $_GET['a'];
isset($_GET['id']) and $id= $_GET['id'];
 
if($a == 'del' and !empty($id))
{
	/* usuwamy rekord */
	mysql_query("DELETE FROM konta WHERE id='$id'")
	or die('Błąd zapytania: '.mysql_error());

	echo 'Rekord został usunęty z bazy';
	header('Location: administracja.php');
}

@Po namyśle...
Nie będę kasował powyższego, bo nie po to płodziłem...
Skoro zmieniłeś nazwę zminnej w get na edit to wartość id będzie pod indeksem edit?

if(isset($_GET['edit']))
{
	/* usuwamy rekord */
	mysql_query('DELETE FROM konta WHERE id='.(int)$_GET['edit'])
	or die('Błąd zapytania: '.mysql_error());
	echo 'Rekord został usunęty z bazy';
	header('Location: administracja.php');
}

w sprawie pobierania zmiennych do zapytania z GETa: Wiki, OWASP

Następnym razem, jeśli coś nie działa to bądź bardziej konkretny - że nie działa to się domyślamy.

0

Witam
Dziękuję za wskazówki, wykorzystałem je.
Jednak dalej pojawia się błąd:
Notice: Undefined variable: a in C:\xampp\htdocs\test\administracja.php on line 35

to jest ta linia:

if($a == 'del' and !empty($id)) 

oczywiście wykorzystałem kod

isset($_GET['a'])  and $a = $_GET['a'];
isset($_GET['id']) and $id= $_GET['id'];
 

tylko czemu notice jest tylko dla 'a'? a 'id' przyjął i nie krzyczy o niego?

0

bo jeśli nie podasz w adresie wartości "a=" to zmienna "$a" się nie ustawi
widocznie "id" w adresie podałeś więc o niego nie krzyczy
powinno być

$a = isset($_GET['a']) ? $_GET['a'] : false /*'wartość domyślna'*/;

i analogicznie z id

0

Tak gwoli ścisłości, proszę o wyrozumiałość bo do końca nie rozumiem:

tu jest zmienna 'a' i zmienna 'id'

'<td><a href="administracja.php?a=del&id='.$r[id].'">DEL</a>'

Tu zapamiętujemy wartość zmiennej
dla 'a' jest to wartość 'del'
dla 'id' jest to wartość 'id' pobrana z bazy

isset($_GET['a']) and $a = $_GET['a'];
 

isset odczytuje wartości dla zmiennej 'a'

isset($_GET['id']) and $id= $_GET['id'];
 

tu wartość dla zmiennej 'id'

if($a == 'del' and !empty($id))
 

tu warunek, który sprawdza $a która powinna mieć wartość 'del' i czy $id nie puste.

Czy jak przypiszę

$a = isset($_GET['a']) ? $_GET['a'] : false /*'wartość domyślna'*/;
 

wtedy komunikat nie będzie się pojawiał?
czemu zmienna 'id' interpretuje się poprawnie?

0

Witam
Z usuwaniem jest już ok, komunikaty się nie pojawiają.
Teraz Pytanie co do edycji:
tu kawałek kodu admin.php:

............
echo "<td>".$r['password']."</td>";
        echo "<td>
        <a href=\"administracja.php?del=$r[id]\">DEL</a>
		<a href=\"edycja.php?edit=$r[id]\">EDIT</a> 
...............
 

a tu edycja.php:

<?php

    $connection = @mysql_connect('localhost', 'root', 'pass')
    or die('Brak połączenia z serwerem MySQL');
    $db = @mysql_select_db('konta', $connection)
    or die('Nie mogę połączyć się z bazą danych');
    
$wynik = mysql_query("SELECT * FROM konta")
or die('Błąd zapytania');



if(isset($_GET['edit']))
 {
    /* zapytanie do tabeli */
    $wynik = mysql_query('SELECT * FROM konta WHERE id='.(int)$_GET['edit'])
    or die('Błąd zapytania');
    
    if(mysql_num_rows($wynik) > 0) {
       
        $r = mysql_fetch_array($wynik);
        
        echo '<form action="edycja.php" method="post">
        
        imie:<br />
        <input type="text" name="imie"
        value="'.$r['imie'].'" /><br />
        nazwisko:<br />
        <input type="text" name="nazwisko"
        value="'.$r['nazwisko'].'" /><br />
		email:<br />
        <input type="text" name="email"
        value="'.$r['email'].'" /><br />
		nick:<br />
        <input type="text" name="nick"
        value="'.$r['nick'].'" /><br />
		password:<br />
        <input type="text" name="password"
        value="'.$r['password'].'" /><br />
		<input type="hidden" name="id" value="$id" />
        <input type="submit" value="submit" />
        </form>';
    }
}
  if (isset($_POST['submit']))
{
    /* odbieramy zmienne z formularza */
    $id = $_POST['id'];
    $imie = trim($_POST['imie']);
    $nazwisko = trim($_POST['nazwisko']);
	$email = trim($_POST['email']);
	$nick = trim($_POST['nick']);
	$password = trim($_POST['password']);
    /* uaktualniamy tabelę*/
    mysql_query("UPDATE konta SET imie='$imie', nazwisko='$nazwisko', email='$email', nick='$nick', password='$password' WHERE id=$id")
    or die('Błąd zapytania');
	
    echo ' Zaktualizowano dane !!!';
} 
?> 
 

pozycje do edycji się pojawiają, natomiast nie zapisują się w bazie,
nie ma żadnych komunikatów.
Podejrzewam że błędnie są odbierane dane z formularza.
Proszę o sugestie.

0

Co zwraca u Ciebie kod, z taką zmianą?

/* uaktualniamy tabelę*/
$query = "UPDATE konta SET imie='$imie', nazwisko='$nazwisko', email='$email', nick='$nick', password='$password' WHERE id=$id";
echo var_export($query);
$result = mysql_query($query)
if ($result === false)
{
	echo 'Error';
}
else
{
	echo 'Ok';
}

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