Voor een schoolopdracht moet ik bezig met een mysql database. Ik moet die weergeven op een pagina, waarbij ik een textarea verschillende sql commando's in kan voeren. Dat eerste deel is me redelijk gelukt. Maar nu moet ik het beveiligen met een wachtwoord en dat lukt me niet helemaal. Op de een of andere manier doe ik iets goed verkeerd. Als ik inlog met de juiste gegevens dan komt de database er niet te staan(ververst het login veld gewoon), maar als ik dan in de adresbalk op enter druk (geen f5 want dan stuurt hij de gegevens opnieuw) krijg ik wel de tabel, maar zo snel als ik een query uit probeer te voeren springt hij weer terug naar het login veld.

Als ik login met de juiste gegevens blijft hij dus bij het login gedeelte, log ik dan nog een keer in met de juiste gegevens dan ga ik weer naar de database, kan ik 1 query uitvoeren en bij de volgende wordt ik er weer uitgekickt. Ik heb de hele ochtend zitten kloten en verschillende dingen proberen, maar ik krijg het maar niet voor elkaar :(


Hier de code
<?PHP
session_start();

array(
'is_logged_in'	=> false,
'db' => '',
'ww' => '',
);

if(!$is_logged_in){
	if (session){
		@session_destroy();
		@session_unset();
	}
	setcookie('db', $_POST['db'], time() + 3600 * 24 * 365);
	setcookie('ww', $_POST['ww'], time() + 3600 * 24 * 365);
}

if($HTTP_COOKIE_VARS['db'] == '***' && $HTTP_COOKIE_VARS['ww'] == '***') {
	$is_logged_in = true;
}

$db = $HTTP_COOKIE_VARS['db'];
$ww = $HTTP_COOKIE_VARS['ww'];

if (isset ($_POST['query'])) { $query = $_POST['query'];  }
else                         { $query = 'Select * FROM bier'; }
?>



<html>

<head>
<title>Schoolopdracht _ MYSQL BIER Database</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>

<body>
<?
if (isset ($HTTP_COOKIE_VARS['db'])) {
	echo '<div id="top">Succesvol ingelogd</div>';
}
else { 
	?>
			<div id="top">Log in: <form method="POST" action="<?=$_SERVER['PHP_SELF']?>"><input type="text" name="db" value="database"> <input type="password" name="ww" value="wachtwoord"> <input type="submit" value="Log in"></form></div>
				
	<?
	}
$link = mysql_connect('localhost',$db,$ww);
		mysql_select_db('bier',$link);
	
if($HTTP_COOKIE_VARS['***'] == 'ramonmol' && $HTTP_COOKIE_VARS['***'] == 'ramenjar') {
		?>

	
  <div id="left">
	<form method="POST" action="<?PHP echo $_SERVER['PHP_SELF'] ?>">
		<textarea class="invoer" name="query"><?PHP echo $query; ?></textarea>
		<input type="submit" value="Verstuur Query">
	</form>
  </div>
<?
}
?>
  
  <div id="right">
  <table>
<?PHP
	
	
	//$queryform = addslashes($query);
	$uitvoer = mysql_query ($query, $link);
	
	while ($record = mysql_fetch_row($uitvoer))
	{	
		print "<tr>";
		foreach ($record as $veld)
		print "<td>$veld</td>";
		print "</tr>";
	}
	mysql_free_result($uitvoer);

?>
</table>



  </div>
</body>

</html>


Iemand van jullie die me een stapje verder kan helpen?
nou, misschien een goeie tip voor als je dat allemaal op school geleerd hebt;

let beter op in de les

of als je dat juist doet,

zoek iemand die het je wel kan leren, dit lijkt nergens op

ik doel vooral op dingen als
@session_destroy();
@session_unset();

aaaaaaaaaagresssssssssieeeeeeee
Wat Wes probeert te zeggen, $HTTP_COOKIE_VARS[] is oud, erg oud, en al sinds jaar en dag vervangen door $_COOKIE[].

Verder is het script een zootje, de html-output en de logica staan lukraak door elkaar heen. Normaal begin je pas aan de output, wanneer de rest klaar is. Het heeft weinig zin om output aan te maken wanneer je nog helemaal niet weet wat het resultaat is...

En over resultaten gesproken, waarom controleer je nergens of de queries wel zijn gelukt? Queries hebben de neiging om te mislukken, dat zal bij jou ook gaan gebeuren. In dit geval loopt jouw script in het 100 en dat is helemaal niet nodig. Zorg voor een fraaie foutafhandeling.
Ik gebruikte eerst ook $_COOKIE, maar aangezien ik het niet werkend kreeg las ik toen een artikeltje op wmcity en daar stond in dat $HTTP_COOKIE_VARS[] de beste en veiligste manier was.

Maar al die moek eromheen is gewoon rotzooi waarmee ik het werkend heb geprobeert te krijgen.

@ Wes, dit heeft mijn leraar me niet geleerd hoor. Hoewel ik hem ook niet als held inschat met PHP, zal die niet zo'n ramp zijn. Ik heb gewoon zelf wat aangekloot :P
draai 180 graden om en kloot iig de andere kant op.

of beter , leer goed php
Ik zit het script nog eens door te lezen, maar het is echt rampzalig. En dat zeg ik niet om je af te zeiken, maar om je de ogen te openen.

1) Je maakt een sessie aan en je doet daar verder niets mee. Waarom dan een sessie?
2) Je leest cookies uit met daarin database-gegevens (user, wachtwoord, etc.). Blijkbaar stuur je deze over het internet naar de browser van de bezoeker. Iedereen op internet kan deze cookies dus onderscheppen en uitlezen. Mocht iemand lopen kloten op jouw server, dat is geen hacker, het begrip 'hacken' is niet van toepassing wanneer je de hele wereld toegang tot de database geeft! Hoeveel problemene wil je hebben? Komt nog bij dat het volkomen onzinnig is om dit soort gegevens ergens anders op te slaan. Zet het gewoon als een variabele in het script
3) $HTTP_COOKIE_VARS[]....
4) Waar komt $query vandaan? Je voert iets uit wat er helemaal niet is. $_POST['query'] lijkt mij handiger.
5) $_POST['query'] zal vrijwel altijd mislukken als input voor een query in de database. add_slashes() gaat ook niet helpen, je hebt tenslotte quotes nodig in een query wanneer er een string in staat.

