Zliczanie punktów karnych danego usera.

0

Witam męczę się z jedną funkcją i nie daje sobię rady. Chce napisać funkcje aby pobierało mi wyniki z tabeli "przestepcy" oraz z tabeli "kary". Następnie posiadam na stronie tabelke z pętlą wyświetlającą przestepców i chciałbym żeby do każdego przestępcy pokazywało ile ma punktów karnych. Czy mógłby mi ktoś z tym pomóc?

Zacząłem pisać takie coś ale pewnie i tak jest źle :D

function punkty() {
		$sql = "SELECT * FROM przestepcy ORDER BY (id) ASC";
		$zapytanie = mysql_query($sql);
		while(){
 
	}

Tutaj jest tabelka na stronie wyświetlająca przestępców:

function przestepcy_lista(){
		echo '
			<h2 class="btn-custom2 btn--green" style="float:right;margin-top: 3rem;"><a href="/przestepcy/dodaj">Dodaj</a></h2>
		';
$sql = "SELECT * FROM przestepcy ORDER BY (id) ASC";
		$zapytanie = mysql_query($sql);
			echo '
				<table class="layout display">
				<thead>
					<tr>
						<th>ID</th>
						<th>Imię</th>
						<th>Nazwisko</th>
						<th class="adres">Adres</th>
						<th>Punkty</th>
						<th class="inne" colspan="2">Inne</th>
					</tr>
				</thead>
					<tbody>
			';
		while($z = mysql_fetch_array($zapytanie)){
			$id = $z['id'];
			$imie = $z['imie'];
			$nazwisko = $z['nazwisko'];
			$adres = $z['adres'];
			$inne = $z['inne'];
			echo '
				<tr>
					<td class="organisationnumber">'.$id.'</td>
					<td>'.$imie.'</td>
					<td>'.$nazwisko.'</td>
					<td>'.$adres.'</td>
					<td class="center">'.$punkty.'</td>
					<td>'.$inne.'</td>
					<td>
					<a class="btn-custom btn-info btn-xs" href="przestepcy/edycja/'.$id.'"><i class="far fa-edit"></i></a>
					<a href="/przestepcy/usun/'.$id.'" class="btn-custom btn-danger btn-xs"> <i class="fas fa-ban"></i></a></td>
				</tr>
			';
		}
		echo '
					</tbody>
				</table>
		';
	}

Tutaj natomiast jest funkcja która dodaje do tabeli punkty karne danego przestepcy:

function kary_dodaj(){
		echo '
			<form method="POST" class="contact-form form-add">
			<label>Przestępca:</label>
				<select class="formularz" name="przestepca">
					<option>Wybierz z listy</option>
		';
			$sql = "SELECT * FROM `przestepcy` ORDER BY (nazwisko) ASC";
			$zapytanie = mysql_query($sql);
			while($z = mysql_fetch_array($zapytanie)){
				$id = $z['id'];
				$imie = $z['imie'];
				$nazwisko = $z['nazwisko'];
				$adres = $z['adres'];
				echo '
					<option value="'.$id.'">'.$nazwisko.' '.$imie.' - '.$adres.'</option>
				';
			}
		echo '
				</select>
				<label>Ilość Punktów:</label>
				<input type="number" step="1" name="punkty" class="formularz pierwszy" placeholder="Wprowadz ilosc punktów w formie dziesietnej..."/>
				<label>Opis:</label>
				<input type="text" name="opis" class="formularz pierwszy" placeholder="Opis kary... (alternatywnie)"/>
				<a href="/przestepcy/" class="btn-custom2 btn--red" style="margin-left: 38%;">Wstecz</a>
				<input type="submit" value="Ukaraj" class="btn-custom2 btn--green add"/>
		 	</form>
		';
		if($_POST['przestepca'] != '' && $_POST['punkty'] != ''){
			$przestepca = $_POST['przestepca'];
			$punkty = $_POST['punkty'];
			$opis = $_POST['opis'];
			$kiedy = date("Y-m-d");
			$sql = "INSERT INTO `kary` (`id`, `przestepca_id`, `punkty`, `opis`, `kiedy`) VALUES (NULL, '$przestepca', '$punkty', '$opis', '$kiedy')";
			$zapytanie = mysql_query($sql);
			if(!$zapytanie){
				echo mysql_error();
			}else{}
			$kto = $_SESSION['id'];
			$z_czego = '';
			$na_co = '';
			$co = 'Ukaranie przestępcy o ID:'.$przestepca;
			$sql = "INSERT INTO `logi` (`id`, `kto`, `z_czego`, `na_co`, `kiedy`, `co`) VALUES (NULL, '$kto', '$z_czego', '$na_co', '$kiedy', '$co')";
			$zapytanie = mysql_query($sql);
			if(!$zapytanie){
				echo mysql_error();
			}else{
				header('Location: /przestepcy/');
			}
		}
	}

Jest to projekt szkolny w tym tygodniu muszę go oddac. Brakuje mi tylko tej funkcji :D Prosze o pomoc z góry dziękuje!!

0

Napisz proszę, w czym jest problem i czego nie umiesz/nie rozumiesz. Podejrzewam, że chodzi Ci o to, że dany przestępca może mieć kilka punktów w bazie i nie wiesz, jak można je zsumować, żeby zapytanie zwróciło łączną wartość punktów, które otrzymał. Czy mam rację, czy chodzi Ci o coś innego?

Jeżeli problemem jest to zsumowanie wszystkich zebranych punktów przez jednego pacjenta, to rzuć okiem na https://www.w3schools.com/sql/sql_count_avg_sum.asp i zainteresuj się SUM

0

Taaaaak właśnie o to mi chodzi mistrzu :D Czytasz mi w myślach :D

1

próbowałem z tym SUM na punktach zrobić,ale albo robie złe zapytanie albo w ogóle całą składnie nie mam pojęcia

Teraz piszę na sucho, bo nie mam możliwości, żeby to sprawdzić, ale moim zdaniem zapytanie powinno wyglądać tak:
SELECT SUM(punkty) FROM kary WHERE przestepca_id=XXXX

Możesz pokazać, co próbowałeś wpisać samemu, może jakiś błąd się rzuci w oczy.

0

A jeszcze mam pytanie zanim zaczne pisać. Wymagana jest w tej funkcji petla while? Czy nie koniecznie? Będę mógł wyświetlić te punkty bez pętli? :D

@@EDIT

function punkty() {
		$sql = "SELECT SUM(punkty) FROM kary WHERE przestepca_id='$id';";
		$zapytanie = mysql_query($sql);
		while($z = mysql_fetch_array($zapytanie)){
			$punkty = $z['punkty'];
		}
	}

oraz

function przestepcy_lista(){
		echo '
			<h2 class="btn-custom2 btn--green" style="float:right;margin-top: 3rem;"><a href="/przestepcy/dodaj">Dodaj</a></h2>
		';
$sql = "SELECT * FROM przestepcy ORDER BY (id) ASC";
		$zapytanie = mysql_query($sql);
			echo '
				<table class="layout display">
				<thead>
					<tr>
						<th>ID</th>
						<th>Imię</th>
						<th>Nazwisko</th>
						<th class="adres">Adres</th>
						<th>Punkty</th>
						<th class="inne" colspan="2">Inne</th>
					</tr>
				</thead>
					<tbody>
			';
		while($z = mysql_fetch_array($zapytanie)){
			punkty();
			$id = $z['id'];
			$imie = $z['imie'];
			$nazwisko = $z['nazwisko'];
			$adres = $z['adres'];
			$inne = $z['inne'];
			echo '
				<tr>
					<td class="organisationnumber">'.$id.'</td>
					<td>'.$imie.'</td>
					<td>'.$nazwisko.'</td>
					<td>'.$adres.'</td>
					<td class="center">'.$punkty.'</td>
					<td>'.$inne.'</td>
					<td>
					<a class="btn-custom btn-info btn-xs" href="przestepcy/edycja/'.$id.'"><i class="far fa-edit"></i></a>
					<a href="/przestepcy/usun/'.$id.'" class="btn-custom btn-danger btn-xs"> <i class="fas fa-ban"></i></a></td>
				</tr>
			';
		}
		echo '
					</tbody>
				</table>
		';
	}

Nie wiem dodałem do przestepcy_lista tą funkcje punkty ale coś jest nie tak na pewno :D Ja ogólnie dopiero raczkuje w php to jest mój pierwszy projekt :D

1

Chyba się jakoś nie rozumiemy, więc może jak wyjaśnię, co dokładnie robi SUM, to sam będziesz wiedział, czy jakieś while jest potrzebne.

SELECT SUM(punkty) FROM kary WHERE przestepca_id=XXXX:

  • SELECT czyli pobierz
  • SUM(punkty) - pobierz wszystkie wartości kolumny punkty, a następnie je zsumuj. Zapytanie nie zwróci X wartości, ale jedną, będącą sumą wszystkich wystąpień.
  • FROM kary - określa, z której tabeli dane mają zostać pobrane
  • WHERE xxx - wskazuje warunek, który ma zadecydować, które wartości zostaną zsumowane. Bez tego warunku zostałyby podliczone WSZYSTKIE punkty, niezależnie od tego, kto je dostał. Wskazując where określamy, którego pacjenta mają one dotyczyć.

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