Problem z zapisem rekordów pobranych do tabeli pętlą while

0

Witam jestem tu nowym forumowiczem więc proszę o wyrozumiałość. Tworzę pewien projekcik i trafiłem na mur, a że jestem młodym adeptem tajników PHP i MySQL więc nie rugajcie mnie za być może trywialne problemy.

Mam tabelę generowaną z bazy MySQL oto jej kod:

.......
{
echo '<form action="skladki.php" method="post">';
echo '<input type="hidden" name="a" value="save">';
echo '<input type="hidden" name="rodzaj" value="SK">';
echo 'Obciążenie dotyczy:<br><input type="text" name="opis" size="50"></input><br>';
echo 'Podstawowa kwota obciążenia:<br><input type="text" name="kwota" size="20"></input>';
echo '<br><br>';
echo '<b>Obciążenia</b>';
echo '<br><br>';
echo '<table border="1" cellspacing="0" cellpadding="1" bgcolor="#ADB79E" bordercolor="grey">';
echo '<tr>';
echo '<th>L.p.</th>';
echo '<th>Nazwisko i Imię</th>';
echo '<th>Treść</th>';
echo '<th>Data</th>';
echo '<th>% wpłaty</th>';
echo '</tr>';

$k = 0;     //liczba porządkowa
  	 while($r = mysql_fetch_array($wynikkasa))
{
$k++; 		//liczba porządkowa

echo '<tr>';
echo "<td>".$k."</td>";
echo "<td><input readonly type=\"text\" name=\"imie_nazwisko[]\" value=\"$r[login]\"></td>";
echo '<td>wg opisu powyżej</td>';
echo "<td>$data</td>";
echo '<td><input type="text" size="5" value="100" maxlength="3" name="procent" onkeyup="CheckIsFloat(this);"/></td>';
echo '</tr>';
}
echo "</table></form>";
}

Później deklaracja zmiennych i zapis do tabeli:

$imie_nazwisko = $_POST['imie_nazwisko'];
$opis = $_POST['opis'];
$rodzaj = $_POST['rodzaj'];
$suma = $_POST['kwota']*($_POST['procent'])/100;

if (!empty($opis) and !empty($suma))
foreach($imie_nazwisko AS $imie_nazwisko) //i tutaj zaczyna się mój problem

{
$ins = mysql_query("INSERT INTO kasa (imie_nazwisko,data,opis,rodzaj,kwota) VALUES ('$imie_nazwisko','$data','$opis','$rodzaj','-$suma')")or die(mysql_error());
}

mamy tabelkę z nazwiskami i polem procent, jest to pole procentu upustu, nie potrafię dokonać zapisu do tabeli, tak aby skrypt pobrał wcześniej odczytane nazwiska i odpowiednio przyporządkował upust do każdego. Prosze o pomoc w temacie. Dziękuję i pozdrawiam.

1

Przy inpucie z procentem jego name określ jako procent[].
Potem coś takiego:

for ($i = 0; $i < count($_POST['imie_nazwisko']); $i++) {
  // te dwie zmienne są stałe dla KAŻDEJ osoby?
  $opis = $_POST['opis'];
  $rodzaj = $_POST['rodzaj'];
  $imie_nazwisko = $_POST['imie_nazwisko'][$i];
  $suma = $_POST['kwota']*$_POST['procent'][$i]/100; // kwota też jest stała?

  // tutaj wykonuj zapytania INSERT
}

Dodatkowo:
Lektura o SQL Injection. Twój kod jest dziurawy i podatny na podstawowy błąd związany z bazami danych. Wpisz sobie pojedynczy apostrof ' w pole z imieniem, zobacz co się stanie. Zaraz ktoś wyskoczy, że najlepiej użyj PDO (Googluj, pierwszy wynik). Trochę racja.

Lepsza obsługa błędów. Wypisanie błędu mysql po jego wystąpieniu jest kiepskim sposobem. Dajesz znać "ej, na mojej stronie jest coś bardzo nie tak, a dokładnie to to:" i zapraszasz tym samym do eksperymentów czy uda się wyzerować Ci bazę danych czy nie. Użycie PDO na pewno to usprawni. Błędy jak chcesz tak wyświetlać, to ok - ale tylko Tobie (sprawdzaj IP, od biedy możesz np. DODATKOWO ręcznie ustawiać ciasteczko, o którym nikt inny wiedzieć nie będzie).

Nie walidujesz danych po stronie serwera (zakładam, że wcześniej też tego nie robisz)! Co z tego, że masz w javascripcie jakiś test czy zmienna pasuje do typu float, jeżeli ktoś może wyłączyć javascript, albo po prostu pchnąć fałszywe dane różnymi narzędziami? Jeżeli przychodzi Ci odpowiedź: Ale to jest aplikacja tylko dla mnie/dla zaufanej osoby, to jest to zła odpowiedź. Dobre nawyki miej zawsze, nie odpuszczaj nigdy bezpieczeństwa, bo coś tam, bo zatracisz świadomość tworzenia rzeczy bezpiecznych. Zresztą w połączeniu z SQL Injection nawet jakieś logowanie nie powstrzyma obcego przed wejściem do panelu, w którym dodatkowo nic nie walidujesz.

0

Dziękuję bardzo za odpowiedź, wszystko działa jak należy jeszcze posiedzę nad zabezpieczeniem, na ten czas wygląda to tak:

.......
echo '<tr>';
	echo '<tr style="'.($i%2==0?'background-color: #CCCCCE;':'background-color: #DEE0E2;').'">'; //kolorowanie wierszy
	echo "<td>".$k."</td>";
	echo "<td><input readonly type=\"text\" name=\"imie_nazwisko[]\" value=\"$r[login]\"></td>";
	echo '<td>wg opisu powyżej</td>';
	echo "<td>$data</td>";
	echo '<td><input type="text" size="5" value="100" maxlength="3" name="procent[]" onkeyup="CheckIsFloat(this);"/></td>';
	echo '</tr>';
}
   echo "</table></center></form>";
}

for ($i = 0; $i < count($_POST['imie_nazwisko']); $i++) {

  $opis = htmlspecialchars(trim($_POST['opis']), ENT_QUOTES);
  $rodzaj = htmlspecialchars(trim($_POST['rodzaj']), ENT_QUOTES);
  $imie_nazwisko = htmlspecialchars(trim($_POST['imie_nazwisko'][$i]), ENT_QUOTES);
  $suma = htmlspecialchars(trim($_POST['kwota']*$_POST['procent'][$i]/100), ENT_QUOTES);

if (!empty($opis) and !empty($suma))


$ins = @mysql_query("INSERT INTO kasa (imie_nazwisko,data,opis,rodzaj,kwota) VALUES ('$imie_nazwisko','$data','$opis','$rodzaj','-$suma')")
or die(mysql_error());

}

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