beste mensen,

Ik probeer een tekst in een database te krijgen. Ik krijg de foutmelding:

mysqli_error() expects exactly 1 parameter, 0 given in

de fout ontstaat bij het uitvoeren van de query:
if(!$res=mysqli_query($dblink, $sql))

hierbij is $sql:

<?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']."')";
?>

De code is nog veel langer, maar dat is verder niet relevant. De waarde van $sql is bij de run:

INSERT INTO m_boek (titel, auteur, jaar, taal, sterren, omschrijving, voorkant, bezit)
VALUES
('titel',
'auteur',
'2014',
'NL',
'1',
'$input[\'omschrijving\'] \'en enkele\' en &quot;dubbele&quot; en &lt; en &gt;',
'test2.jpg',
'0')

De regel van omschrijving komt overeen met hetgeen ik in heb gevoerd via een inputbox, te weten:
$input['omschrijving'] 'en enkele' en "dubbele" en < en >

Dus op zich lijkt het me correct.

Maar waar gaat het dan fout?

Alvast bedankt,

Jop
kun je de regel ook geven waar de mysqli_error() in staat?
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)
bedoel je dit?:

<?php
	if(!$res=mysqli_query($dblink, $sql)) 
	{
		trigger_error('Fout in query: '.mysqli_error());
	}
?>


ja dat moet je veranderen in:

<?php
    if(!$res=mysqli_query($dblink, $sql)) 
    {
        trigger_error('Fout in query: '.mysqli_error($dblink));
    }
?>
Aangepast, krijg nu een hele andere foutmelding, maar die is me duidelijk, dank je voor de tip!


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 &quot; en &lt; en &gt; 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:

<td colspan="3">$input['omschrijving'] 'en enkele' <br />
en &amp;quot;dubbele&amp;quot; <br />
<br />
en &amp;lt; en &amp;gt;</td>

Moet ik htmlspecialchars niet eerst terug zetten tussen regel 8 en 9?

Bij het uitlezen uit de db gebruik ik:

<?php
   $sBOmschrijving[$i]=htmlentities($aData['omschrijving']);
?>
Htmlentities is voor de presentatie en hoort dus niet in de database.
Regel 5 moet dus weg.
Regel 5 heb ik nodig omdat ik de functie voor meerdere dingen gebruik, maar belangrijker, eerst wordt de input gepresenteerd (andere delen van het script).

Dus dan zou ik:

<?php
 $input['omschrijving']=htmlspecialchars_decode($input['omschrijving'])
?>

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.
@SanThe
Dus als ik hetgeen in mijn vorige reactie staat doe, dan doe ik het goed?
wat - SanThe - probeert te zeggen is dat je de data zonder er iets aan te doen (natuurlijk wel
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?
Waarom die functie?
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.

Reageren