Controle op connectie met MySQLi
Pagina: « vorige 1 2 3 volgende »
Dit invalideert echter niet mijn eerder gemaakte punten:
- vermijd het gebruik van aliassen, deze worden mogelijk op den duur opgeschoond
- voor het vaststellen van het slagen / mislukken van het opzetten van een verbinding is een aparte functie/methode (connect_error()); voor een expliciete controle zou je het resultaat hiervan kunnen vergelijken met NULL
- MySQLi werkt met objecten, daartoe lijkt de object georiënteerde aanpak de meest logische keuze
Gewijzigd op 10/03/2017 15:09:42 door Thomas van den Heuvel
Ik ga wel met je mee enkel vind ik wel dat het voor een beginner/hobbyist die (nog) geen kennis van OOP heeft makkelijker is om de procedural functies te gebruiken. Vanuit de ogen van een profesional is de OOP methode beter maar een "eigen" set classes die met verschillende database drivers kunnen werken is dan nog beter.
php:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
$con = mysqli_connect("gegevens database");
if(!$con)
{
echo "geen connectie met server";
}
if (!mysqli_select_db($con, 'databasenaam'))
{
echo "Database niet geselecteerd";
}
$username = mysqli_real_escape_string($con, $_POST['username']);
$email = mysqli_real_escape_string($con, $_POST['email']);
$sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";
if (!mysqli_query($con,$sql))
{
echo "Niet geplaatst";
}
else {
echo "geplaatst";
}
?>
$con = mysqli_connect("gegevens database");
if(!$con)
{
echo "geen connectie met server";
}
if (!mysqli_select_db($con, 'databasenaam'))
{
echo "Database niet geselecteerd";
}
$username = mysqli_real_escape_string($con, $_POST['username']);
$email = mysqli_real_escape_string($con, $_POST['email']);
$sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";
if (!mysqli_query($con,$sql))
{
echo "Niet geplaatst";
}
else {
echo "geplaatst";
}
?>
HTML:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>registreren</title>
</head>
<body>
<form action="insert.php" method="post">
<input type="text" name="username" required>
<input type="email" name="email" required>
<input type="submit" name="insert" value="Opslaan">
</form>
</body>
</html>
<html>
<head>
<meta charset="utf-8">
<title>registreren</title>
</head>
<body>
<form action="insert.php" method="post">
<input type="text" name="username" required>
<input type="email" name="email" required>
<input type="submit" name="insert" value="Opslaan">
</form>
</body>
</html>
Gewijzigd op 16/03/2017 14:48:58 door Rubensky PHP starter
Ikzelf ben meer voorstander om alles in één bestand te plaatsen. Maar het is meer wat jij het lekkerste vindt werken. Uiteindelijk kan je het geheel steeds meer aanpassen na mate van je geleerde kennis. Ikzelf ontwerp mijn grote webapplicaties inmiddels uitsluitend in OOP en een MVC-model. Maar dat is niet zo interessant voor beginners. ;-)
Dank voor je tip. de controle van velden daar wil ik het dan als eerste eens over hebben. Wat vind jij een verstandige manier? is dat met if(empty($name) of kan je het beter nog anders doen? Het nadeel van het op die manier inrichten is dat ik op een andere pagina (namelijk insert.php) terechtkom daar moet ik nog even wat op verzinnen. :)
Ik heb denk ik een vrij domme vraag maar goed ik kom er zelf niet uit. Hoe kan je de inhoud van radiobuttons en checkboxes opslaan in een DB? van een chackbox kan je er natuurlijk meerdere hebben.
Code (php)
1
2
2
<input type="checkbox" name="product[]" value="Pizza">Pizza<br>
<input type="checkbox" name="product[]" value="Spaghetti">Spaghetti
<input type="checkbox" name="product[]" value="Spaghetti">Spaghetti
Vervolgens heb je na het versturen van het formulier een array in $_POST['product'] waarin alle gekozen waardes staan.
Ik controleer nu de inhoud van de velden via PHP (ja ik neem van jullie aan wat jullie zeggen :))
Maar nu krijg ik een fout namelijk dat wanneer ik het formulier de eerste keer inlaad krijg ik direct te zien geen emailadres ingevuld en na leeg opslaan krijg ik geen melding dat de velden niet zijn ingevuld maar de melding Undefined index: logisch want ik vul expres niets in maar dan zou ik een mijn gemaakte echo terug moeten krijgen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
include 'include.php';
$username = '';
$email = '';
function validate($username, $email)
{
$error = '';
if ($username == '')
$error = 'u heeft geen gebruikersnaam opgegeven';
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
$error = 'u heeft geen geldig emailadres opgegeven';
return $error;
}
$username = '';
$email = '';
if ($_SERVER['REQUEST_METHOD'] =='POST')
{
$username = $_POST[''];
$email = $_POST[''];
}
$error = validate($username, $email);
if($error != '')
echo $error;
else {
$username = mysqli_real_escape_string($con, $_POST['username']);
$email = mysqli_real_escape_string($con, $_POST['email']);
$sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";
if (!mysqli_query($con,$sql))
{
echo "Niet geplaatst";
}
else {
echo "geplaatst";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>registreren</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="username"> gebruikersnaam<br>
<input type="email" name="email" >
<input type="submit" name="insert" value="Opslaan">
</form>
</body>
include 'include.php';
$username = '';
$email = '';
function validate($username, $email)
{
$error = '';
if ($username == '')
$error = 'u heeft geen gebruikersnaam opgegeven';
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
$error = 'u heeft geen geldig emailadres opgegeven';
return $error;
}
$username = '';
$email = '';
if ($_SERVER['REQUEST_METHOD'] =='POST')
{
$username = $_POST[''];
$email = $_POST[''];
}
$error = validate($username, $email);
if($error != '')
echo $error;
else {
$username = mysqli_real_escape_string($con, $_POST['username']);
$email = mysqli_real_escape_string($con, $_POST['email']);
$sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";
if (!mysqli_query($con,$sql))
{
echo "Niet geplaatst";
}
else {
echo "geplaatst";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>registreren</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="username"> gebruikersnaam<br>
<input type="email" name="email" >
<input type="submit" name="insert" value="Opslaan">
</form>
</body>
Let er verder op dat je functies nu side effects hebben: ze doen twee dingen en dat is nooit goed. Hier voert de functie bijvoorbeeld niet alleen een controle uit, maar produceert de functie altijd een string, waardoor je er vervolgens elders nog stringoperaties op los moet laten om te achterhalen of het resultaat nu goed of fout is:
Code (php)
Het is beter (of gewoon makkelijker) als je direct aan het resultaat kunt zien of de uitkomst goed of slecht is, bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Gewijzigd op 17/03/2017 12:44:47 door Ward van der Put
Om van de errors af te komen hoef ik dus alleen de functie te veranderen in jou voorbeeld?
Je kan ook een vergelijking doen met een lege string zonder inhoud, maar daar bereik je mee dat mensen ook een spatie kunnen invoeren op een veld die verplicht is. Dus die trim()'en we dan graag.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
include 'include.php';
$username = '';
$email = '';
function validate($username, $email)
{
if (empty($username)) {
return false;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
return true;
}
$username = '';
$email = '';
if ($_SERVER['REQUEST_METHOD'] =='POST')
{
$username = $_POST[''];
$email = $_POST[''];
} else
$username = mysqli_real_escape_string($con, $_POST['username']);
$email = mysqli_real_escape_string($con, $_POST['email']);
$sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";
if (!mysqli_query($con,$sql))
{
echo "Niet geplaatst";
}
else {
echo "geplaatst";
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>registreren</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="username"> gebruikersnaam<br>
<input type="email" name="email" >
<input type="submit" name="insert" value="Opslaan">
</form>
</body>
</html>
[/code
include 'include.php';
$username = '';
$email = '';
function validate($username, $email)
{
if (empty($username)) {
return false;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
return true;
}
$username = '';
$email = '';
if ($_SERVER['REQUEST_METHOD'] =='POST')
{
$username = $_POST[''];
$email = $_POST[''];
} else
$username = mysqli_real_escape_string($con, $_POST['username']);
$email = mysqli_real_escape_string($con, $_POST['email']);
$sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";
if (!mysqli_query($con,$sql))
{
echo "Niet geplaatst";
}
else {
echo "geplaatst";
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>registreren</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="username"> gebruikersnaam<br>
<input type="email" name="email" >
<input type="submit" name="insert" value="Opslaan">
</form>
</body>
</html>
[/code
en dan op regel 44 (in de huidige telling) een } plaatsen
Toevoeging op 17/03/2017 14:32:00:
nb: $username en $email zijn nu alleen geschikt om in de query te gebruiken.
zou je die nog op het scherm willen zetten, dan kan dat niet met $username, maar zul je terug moeten naar $_POST['username']
En dan zou je die met htmlspecialchars() kunnen echo-en.
Dit, omdat je door de mysql-escape functie de data mogelijk vervuild hebt met backslashes.
Welke editor gebruik je? Want die zou eigenlijk al ergens moeten gaan schreeuwen omdat de code niet goed opgebouwd is.
dit zal 'twee' op het scherm zetten...
Doe dat dan in zijn geheel of niet, maar half maar het ook niet echt overzichtelijker erop in grote codes.
in dit geval is die hele "} else" verdwaald.
Hey maar we zijn zo allemaal begonnen, dus snap het wel.
Om te beginnen doe je een function aanmaken. Die kunnen heel handig zijn.
Maar dan moet je wel weten wat dat dingetje doet.
als je een function foo($metvar) maakt, dan doe je een functie met input.
Dus verwacht de functie ook iets er in, jij wil meteen met twee, kan ook.
Die ($metvar) is alleen om door te geven.
Dus wat je daar instopt is even niet van belang. Hoewel, als je de function gebruikt, wil je daar $_POST variabelen in zetten dus dat doen we pas als we de funtion aanroepen.
Even in code met uitleg:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
include 'include.php';
// validatie
function validate($username, $email)
{
if(isset($username) && trim($username) == '')
{
return false;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
return true;
}
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
// input is gewoon de $_POST variabelen
if( validate($_POST['username'], $_POST['email']) == false)
{
echo 'gebruikersnaam is leeg, of geen geldig email';
}
// maak de query leesbaar
$sql = "INSERT INTO gebruikers (username,
email
)
VALUES ('".mysqli_real_escape_string($con, $_POST['username'])."',
'".mysqli_real_escape_string($con, $_POST['email']);."'
)";
// hier wil ik wel een variabele die leesbaar is..
$result = mysqli_query($con,$sql)
if(!$result)
{
echo 'Niet geplaatst!';
}
else
{
echo 'geplaatst!';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>registreren</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="username"> gebruikersnaam<br>
<input type="email" name="email" >
<input type="submit" name="insert" value="Opslaan">
</form>
</body>
</html>
include 'include.php';
// validatie
function validate($username, $email)
{
if(isset($username) && trim($username) == '')
{
return false;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
return true;
}
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
// input is gewoon de $_POST variabelen
if( validate($_POST['username'], $_POST['email']) == false)
{
echo 'gebruikersnaam is leeg, of geen geldig email';
}
// maak de query leesbaar
$sql = "INSERT INTO gebruikers (username,
)
VALUES ('".mysqli_real_escape_string($con, $_POST['username'])."',
'".mysqli_real_escape_string($con, $_POST['email']);."'
)";
// hier wil ik wel een variabele die leesbaar is..
$result = mysqli_query($con,$sql)
if(!$result)
{
echo 'Niet geplaatst!';
}
else
{
echo 'geplaatst!';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>registreren</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="username"> gebruikersnaam<br>
<input type="email" name="email" >
<input type="submit" name="insert" value="Opslaan">
</form>
</body>
</html>
Ik zeg niet dat deze code perfect is, maar om je een idee te geven hoe je dingen doet (denk dat je echt even de weg kwijt bent) is deze opzet al een stuk schoner.
Zoals je ziet probeer ik mijzelf niet telkens te kopiëren. $username, $email is als input een handige naam om door te geven. Maar dat "doorgeven" hoeft niet als je het in je code zet om te posten. Want die waardes zijn al bekend snap je?
Ook een query schrijf je onder elkaar om beter te kunnen lezen.
En het escapen kan ook gewoon rechtstreeks in de sql string.
Gewijzigd op 17/03/2017 16:20:50 door Bart V B