Goeieavond,

Ik ben nu een 2-tal weken bezig met php & mysql. Ik werk aan de hand van een boek die pas uitgekomen is en van de recentste Lynda.com videos. Ik focus me op Mysqli ipv PDO omdat ik zelf toch uitsluitend werk met Mysql. Het bevalt me enorm! Het enige dat er natuurlijk gebeurd is dat je na een tijdje begint te experimenteren. Het werkt en je bent blij...maar is het wel goed?...of correct?

Ik heb bijvoorbeeld iets simpels in elkaar geflanst, vlug vlug...

Doordat men enorm waarschuwt voor sql injection werk ik met prepared statements....

Kan iemand mij vertellen of mijn spaghetticode op "iets" trekt en veilig is? Ben ik op de goede weg?


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>title</title>
    <link rel="stylesheet" href="style.css">
    <script src="script.js"></script>
  </head>
  <body>
  	<form action="homes.php" method="POST">
  		<p>Zoek: <input type="text" name="search" /></p>
  		<p>Voornaam: <input type="text" name="Voornaam" /></p>
  		<p>Achternaam: <input type="text" name="Achternaam" /></p>
  		<p>Adres: <input type="text" name="Adres" /></p>
  		<p>Discipline: <input type="text" name="Discipline" value="1 tot 5" /></p>
  		<p>Bevestig zoeken: <input type="submit" name="Submit" /></p>
  		<p>Voeg toe aan databank <input type="submit" name="Add_DB" value="Add to Database" /></p>
  	</form>
  <?php
	require_once 'isset.php';
	?>
  </body>
</html>



This is the PHP

<?php
	require_once 'login.php';
	$dbcon =  mysqli_connect($db_host, $db_username, $db_password, $db_database);
	if(mysqli_connect_errno()) die ("Error during connection");

	if(isset($_POST['Submit'])){
		

		$Naam = $_POST['search'];

		$Result = mysqli_query($dbcon,"SELECT * FROM customers WHERE Voornaam = '$Naam'");
		if(!$Result) die ("Nothing to show");

		$Rows = $Result->num_rows;

		for($i=0; $i < $Rows; $i++){
			$Row = mysqli_fetch_array($Result, MYSQLI_ASSOC);
			echo "Voornaam: " . $Row['Voornaam'] . "<br>";
			echo "Achternaam: " . $Row['Achternaam'] . "<br>";
			echo "Adres: " . $Row['Adres'] . "<br>";
			echo "<hr>";
			
		}
	}

		if(isset($_POST['Add_DB'])){
			$sql="INSERT INTO customers(Voornaam, Achternaam, Adres, Actief, Discipline)
				VALUES(?,?,?,NOW(),?)";

			if($stmt = $dbcon->prepare($sql)){

					$stmt->bind_param('sssi', $Voornaam, $Achternaam, $Adres, $Discipline);
					
					$Voornaam = $_POST['Voornaam'];
					$Achternaam = $_POST['Voornaam'];
					$Adres = $_POST['Adres'];
					$Discipline = $_POST['Discipline'];
					$stmt->execute();
					

					echo "New records created successfully";
}
		}

		mysqli_close($dbcon);
?>



Groeten,
Michaël
De POST waardes moet je als je ze in je query gebruik door mysqli_real_escape halen dat doe je nu niet bij oa $post['search']
Nee, je mengt nu de procedurele (lijn 39) en de object-georiënteerde (lijn 58) versie van MySQLi door elkaar, en dat werkt niet samen. Je zult één van beiden moeten kiezen..
Bij beiden is de connectie ook anders opgebouwd.

Bij de procedurele moet je handmatig de boel escapen (wat je niet doet) met mysqli_real_escape_string(), en bij de object-georiënteerde gaat het vanzelf als je prepared-statements gebruikt.
dus....mysqli_real_escape_string() = prepared statements? Wat is veiliger?


Wat raden jullie aan? Object-georiënteerd programmeren of procedureel?

@Aar - Dus als ik het goed begrijp - Als ik alles object georienteerd schrijf dan ben ik veilig?

Bijvoorbeeld:

Lijn 31: mysqli_connect vervangen door new mysqli

enz...

dan moet ik geen mysqli_real_escape_string() meer gebruiken

Hoe is de rest? Is mijn opbouw "wat" correct?
Ik raad aan om object-georienteerd te werken, en daarbij 'prepared statements' te gebruiken. Dan hoef je niet meer te escapen. Wat je zegt klopt verder inderdaad.

Als ik nog een goede tip mag geven: Kopieer niet onnodig variabelen op lijn 62 t/m 65. Het is nergens voor nodig.
Hoe moet ik dan op lijn 62 t/m 65 aanduiden wat de waarde van mijn variabelen zijn?

Thx alvast Aar!
Waarom zou je dat willen doen? Die $_POST variabelen heb je toch al, en die kan je toch prima gebruiken ;-)
Dus laat ik ze gewoon achterwege...



  if(isset($_POST['Add_DB'])){
            $sql="INSERT INTO customers(Voornaam, Achternaam, Adres, Actief, Discipline)
                VALUES(?,?,?,NOW(),?)";

            if($stmt = $dbcon->prepare($sql)){

                    $stmt->bind_param('sssi', $Voornaam, $Achternaam, $Adres, $Discipline);
                    
                   
                    $_POST['Voornaam'];
                    $_POST['Voornaam'];
                    $_POST['Adres'];
                    $_POST['Discipline'];

                    $stmt->execute();



[size=xsmall]Toevoeging op 15/12/2014 23:20:16:[/size]
Zodra je een formulier verstuurd, zijn de variabelen al beschikbaar, dus heel lijn 10 t/m 13 in dat laatste codeblokje kan je al achterwege laten.

Als het goed is kan je die $_POST variabelen prima in je bind_param gebruiken.
Ok...ergens begrijp ik je maar waar vermeld ik ergens nog wat $Voornaam is....ik gebruik die variabele nergens anders toch? Als ik het formulier verstuur dan staat er data in mijn velden op het formulier. Hoe weten die nu dat ze moeten toegewezen worden aan de variabele $Voornaam...
Wacht even, volgens mij maak ik een foutje....
Die variabelen in bind_param worden daar juist aangemaakt, en moeten een waarde krijgen. Dus het was juist wel goed. Even de code reverten naar de oude situatie dus.

Reageren