Nie blokuje mozliwosci rejestracji

Nie blokuje mozliwosci rejestracji
R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 149
0

Kolejny maly problem grrr, chyba zle zrobilem instrukcje warunkowa. Chce aby jesli jest powyzej 10 rekordow w tabeli nie mozna bylo dodac kolejnych. A mimo to i tak mi dodaje ^^

Kopiuj
<?php 
$zliczanierekordow = "SELECT COUNT(id) FROM tbl_mikrotour";
$ile = $user_home->runQuery($zliczanierekordow);
$ile->execute();
$tablica = $ile->fetch(PDO::FETCH_ASSOC);
foreach($tablica as $row1)
{
	echo "Zarejestrowanych graczy: " .$row1."";
}


?>

Formularz:

Kopiuj
<form action="gamesreg.php" method="post">
<input type="hidden" name="execute" value="true">
<input type="submit" value="Zarejestruj sie! ">
</form>

Drugi plik ktory wykonuje akcje po kliknieciu przycisku:

Kopiuj
<?php

require_once 'header.php';


if (isset($_POST['execute']))
	{
	if ($row1 <= 10)
		{
		$zapytanie = "INSERT INTO tbl_mikrotour(userID) VALUES(".$row['userID'].")";
		$stmt = $user_home->runQuery($zapytanie);
		$stmt->execute();
		echo 'Zarejestrowales sie';
		} else 	{
				echo 'Nie mozna zarejestrowac poniewaz jest juz maksymalna liczba graczy';
				$user_home->redirect('index.php');
				} 

	}

?>

Nie rozumiem dlaczego ten if jest nie taki jak trzeba, jesli wylapal przycisk i jesli jest liczba rekordow w bazie ponizej 10 to wykonuje skrypt, tylko jak zrobic zeby nie wykonywal skryptu jesli jest powyzej 10 rekordow w tabeli

dawid4157
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 220
0

Bo, źle to robisz :)

Ja bym to zrobił mniej więcej tak:

Kopiuj
<?php
	$count = $db->prepare("SELECT COUNT(`id`) AS `count` FROM `tbl_mikrotour`");
	if (!$count->execute()) {
		print_r ($count->errorInfo());
	} else {
	   	$row = $count->fetch();
		$count = $row['count'];	
	}

	if ($row['count'] <= 10) {
		// Wykonanie zapytania
	} else {
		echo 'Osiągnięto limit użytkowników.';
	}
?>

Dodatkowo jeśli chodzi o formularz to co prawda można tak przesyłać go. Jednak gdy będziesz mieć więcej niż jeden input zaczniesz tworzyć kolosy w stylu:

Kopiuj
if (isset($_POST['a']) && isset($_POST['b'])) 

Lepiej przypisać do buttona jakiś name i sprawdzać czy on został przesyałny w całym formie. Jeśli tak to cała reszta też zostanie przesłana.

R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 149
0

No wlasnie troche dziwna instrukcje zrobilem bo dajac if(isset-execute) nie moze byc tutaj else w ogóle poniewaz "ZAWSZE" ktos musi kliknac przycisk zeby sie zarejestrowac i zeby ten kod w ogóle dzialal wiec usunalem tego ifa, teraz zastapilem to troche i pokombinuje z Twoim kodem dzieki btw ;) masz moze pomysl jak od strony php to ogarnac ze jesli uzytkownik jest juz zarejestrowany to przycisk sie ukrywa albo blokuje np zeby nie mogl 2x sie zarejestrowac?

dawid4157
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 220
0

Żeby dany użytkownik nie mógł się drugi raz zarejestrować, stwórz sobie prosty warunek, który sprawdzi czy taki użytkownik już istnieje w bazie danych.

Jeśli chodzi o zablokowanie ponownego przesłania formularza, to najprostszym rozwiązaniem jest po prostu rzucić przekierowanie do innej podstrony po wykonaniu skryptu. Natomiast oczywiście możesz ukryć ten przycisk tylko po co.

R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 149
0

Zastanawialem sie jak to zrobic i probowalem dodac faktycznie taki warunek ktory sprawdza czy uzytkownik nie jest juz w bazie losów hm... Moglbys mi z tym jakos pomoc, nie wiem jak to ugryzc w sensie takim jak polaczyc dwa warunki bo cos mi sie wydaje ze moze kolidowac z tym pierwszym jakos ;/

Kod aktualny ktory dodaje do bazy rejestracji:

Kopiuj
<?php

require_once 'header.php';

$zliczanierekordow = "SELECT COUNT(id) FROM tbl_mikrotour";
$ile = $user_home->runQuery($zliczanierekordow);
$ile->execute();
$tablica = $ile->fetch(PDO::FETCH_ASSOC);
foreach($tablica as $row1)

if ($row1 < 10) {
	$zapytanie = "INSERT INTO tbl_mikrotour(userID) VALUES(".$row['userID'].")";
	$stmt = $user_home->runQuery($zapytanie);
	$stmt->execute();
	echo 'Zarejestrowales sie!<br/>Wroc do gier i czekaj az wystartuje turniej!';
} else {
	echo 'Osiagnieto limit uzytkownikow!<br/>Sprobuj ponownie gdy liczba zarejestrowanych graczy bedzie ponizej 10!';
}

?>

dawid4157
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 220
0

Kod nie jest najpiękniejszy ale działa, a o to Ci chyba chodzi. Przyjrzyj się i spróbuj napisać coś lepszego. Masz gotowca, ale tak jak ktoś napisał to we wcześniejszym Twoim wątku, nie wyjdzie Ci to na dobre :) Poczytaj też o bindowaniu danych oraz o SQL Injection.

Formularz:

Kopiuj
<form action="lottery.php" method="post">
	<input type="text" name="playerName" placeholder="Set your name"/>
	<button type="submit" name="add">Register</button>
</form>

Kopiuj
<?php
	try {
		$db = new PDO('mysql:host=localhost; dbname=tests', 'root', '');
		$db->exec('SET CHARACTER SET utf8');
	} catch (Exception $error) {
		print_r ('Error database in line '.__LINE__.': '.$error->getMessage().'');
	}

	if ($_SERVER["REQUEST_METHOD"] == "POST") {
		$playerName = trim($_POST['playerName']);
		
	 	$getPlayer = $db->prepare("SELECT `playerName` FROM `tbl_mikrotour` ORDER BY `userId` DESC LIMIT 10");
		if (!$getPlayer->execute()) {
		    print_r ($getPlayer->errorInfo());
		}
		foreach ($getPlayer as $rowPlayer) {
			if ($playerName == $rowPlayer['playerName']) {
				echo 'Już bierzesz udział w loterii.';
				return false;
			}
		}
		if (strlen($playerName) == 0) {
	 		echo 'Musisz wprowadzić swoje imie w loterii';
	 	} else {
			$count = $db->prepare("SELECT COUNT(`userID`) AS `count` FROM `tbl_mikrotour`");
			if (!$count->execute()) {
			    print_r ($count->errorInfo());
			} else {
			    $row = $count->fetch();
			    $count = $row['count']; 
			}
		    if ($row['count'] <= 10) {
		        $addPlayer = $db->prepare("INSERT INTO `tbl_mikrotour` (`playerName`) VALUES(:playerName)");
		        $addPlayer->bindValue(":playerName", $playerName, PDO::PARAM_STR);
		        if(!$addPlayer->execute()){
		        	print_r($addPlayer->errorInfo());
		        } else {
		        	echo ''.$playerName.', poprawnie zarejestrowałeś się w loterii.';
		        }
		    } else {
		        echo 'Osiągnięto limit użytkowników.';
		    }
	 	}
	}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.