Hallo,

Ik moet voor school voor het vak informatica het spel zeeslag maken in o.a. PHP.
Ik loop al vast bij helaas al vast bij de eerste stap en hoop dat iemand mij daarmee kan helpen.
Van mijn docent moet ik eerst een pagina moet maken waar iemand kan inloggen (zonder wachtwoord!) of zich kan registreren (naam + alias in het spel).
Vervolgens moet je dus kunnen inloggen hiervoor moet je, je php koppelen aan je database met PDO (ik werk met phpmyadmin). Vervolgens is het de bedoeling dat je nadat je hebt ingelogd, je in een wachtrij komt en kan kiezen met wie je wilt spelen (bijv. de computer).
Ik snap gelukkig wel wat ik moet doen, maar in de praktijk vindt ik het lastig uit te voeren ik hoop echt dat iemand mij kan helpen...

Alvast bedankt :)
Probeer PHP eens via codecanyon zodat je het in de vingers krijgt
Iedereen ontzettend bedankt voor alle hulp, ik probeer langzaam aan php onder de knie te krijgen!
Ik heb samen met mijn docent het voor mekaar gekregen om te registreren in de datebase.
Vervolgens heeft mijn docent me ook geholpen met mijn inlog.php, loop ik hier tegen een fout aan...
Want welke naam ik ook typ, of als ik zelfs geen naam typt wordt je toch doorgestuurd naar inlog.php, het is natuurlijk de bedoeling dat dit alleen kan als ook daadwerkelijk geregisteerd staat in de database, ook is het niet de bedoeling dat je wordt doorverwezen naar inlog.php maar naar wachtrij.php (op dit moment is dit alleen nog maar een wit scherm). Ik al enige dagen aan het proberen het werkend te krijgen maar het lukt gewoon niet...
Als iemand wil en kan helpen dank je!

Dit is het inlog formulier

<form method="post" action="inlog.php">
Naam: <input type="text" name="wie" />
<input type="submit" name="loginSubmit" value="Log in!" /> 
</form>


En dit is inlog.php
<?php



include_once "connect.php";



if (isset($_post['wie'])) {

if (empty($_post['wie'])) {

echo "Je hebt geen naam opgegeven";

echo "<a herf='index.php'> terug</a>";

} else {

$sql = "select * from accounts where naam = :naam";

$mijnSql = $db->prepare($sql);

$mijnSql->bindParam(':naam', filter_input(INPUT_POST, 'naam'));

$mijnSql->execute();



if ($mijnSql->rowCount() > 0) {

echo "Je bent ingelogd";

} else {

echo "Naam is verkeerd";

echo "<a herf='index.php'> terug</a>";


}

}

}




?>
Als ik een goed advies mag geven, kijk of je formulier verstuurd is via POST, i.p.v. te controleren of een bepaalde element is meegestuurd:

Je komt dan op de volgende structuur uit:

<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
// je formulier is verstuurd, voer hier je acties uit/
}
?>
[/code]

En als je $_POST-variabelen gebruikt, let er dan op dat je deze in hoofdletters benoemt.
Ook de functies uit je query kan je het best in hoofdletters aanduiden voor het leesbare gemak:
SELECT * FROM accounts WHEREnaam = :naam

Daarnaast gebruik je in je link het attribuut herf dit moet zijn href
Ontzettend bedankt! Het inloggen lukt nu :)

Ik kom er nu achter dat er dus nog wel een foutje zit in het registeren als ik registreer, registreerd de database alleen het alias terwijl ik ook graag wil dat de database de naam registreerd waarmee de gebruiker vervolgens moet inloggen...


<form method="post" action="registreren.php">
Naam: <input type="text" name="wie" />
<br>
<BR>
Alias: <input type="text" name="alias" />
<BR>
<BR>
<input type="submit" name="loginSubmit" value="registreer!" /> 
</form>


<?php
include_once "connect.php";

$naam = filter_input(INPUT_POST,"naam" );
$alias = filter_input(INPUT_POST,"alias" );

$sql = "insert into acounts (naam,alias) values(:naam,:alias)";
$prep = $db -> prepare($sql);

$prep -> bindParam( ':naam', $naam );
$prep -> bindParam( ':alias', $alias );

$prep -> execute ();

$msg = "je bent nu geregistreerd";
include_once "index.php";

echo $msg;