De opdracht is voor jou gewoon nog te moeilijk. Begin eerst bij de basis, ga netjes scripten, controleer je werk, etc. etc.

Begin in elk geval met de volgende regels:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL | E_STRICT);

// rest van je script
?>
Dankjewel :) Ik vat het niet als dusdanig op hoor, ik weet zelf heel goed dat ik er nog niks van kan, maar ik wil het wel graag verbeteren :)

Ik heb het hele login gebeuren maar even gelaten voor wat het is. Dit werkt nu prima en ik krijg dan ook geen errors van jouw toevoegen, enkel een notice over de toevoeging.

Standaard moet gewoon de database geladen worden, maar ik vond het wel handig als je die query daarvan direcht in het textvak zichtbaar had zodat je hem makkelijk kon uitbreiden. Als ik dus niks post, laad hij gewoon de database. En als ik wel een query gebruikt (bv. Select * FROM bier where type = 'pilsener';) dan update hij die ook in het textvak zodat daar de laatst gebruikte query blijft staan. Op dit moment is het nog wel onveilig omdat je via het textvak gewoon alle sql commando's kan uitvoeren, maar dat komt later wel.


<?PHP
	ini_set('display_errors', 1);
	error_reporting(E_ALL | E_STRICT);

$db = 'xxx';
$ww = 'xxx';
	
if (isset ($_POST['query'])) { $query = $_POST['query'];  }
else                         { $query = 'Select * FROM bier'; }


$link = mysql_connect('localhost',$db,$ww);	
		mysql_select_db('bier',$link);
?>



<html>

<head>
<title>Schoolopdracht _ MYSQL BIER Database</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>

<body>
  <div id="left">
	<form method="POST" action="<?PHP echo $_SERVER['PHP_SELF'] ?>">
		<textarea class="invoer" name="query"><?PHP echo $query; ?></textarea>
		<input type="submit" value="Verstuur Query">
	</form>
  </div>

  
  <div id="right">
  <table>
  
<?
	//$queryform = addslashes($query);
	$uitvoer = mysql_query ($query, $link);
	
	while ($record = mysql_fetch_row($uitvoer))
	{	
		print "<tr>";
		foreach ($record as $veld)
		print "<td>$veld</td>";
		print "</tr>";
	}
	mysql_free_result($uitvoer);
