probleem met real_escape_string
Ik probeer een tekst in een database te krijgen. Ik krijg de foutmelding:
Quote:
mysqli_error() expects exactly 1 parameter, 0 given in
de fout ontstaat bij het uitvoeren van de query:
Quote:
if(!$res=mysqli_query($dblink, $sql))
hierbij is $sql:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
$input['omschrijving']=test_input($_POST['omschrijving']);
$input['omschrijving']=mysqli_real_escape_string($dblink,$input['omschrijving']);
$sql="INSERT INTO m_boek (titel, auteur, jaar, taal, sterren, omschrijving, voorkant, bezit)
VALUES
('".$input['titel']."',
'".$input['auteur']."',
'".$input['jaar']."',
'".$input['taal']."',
'".$input['sterren']."',
'".$input['omschrijving']."',
'".$input['voorkant'].".jpg',
'".$input['bezit']."')";
?>
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
$input['omschrijving']=test_input($_POST['omschrijving']);
$input['omschrijving']=mysqli_real_escape_string($dblink,$input['omschrijving']);
$sql="INSERT INTO m_boek (titel, auteur, jaar, taal, sterren, omschrijving, voorkant, bezit)
VALUES
('".$input['titel']."',
'".$input['auteur']."',
'".$input['jaar']."',
'".$input['taal']."',
'".$input['sterren']."',
'".$input['omschrijving']."',
'".$input['voorkant'].".jpg',
'".$input['bezit']."')";
?>
De code is nog veel langer, maar dat is verder niet relevant. De waarde van $sql is bij de run:
Quote:
INSERT INTO m_boek (titel, auteur, jaar, taal, sterren, omschrijving, voorkant, bezit)
VALUES
('titel',
'auteur',
'2014',
'NL',
'1',
'$input[\'omschrijving\'] \'en enkele\' en "dubbele" en < en >',
'test2.jpg',
'0')
VALUES
('titel',
'auteur',
'2014',
'NL',
'1',
'$input[\'omschrijving\'] \'en enkele\' en "dubbele" en < en >',
'test2.jpg',
'0')
De regel van omschrijving komt overeen met hetgeen ik in heb gevoerd via een inputbox, te weten:
Quote:
$input['omschrijving'] 'en enkele' en "dubbele" en < en >
Dus op zich lijkt het me correct.
Maar waar gaat het dan fout?
Alvast bedankt,
Jop
want daar zit het probleem staat er in je foutmelding
Toevoeging op 01/06/2014 21:39:54:
waarschijnlijk moet je de mysqli_error() veranderen in: mysqli_error($dblink)
(dat maak ik op uit je veldmelding maar ik weet het niet zeker zonder je code te zien)
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
if(!$res=mysqli_query($dblink, $sql))
{
trigger_error('Fout in query: '.mysqli_error());
}
?>
if(!$res=mysqli_query($dblink, $sql))
{
trigger_error('Fout in query: '.mysqli_error());
}
?>
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
if(!$res=mysqli_query($dblink, $sql))
{
trigger_error('Fout in query: '.mysqli_error($dblink));
}
?>
if(!$res=mysqli_query($dblink, $sql))
{
trigger_error('Fout in query: '.mysqli_error($dblink));
}
?>
Toevoeging op 01/06/2014 21:52:15:
Nu heb ik wel een ander probleem, en dat is dat bij het verwerken van de tekst die ik uit de database haal, dat ik op mijn website alle " en < en > te zien krijg. Hoe kan ik dat voorkomen?
Dit krijg ik te zien in de htmlcode van de pagina die de gegevens uit de database gebruikt:
Quote:
<td colspan="3">$input['omschrijving'] 'en enkele' <br />
en &quot;dubbele&quot; <br />
<br />
en &lt; en &gt;</td>
en &quot;dubbele&quot; <br />
<br />
en &lt; en &gt;</td>
Moet ik htmlspecialchars niet eerst terug zetten tussen regel 8 en 9?
Bij het uitlezen uit de db gebruik ik:
Regel 5 moet dus weg.
Dus dan zou ik:
tussen regel 8 en 9 in moeten voegen.
Doe ik het dan ook nog veilig?
Data hoort clean in de database en niet met htmlentities.
Dus als ik hetgeen in mijn vorige reactie staat doe, dan doe ik het goed?
mysqli_real_escape_string()) in de database moet zetten. je moet je htmlentities er pas overheen doen
als je het uit de database haalt en op de pagina wilt echo'en. want als je wat met de data wilt doen dan is het heel moeilijk omdat je dan alles in de database hebt staan. op deze manier kun je het veranderen als je het op de pagina echo't.
filtert htmlentities trouwens alle xxs?
Sla je gegevens op in de database door in de query gebruik te maken van mysqli_real_escape_string.
Dan heb je, zoals hierboven aangegeven, de meest pure input verwerkt en de meeste risico's beperkt met zo min mogelijk inspanning.
Nu voer je drie bewerkingen uit op een variabele en maak je een onnodige variabele aan waar je nog wat bewerkingen op los laat.
ik doe inderdaad een aantal bewerkingen met de var. omdat ik de var eerst nog gebruik om de invoer te laten bevestigen door de gebruiker gebruik ik de functie. dan decodeer ik de special characters (htmlspecialchars_decode) en om veilig in de database op te slaan gebruik ik mysqli_real_escape_string. htmlentities gebruik ik als ik de data weer uit de database haal. Als het minder omslachtig kan, dan hoor ik het graag. Ik hobby ook maar wat en probeer iets veilig te maken. Maar gelukkig is allemaal voor mezelf ;-)