?>
Hoi Maaike, Ik wil proberen eerst je gedachtegang op de rails te zetten zodat het voor jou duidelijker wordt wat er moet gebeuren in het script dat je probeert te maken.

Wat is een sessie:
Het bijhouden van enkele gegevens van iedere client afzonderlijk voor de duur van een bepaalde periode. De sessie verloopt nadat de server een bepaalde periode niets meer van de client vernomen heeft. (bijvoorbeeld na een half uur).

Wat is technisch gezien ingelogd zijn?
Indien een client/gebruiker een pagina bij de server opvraagt dan kan de server niet weten wie de persoon erachter is.
Daarvoor heeft men dan al jaren geleden een systeem bedacht waarbij de gebruiker eerst maar eens zijn (login)naam en wachtwoord moet opgeven. Aan de hand van die gegevens kan een gebruiker geïdentificeerd worden, mits deze in de database gevonden worden. Als de gegevens inderdaad gevonden worden dan wordt er een variabele, waarschijnlijk het user ID in de sessie opgeslagen waardoor deze voor de duur van een bepaalde periode bewaard blijft (zie boven).

Als je bovenstaande goed in je opneemt en begrijpt dan begrijp je ook dat op iedere beveiligde pagina (achter de login) gekeken zal moeten worden of een dergelijke geldige variabele ook voorkomt IN DE SESSIE. Dit is dus de check of de gebruiker ingelogd is en (eventueel) ook over voldoende rechten beschikt om de desbetreffende pagina op te vragen.

Een gebruiker doorsturen
dit doe je met
<?php
header('Location: naam_van_de_pagina.php');
exit;
?>
De exit moet er (bijna altijd) achter omdat je script anders niet beëindigd wordt maar gewoon doorgaat.
Een header functie mag alleen gebruikt worden als er nog geen enkele output verstuurd is met bijvoorbeeld een echo of door HTML dat voor het php blok staat. Mede daardoor is het onverstandig om in het getoonde stukje php echo's te gebruiken.

Op regel 2 in de HTML gebruik je name="wie" en op regel 23 in je code gebruik je "naam" terwijl die twee wel moeten overeenkomen.

VOORBEELD:

<?php
// login.php

session_start();

include_once "connect.php";

//initialisatie (het aanmaken van variabelen en het toekennen van een waarde aan die variabelen)
$error = '';

if($_SERVER['REQUEST_METHOD']=="POST")
{
        $sql = "select * from accounts where naam = :naam";

        $mijnSql = $db->prepare($sql);

        $mijnSql->bindParam(':naam', filter_input(INPUT_POST, 'naam'));

        $result = $mijnSql->execute();

	if($data = $result->fetch_assoc()){ 
        	// schrijf het user_id naar de sessie!
		$_SESSION['user_id'] = $data['user_id'];
		// stuur de gebruiker door naar de beveiligde pagina
		header('Location: beveiligd.php');
		exit;
	} // ( een ELSE is hier niet nodig omdat het script beëindigd wordt in bovenstaande IF
	
	$error = 'Gebruikersnaam niet gevonden';

}
?>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Login</title>
	</head>

	<body>
		<?php echo $error; ?>
		<form method="post" action="inlog.php">
			Naam: <input type="text" name="naam" />
			<input type="submit" value="Log in!" /> 
		</form>
	</body>
</html>


beveiligd.php:

<?php
session_start();

if(!isset($_SESSION['user_id']))
{
	header('Location: login.php');
	exit;
}

$user_id = $_SESSION['user_id'];
?>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Beveiligde pagina</title>
	</head>

	<body>
		<p>U bent ingelogd met user ID: <?php echo $user_id; ?></p>
	</body>
</html>


[size=xsmall]Toevoeging op 05/04/2016 16:47:51:[/size]

Bonus scriptje waarmee gebruikers kunnen uitloggen:

uitloggen.php
<?php
session_start();
unset($_SESSION['user_id']);
header('Location: index.php');
?>
Dank je!! Ik snap nu beter wat de bedoeling is...
Nu zit ik alleen nog met mijn laatste vraag...
Ik hoop dat één van jullie mij misschien ook hiermee kunnen helpen/uitleggen waarom het niet werkt?

Ik zit namelijk met het probleem dat als iemand zich registreerd, alleen het alias in de database komt te staan en niet de naam waarmee degene zich registreerd, en dit is wel de bedoeling aangezien de naam van de persoon zijn inlog is. Ik ben nu al 3 dagen aan het zoeken en kan de fout niet vinden...

