Beveiliging/foutafhandeling
Zoals dat als nu maximaal aantal tekens gebruik is krijg ik warning enz.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Je andere topics lezen.
Code (php)
Verder is je MySQL-code lek, omdat mysql_real_escape_string() ontbreekt. Je bent nu vastbaar voor hacks.
Gewijzigd op 24/02/2015 19:09:48 door - Ariën -
En NOOIT een input direct in een database zetten! dit script is niet veilig. gebruik mysql_real_escape_string(); en als je mysqli gebruikt, gebruik dan mysqli_real_escape_string();
Code (php)
1
2
3
4
2
3
4
<?php
mysql_query("INSERT INTO pages (pagina, inhoud, auteur, editdate, created)
VALUES ('".$title."', '".$content."', '".$name."', NOW(),NOW())");
?>
mysql_query("INSERT INTO pages (pagina, inhoud, auteur, editdate, created)
VALUES ('".$title."', '".$content."', '".$name."', NOW(),NOW())");
?>
gebruik ) or die(mysql_error()); om een fout te krijgen.
Waarom moet het script dood als er wat fout gaat?
Zorg liever dat het script netjes de juiste afslag kiest om vervolgens weer zijn weg te vervolgen.
http://www.phphulp.nl/php/tutorial/data-verwerking/foutafhandeling-query-sql/735/algemene-structuur/1930/
maar ik maakte het gewoon simpel ;p
Misschien een gekke vraag, maar wat is nou eigenlijk precies het verschil tussen MySQL en MySQLi?
mysql_ gaat verdwijnen.
- het database-type / de database-variant "MySQL"
- de PHP-extensie die je in staat stelt te communiceren met een MySQL-database (hier vallen functies die starten met "mysql_" onder)
MySQLi (MySQL improved) is een nieuwe(re) PHP-extensie voor communicatie met je MySQL-database. De oorspronkelijke extensie (mysql) is eigenlijk al ~10 jaar verouderd en wordt op korte termijn uitgefaseerd.
Als je nieuwe code schrijft zou je geen gebruik meer moeten maken van de mysql-extensie (functies die starten met "mysql_").
Naast MySQLi kun je ook PDO gebruiken om met een MySQL-database te communiceren - PDO (die niet voor een specifiek database-type geschreven is) heeft tevens een MySQL-driver (PDO_MYSQL).
Wat SanThe dus zegt, eigenlijk :).
Je moet je databaseconnectie meegeven, en mysqli_real_escape_string() mist nog.
Toevoeging op 24/02/2015 23:16:39:
Ik hou het wel bij mysql_query, mysqli_query is vaag..
De mysql-extensie gaat verdwijnen, het lijkt mij toch verstandig je vertrouwd te maken met mysqli of PDO. Tis gewoon een kwestie van wennen. En als je het vaag of onhandig vindt werken, zoek een (of maak je eigen) wrapper-class zodat je hetzelfde kunt doen met minder code.
create.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
include("config.php");
$name = 'Niels' ;
mysqli_query($db, "INSERT INTO pages (pagina, inhoud, auteur, editdate, created)
VALUES ('".mysqli_real_escape_string($_POST['title'])."', '".mysqli_real_escape_string($_POST['text'])."', '".$name."', NOW(),'NOW());");
}
{;?>
Created
<?;}
?>
include("config.php");
$name = 'Niels' ;
mysqli_query($db, "INSERT INTO pages (pagina, inhoud, auteur, editdate, created)
VALUES ('".mysqli_real_escape_string($_POST['title'])."', '".mysqli_real_escape_string($_POST['text'])."', '".$name."', NOW(),'NOW());");
}
{;?>
Created
<?;}
?>
config.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if(strtolower(basename($_SERVER['PHP_SELF'])) == strtolower(basename(__FILE__))) {
die('<font face="arial"><u>Geen toegang.</u></font>');
}
$db = mysqli_connect('localhost', 'xxxxx', 'xxxxx', 'xxxxx');
if (mysqli_connect_errno()) {
echo 'Connectie mislukt: ' . mysqli_connect_error();
exit();
}
?>
if(strtolower(basename($_SERVER['PHP_SELF'])) == strtolower(basename(__FILE__))) {
die('<font face="arial"><u>Geen toegang.</u></font>');
}
$db = mysqli_connect('localhost', 'xxxxx', 'xxxxx', 'xxxxx');
if (mysqli_connect_errno()) {
echo 'Connectie mislukt: ' . mysqli_connect_error();
exit();
}
?>
Ik krijg deze errors:
Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in create.php on line 12
Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in create.php on line 12
Quote:
mysqli_real_escape_string() verwacht precies 2 parameters, er is er maar 1 gegeven.
Dus dan wordt duidelijk dat we een parameter missen, en dus gaan we eens kijken op php.net.
We zien daar dat we de mysqli_real_escape_string-functie gebruiken, dus de procedurele manier, en dan zien we dus dat de opbouw (geen PHP-code) als volgt is:
Quote:
string mysqli_real_escape_string ( mysqli $link , string $escapestr )
Dan komt het erop neer dat je de link-identifier van je gebruikte mysqli_connect() mee moet geven aan de functie.
Nu mag jij raden hoe het wel hoort. ;-)
Niet vaags aan, zoals je eerder aangaf. Gewoon een kwestie van logisch kijken en manuals lezen.
Gewijzigd op 25/02/2015 13:15:32 door - Ariën -
handleiding er op na te slaan.
In principe hanteert mysqli twee schrijfwijzen:
- een procedurele variant
- een object georienteerde variant
Om verschillende redenen is het verstandiger om de object georienteerde variant te gebruiken, al was het maar om de kortere code die dit oplevert.
Als je toch de procedurele variant wilt gebruiken zul je twee argumenten moeten opgeven.
De eerste parameter (het eerste argument) bevat je connectie-object, in jouw geval is dit $db.
De tweede parameter bevat de te escapen invoer.
Hierbij (bij het escapen van DATA) is het EXTREEM BELANGRIJK dat je de juiste character encoding selecteert bij het maken van een verbinding van je database.
Om het voordeel van een wrapper te illusteren: je zou voor het escapen van je data een methode kunnen maken:
Je procedurele code ziet er zo uit:
De object georienteerde variant zou er zo uitzien:
En als je van een wrapper class gebruik zou maken blijft hier dit van over:
Een ander voordeel is dat je, in tegenstelling tot de eerste twee varianten, geen specifieke database(-extensie) functies gebruikt en daarmee het "hardcoden" hiervan verplaatst naar je wrapper class. Als je op een gegeven moment schakelt van de manier waarom je communiceert met je MySQL-database, dan hoef je dit soort functies niet te zoeken/vervangen in je code, maar in het meest gunstige geval hoef je alleen de implementatie van je wrapper class (op een plaats, in plaats van door heel je code) aan te passen.
Tijd om de In principe hanteert mysqli twee schrijfwijzen:
- een procedurele variant
- een object georienteerde variant
Om verschillende redenen is het verstandiger om de object georienteerde variant te gebruiken, al was het maar om de kortere code die dit oplevert.
Als je toch de procedurele variant wilt gebruiken zul je twee argumenten moeten opgeven.
De eerste parameter (het eerste argument) bevat je connectie-object, in jouw geval is dit $db.
De tweede parameter bevat de te escapen invoer.
Hierbij (bij het escapen van DATA) is het EXTREEM BELANGRIJK dat je de juiste character encoding selecteert bij het maken van een verbinding van je database.
Om het voordeel van een wrapper te illusteren: je zou voor het escapen van je data een methode kunnen maken:
Code (php)
Je procedurele code ziet er zo uit:
De object georienteerde variant zou er zo uitzien:
En als je van een wrapper class gebruik zou maken blijft hier dit van over:
Een ander voordeel is dat je, in tegenstelling tot de eerste twee varianten, geen specifieke database(-extensie) functies gebruikt en daarmee het "hardcoden" hiervan verplaatst naar je wrapper class. Als je op een gegeven moment schakelt van de manier waarom je communiceert met je MySQL-database, dan hoef je dit soort functies niet te zoeken/vervangen in je code, maar in het meest gunstige geval hoef je alleen de implementatie van je wrapper class (op een plaats, in plaats van door heel je code) aan te passen.
Gewijzigd op 25/02/2015 13:23:19 door Thomas van den Heuvel
Om op je wrapper-class terug te komen, je kan de MySQLi-class ook extenden om eigen functies te maken.