rekenen met date_interval_create_from_date_string
Volgende code:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$date = date_create('NOW');
$news = $date->format('Y-m-d H:i:s');
$none = date_add($date, date_interval_create_from_date_string('$_POST[ruiters] * $WDE[Ruiter_Tijd_Config] minutes'));
$new = $none->format('Y-m-d H:i:s');
mysql_query("INSERT INTO S1_Kazerne (Username,Stad_ID,Eenheid,Eind_Tijd,Totaal_Eenheden) VALUES
('$user','$Stad_ID','Ruiter','$new','$E_1_A')");
?>
$date = date_create('NOW');
$news = $date->format('Y-m-d H:i:s');
$none = date_add($date, date_interval_create_from_date_string('$_POST[ruiters] * $WDE[Ruiter_Tijd_Config] minutes'));
$new = $none->format('Y-m-d H:i:s');
mysql_query("INSERT INTO S1_Kazerne (Username,Stad_ID,Eenheid,Eind_Tijd,Totaal_Eenheden) VALUES
('$user','$Stad_ID','Ruiter','$new','$E_1_A')");
?>
Hoe kan ik wel rekenen?
Gewijzigd op 16/04/2014 17:20:03 door Peter Flos
Waarom handel je het niet volledig in MySQL af?
Hoe kan ik het dan helemaal in MySQL afhandelen?
Ik zie iets met NOW(), maar ook met ruiters?
Ik wil bijvoorbeeld, als je 10 intikt onder het hokje Ruiters dat er dan 10 * 5 = 50 minuten bij de huidige servertijd komen.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$Ruiters = 5 * mysql_real_escape_string($_POST['ruiters']);
$sql_x = "INSERT INTO S1_Kazerne (Username,Stad_ID,Eenheid,Eind_Tijd,Totaal_Eenheden) VALUES
('$user','$Stad_ID','Ruiter',NOW() + INTERVAL %d MINUTE,'$E_1_A')";
$sql = sprintf($sql_x, $Ruiters);
mysql_query($sql);
?>
In elk geval helpt "5 * foto\'s" je niets tov. "5 * foto's"
Dus op het moment dat ik ga rekenen met een getal en een POST (of GET) waarde, hoef ik deze nooit te escapen?
$_POST en $_GET moet je in ieder geval altijd escapen, behalve natuurlijk als je prepared statements gebruikt.
Peter Flos op 17/04/2014 21:57:35:
Dus op het moment dat ik ga rekenen met een getal en een POST (of GET) waarde, hoef ik deze nooit te escapen?
Uhh verschillende adviezen. Maakt t voor TS niet makkelijker. Ik zal het proberen wat genuanceerder te vertellen.
Je moet er altijd voor zorgen dat SQL injection http://nl.wikipedia.org/wiki/SQL-injectie niet mogelijk is. Wat is SQL injection? dat is dat iemand in bijvoorbeeld jouw <form> in één van je velden invult:
Ze gebruiken jouw <input type="text" /> dus om rechtstreeks database commando's op je databaseserver af te vuren. Dat moet je niet willen :P.
Als je -zoals Aar zegt- altijd escaped (met mysql_real_escape_string() dus) dan is SQL injection in theorie niet meer mogelijk. Echter in sommige gevallen is het zonder escapen toch niet mogelijk om te injecteren in de database. namelijk:
- een variabele die door de applicatie wordt aangemaakt en dus niet van buitenaf beïnvloed kan worden.
Code (php)
1
2
3
4
2
3
4
<?php
$currentTime = new DateTime(); // maak een datetime object met de huidige datum en tijd
$mysqlDate = mysql_real_escape_string($currentTime->format('Y-m-d')); // dit heeft dus geen zin!
?>
$currentTime = new DateTime(); // maak een datetime object met de huidige datum en tijd
$mysqlDate = mysql_real_escape_string($currentTime->format('Y-m-d')); // dit heeft dus geen zin!
?>
- een variabele die wel van buitenaf beïnvloed kan worden maar daarna naar een boolean, integer of float 'omgevormd' wordt. Dit kan op twee a drie manieren:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$som = $inputA + $inputB; // rekenen dus, ook wel Type Juggling genoemd.
$getal = (int) $inputA; // Type Casting, de $inputA wordt geforceerd omgezet naar een getal.
// ( "Drop tabel;" wordt dan het getal nul )
$getal - intval($inputA); // doet hetzelfde als typecasting maar dan middels een functie.
?>
$som = $inputA + $inputB; // rekenen dus, ook wel Type Juggling genoemd.
$getal = (int) $inputA; // Type Casting, de $inputA wordt geforceerd omgezet naar een getal.
// ( "Drop tabel;" wordt dan het getal nul )
$getal - intval($inputA); // doet hetzelfde als typecasting maar dan middels een functie.
?>
Meer info over Type Juggling en Casting: http://www.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting
Gewijzigd op 18/04/2014 02:12:09 door Frank Nietbelangrijk
$Ruiters = 5 * mysql_real_escape_string($_POST['ruiters']);
Dáár heeft mysql_real_escape_string geen zin.
Ik zeg ook altijd, dat die escape-functie gebruikt moet worden bij het opbouwen van de query. Niet vooraf in een constructie als $naam = mysql_real_escape_string($naam);
Dat laatste werkt op zich ook wel, maar 25 regels verderop blijft dan de vraag "was $naam nu veilig of niet?"
$Ruiters wordt niet beveiligd door de escape functie hier.
--
Trouwens niet alleen invoer van buiten zou je moeten beveiligen. Wel tegen sql-injectie, maar teksten die van de ene naar andere tabel gekopieerd worden, kunnen ook een ' bevatten.
Ik ben eens bij een applicatie moeten gaan debuggen, waarbij het probleem was dat iemand met een naam met een ' erin geen orders kon bewerken. Inderdaad, zijn naam werd in de log geschreven zonder escaping.
Het kan geen kwaad om alle strings te escapen bij het opbouwen van de query