Ik heb nu:

registrerenFormulier.php

<form method="post" action="registreren.php">
Naam: <input type="text" name="wie" />
<br>
<BR>
Alias: <input type="text" name="alias" />
<BR>
<BR>
<input type="submit" name="loginSubmit" value="registreer!" /> 
</form>


En dit is registreren.php
<?php
include_once "connect.php";

$naam = filter_input(INPUT_POST,"naam" );
$alias = filter_input(INPUT_POST,"alias" );

$sql = "insert into acounts (naam,alias) values (:naam,:alias)";
$prep = $db -> prepare($sql);

$prep -> bindParam( ':naam', $naam );
$prep -> bindParam( ':alias', $alias );

$prep -> execute ();

$msg = "je bent nu geregistreerd";
include_once "index.php";

echo $msg;

?>

Het registreren werkt dus technisch gezien wel, maar alleen voor het alias en niet voor de naam...
Een voorbeeld van wat mijn phpadmin nu weergeeft:

id---------Naam----------alias---------active

50---------NULL--------Maaike3108---------0
49---------NULL--------Maaike3008---------0
48---------NULL-----------hoi-------------0


naam bestaat niet in je POST. In je formulier gebruik je wie.
idem dito "wie" vs "naam".

doe maar eens het volgende in je code:

<?php
if($_SERVER['REQUEST_METHOD']=="POST")
{
// let me see those POST variables :p
echo '<pre>' . print_r($_POST, TRUE) . '</pre>';
}
?>
Ontzettend bedankt voor al jullie hulp en reacties, ik heb een tijdje niets meer gezegd omdat ik samen met mijn leraar met gaan kijken naar mijn php opdracht.
Ik ben er samen met mijn leraar tot aan de wachtrij uit gekomen.
Dit houdt dus in dat je, je nu kunt registreren, inloggen, in de wachtrij terecht komt en kunt kiezen met wie je wilt spelen en vervolgens door gestuurd wordt naar de pagina zeeslag.php.
Zoals ik al eerder heb vertelt ben ik helaas niet goed in php en waardeer jullie hulp en tips ook enorm.
Ik hoop dat jullie me misschien ook op weg zouden kunnen helpen met het spel zeeslag, ik heb namelijk geen idee hoe ik moet beginnen.
In het spel is het eerst de bedoeling dat er bepaald wordt wie er eerst mag, dit mag random wat dus inhoud dat de andere speler als het ware blokkeert en dus niks meer kan. Ik moet aangeven wie er aan de beurt is aan de hand van bijvoorbeeld het veranderen van de kleur van de naam van de speler. De wijzigingen op het scherm moeten door middel van ajax-technologie doorgegeven worden...
De database moet in CRUD benaderd worden, want het spel wordt namelijk via de database gespeeld worden. Het is de bedoeling dat ik met coördinaten in het spel naar de andere speler kan sturen wat de andere speler heeft gedaan.

Ik hoop echt dat iemand mij kan helpen alvast ontzettend bedankt!
Hum best een lastige opdracht. Je moet op het moment dat er een tegenspeler gekozen wordt dan direct maar zorgen dat er een keus gemaakt wordt wie er gaat beginnen.

Ik stel me voor dat je een tabel games hebt met de volgende kolommen:

-game_id
-player1_id
-player2_id
-onturn_id (nummer van de speler die aan de beurt is).

De eerste keer maak je gebruik van de functie rand(1, 2);
Daarna swap je van 1 naar 2 en van 2 weer terug naar 1.

Hoe wil je het doen met het plaatsen van de schepen? Wil je dat gebruikers die zelf kunnen plaatsen of krijgen ze een random set geplaatste schepen?

Begin maar gewoon met de HTML. Een statische pagina die we later dynamisch gaan maken.
Naast PHP komt er een flinke dosis javascript bij kijken als je het een beetje leuk wilt maken. Daar zou je je dus alvast eens in kunnen verdiepen.

Hoe wil je de schepen weergeven? met een foto of mogen het gewoon gekleurde vakjes worden?

Je kunt kiezen om vakjes met <div>-jes te maken of als je van een uitdaging houdt zou je eens kunnen kijken naar HTML5 CANVAS.

Reageren