?>
</table>


  </div>
</body>

</html>


Dat heb ik nu en daar zal ik mee verder werken. Ik zal wel een wachtwoord op de map zetten om ervoor te zorgen dat er niemand binnen kan komen die niet hoort binnen te komen.

Het volgende wat ik nu wil doen is dat hij alle uitgevoerde queries opslaat in een tabelletje en die uitleest onder het textvak. Waarbij ik de optie wil hebben ze te verwijderen.
Waarom controleer je nog niet of $uitvoer TRUE (query gelukt) of FALSE (query mislukt) is? Een goed script begint bij de foutafhandeling!

En alles wat fout kan gaan, zal ook fout gaan. Die garantie heb je.
Gedaan, bedankt voor de tip. Echter jouw script geeft het ook aan wanneer ik iets fout heb gedaan.

<?PHP
	ini_set('display_errors', 1);
	error_reporting(E_ALL | E_STRICT);

$db = 'XXXl';
$ww = 'XXX';
	
if (isset ($_POST['query'])) { $query = $_POST['query'];  }
else                         { $query = 'Select * FROM bier'; }


$link = mysql_connect('localhost',$db,$ww);	
		mysql_select_db('bier',$link);
?>



<html>

<head>
<title>Schoolopdracht _ MYSQL BIER Database</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>

<body>
  <div id="left">
	<form method="POST" action="<?PHP echo $_SERVER['PHP_SELF'] ?>">
		<textarea class="invoer" name="query"><?PHP echo $query; ?></textarea>
		<input type="submit" value="Verstuur Query">
	</form>
  </div>

  
  <div id="right">
  <table>
  
<?
	//$queryform = addslashes($query);
	$uitvoer = mysql_query ($query, $link);
	
	while ($record = mysql_fetch_row($uitvoer))
	{	
		print "<tr>";
		foreach ($record as $veld)
		print "<td>$veld</td>";
		print "</tr>";
	}
?>
</table>
  </div>
  
<?
	if($uitvoer == true){
	echo '<div id="q_pass">query gelukt</div>';	
	} else {
	echo '<div id="q_fail">query mislukt</div>';
						}
						
		mysql_free_result($uitvoer);
?>

</body>

</html>
Eh, nu is de logica zo brak als het maar zijn kan:
1) voer de query uit (regel 39)
2) doe iets met de resultaten van de query (regel 41)
3) controleer of de query is gelukt (regel 53)
4) als de query is gelukt, zet een melding op het scherm (regel 54)
5) als de query is mislukt, ze een foutmelding op het scherm (regel 56)

Ik bespeur hier een paard achter de wagen! ;)

Bij punt 2 heb jij nog geen flauw idee of de query is gelukt. Desondanks ga jij wat doen met dit onbekende resultaat. Dit gaat hopeloos fout op het moment dat de query is mislukt. De controle van punt 3 komt dus veel te laat.

Punt 4 is ook overbodig, dat zou het moment moeten zijn om met punt 2 aan de slag te gaan.

En de foutmelding van punt 5, gebruik daar de functie mysql_error() om te achterhalen wát er fout is gegaan. Daar heb je veel meer aan dan een kansloze melding 'query mislukt'.

Tip: Gebruik i.p.v. mysql_fetch_row() de functie mysql_fetch_assoc(). Die maakt een fraaie array aan, dat is veel makelijker werken. (persoonlijke mening..)
Ah ok, ik denk dat ik hem vat. Je moet dus eerst controleren of het wel een geldige query is. Zo niet dan moet hij hem logischerwijs ook niet proberen uit te voeren.

Heb het nu hierin verandert.

<div id="right">
  <table>
  
<?
	//$queryform = addslashes($query);
	$uitvoer = mysql_query ($query, $link);
	
	if($uitvoer == true){
	echo '<div id="q_pass">query gelukt</div>';	
	} else {
	die('<div id="q_fail">query mislukt '.mysql_error().'</div>');	}
	while ($record = mysql_fetch_assoc($uitvoer))
	{	
		print "<tr>";
		foreach ($record as $veld)
		print "<td>$veld</td>";
		print "</tr>";
	}
?>
</table>
  </div>


Zo beter?

Reageren