rekenen met date_interval_create_from_date_string

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Peter  Flos

Peter Flos

16/04/2014 17:16:04
Quote Anchor link
Momenteel heb ik een bestand met tijden (4 minutes, 5 minutes etc.) (Array) en een invoerveld. Nu wil ik dat het systeem de Tijd * Invoer doet, echter lukt dit mij niet.

Volgende code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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')"
);
?>


Hoe kan ik wel rekenen?
Gewijzigd op 16/04/2014 17:20:03 door Peter Flos
 
PHP hulp

PHP hulp

26/04/2024 13:36:27
 
- Ariën  -
Beheerder

- Ariën -

16/04/2014 17:21:28
Quote Anchor link
Waarom handel je het niet volledig in MySQL af?
 
Peter  Flos

Peter Flos

17/04/2014 07:19:42
Quote Anchor link
Hoe kan ik het dan helemaal in MySQL afhandelen?
 
Ivo P

Ivo P

17/04/2014 09:55:43
Quote Anchor link
wat je wil je precies voor tijdstip bereiken?

Ik zie iets met NOW(), maar ook met ruiters?
 
Peter  Flos

Peter Flos

17/04/2014 15:58:37
Quote Anchor link
Ik wil bijvoorbeeld, als je 10 intikt onder het hokje Ruiters dat er dan 10 * 5 = 50 minuten bij de huidige servertijd komen.
 
Ivo P

Ivo P

17/04/2014 16:18:09
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php

$sql_x
= "INSERT INTO tabel (eindtijd) VALUES (NOW() + INTERVAL %d MINUTE)";


$sql = sprintf($sql_x, $_POST['ruiters']);

echo $sql;
?>
 
Peter  Flos

Peter Flos

17/04/2014 20:50:50
Quote Anchor link
Hartelijk dank Ivo, het is gelukt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>
 
Ivo P

Ivo P

17/04/2014 21:50:12
Quote Anchor link
mysql_real_escape_string() in regel 3 is overbodig: je rekent met dit getal. Dus in het ongunstigste geval wordt er 5 * 0 = 0 berekend.

In elk geval helpt "5 * foto\'s" je niets tov. "5 * foto's"
 
Peter  Flos

Peter Flos

17/04/2014 21:57:35
Quote Anchor link
Dus op het moment dat ik ga rekenen met een getal en een POST (of GET) waarde, hoef ik deze nooit te escapen?
 
- Ariën  -
Beheerder

- Ariën -

17/04/2014 22:59:44
Quote Anchor link
$_POST en $_GET moet je in ieder geval altijd escapen, behalve natuurlijk als je prepared statements gebruikt.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/04/2014 01:34:08
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
"; DROP TABLE tabelnaam;

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)
PHP script in nieuw venster Selecteer het PHP script
1
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!
?>

- 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)
PHP script in nieuw venster Selecteer het PHP script
1
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.
?>

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
 
Ivo P

Ivo P

18/04/2014 09:10:14
Quote Anchor link
ik doelde inderdaad puur op de regel

$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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.