PHP waardes in een SQL Query plaatsen

Wanneer je een SQL query moet maken waarin verschillende waardes uit PHP in verwerkt moeten worden, zijn daar verschillende manieren voor. Je kan het rechtstreeks in de de query zetten:

  1. mysql_query("insert into Table (Veld1, Veld2) values ('" . $_POST['veld1'] . "', '" . $_POST['veld2'] . "')"); or die (mysql_error());

Echter is dat zeer onveilig. Wanneer de optie magic_quotes_gpc in PHP uit staat, kan een kwaadwillende kwaardaardige code implementeren.

mysql_real_escape_string
Ook kun je de PHP waardes eerst door de functie mysql_real_escape_string halen. Deze zorgt ervoor dat kwaadaardige code niet uitgevoerd kan worden, en daardoor wordt je code een stuk veiliger. Dan ziet je code er ongeveer zo uit:

  1. $veld1 = mysql_real_escape_string($_POST['veld1'];
  2. $veld2 = mysql_real_escape_string($_POST['veld2'];
  3. mysql_query("insert into Table (Veld1, Veld2) values ('" . $_POST['veld1'] . "', '" . $_POST['veld2'] . "')"); or die (mysql_error());

Echter komt dit de leesbaarheid van je code niet altijd ten goede. Persoonlijk gebruik ik daarom liever de functie sprintf in dit soort gevallen. Hierdoor worden vooral de grotere SQL query's een stuk leesbaarder, en je kunt precies zien welke variabelen gebruikt worden. Ook kun je makkelijk je SQL Query echoën wanneer je hierin een fout hebt en je deze snel even in PhpMyAdmin wilt gooien. Je code komt er dan ongeveer zo uit te zien:

  1. $sql = sprintf("insert into Table (Veld1, Veld2) values ('%s', '%s')",
  2.   mysql_real_escape_string($_POST['veld1']),
  3.   mysql_real_escape_string($_POST['veld2'])
  4. );
  5.  

Wanneer je meer dan 2 variabelen hebt kun je deze gewoon door stapelen:

  1. $sql = sprintf("insert into Table (Veld1, Veld2, Veld3, Veld4, Veld5, Veld7, VeldEtc) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
  2.   mysql_real_escape_string($waardeVanVeld1),
  3.   mysql_real_escape_string($waardeVanVeld2),
  4.   mysql_real_escape_string($waardeVanVeld3),
  5.   mysql_real_escape_string($waardeVanVeld4),
  6.   mysql_real_escape_string($waardeVanVeld5),
  7.   mysql_real_escape_string($waardeVanVeld6),
  8.   mysql_real_escape_string($waardeVanVeld7),
  9.   mysql_real_escape_string($waardeVanVeldEtc)
  10. );

Tevens wordt deze manier ook op PHP.net aangeraden. Het staat heel klein aangegeven, maar is bij de functie mysql_query te vinden. (// This is the best way to perform an SQL query)