Bekijk Volledige Versie : Eigenaardig probleem in SQL query
Ik heb een groot aantal bestanden waarvan de inhoud nu in een database
terecht moet komen; op zich geen probleem maar toch zit ik bij het
uitvoeren van de insert opdracht in PHP met volgende foutmelding:
You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near 'Access
denied'); ?> Op de hoek van de Edingsesteenweg en de Dr. De Rolaan in
Mo' at line 3
De bestanden zijn allemaal als volgt opgebouwd:
<?php die('Access denied'); ?>
een korte tekst|<||<|webmaster|<|titel|<|mailadres|<|een
afbeelding|<|1058301758|<|0|<|
De kern van mijn script ziet er zo uit:
<?php
include("../includes/db.php");
$dir = "files";
$bestanden = scandir($dir);
for($i=2; $i<count($bestanden); $i++)
{
$bestand = $dir . "/" . $bestanden[$i];
$openbestand = fopen($bestand, "r");
$gegevens = fread($openbestand, filesize($bestand));
$stukken = explode("|<|",$gegevens);
$korte_tekst = $stukken[0];
$titel = $stukken[3];
$datum = date("Y-m-d H:i:s", $stukken[6]);
print($korte_tekst . "<br /><br />");
mysql_query("
insert into nieuws(
titel, auteur, datum, datum_actief, actief, categorie,
subcategorie, korte_tekst)
values('" .
$titel . "',2,'" . $datum . "','" . $datum . "',1,1,1,'" . $korte_tekst
.. "')") or
die("Query mislukt voor bestand " . $bestand . "<br />" .
mysql_error() . "<br /><br />");
fclose($openbestand);
}
?>
Wanneer ik die <?php die('Access denied'); ?> uit de bestanden
verwijder is er geen probleem.
Als ik in mijn mysql_query $korte_tekst vervang door gewoon een string
(dus geen gegevens uit het bestandje) is er ook geen probleem...
Iemand enig idee waarom php (of ik beter gezegd) hier in de mist gaat?
--
Groeten,
StriKe
http://www.internetfreakz.be
On Thu, 25 Jan 2007 18:47:56 +0100, StriKe
<strike_usenet@internetfreakz.be.invalid> wrote:
> Ik heb een groot aantal bestanden waarvan de inhoud nu in een database
> terecht moet komen; op zich geen probleem maar toch zit ik bij het
> uitvoeren van de insert opdracht in PHP met volgende foutmelding:
>
> You have an error in your SQL syntax; check the manual that corresponds
> to your MySQL server version for the right syntax to use near 'Access
> denied'); ?> Op de hoek van de Edingsesteenweg en de Dr. De Rolaan in
> Mo' at line 3
>
> De bestanden zijn allemaal als volgt opgebouwd:
>
> <?php die('Access denied'); ?>
> een korte tekst|<||<|webmaster|<|titel|<|mailadres|<|een
> afbeelding|<|1058301758|<|0|<|
>
> De kern van mijn script ziet er zo uit:
> $bestand = $dir . "/" . $bestanden[$i];
> $openbestand = fopen($bestand, "r");
> $gegevens = fread($openbestand, filesize($bestand));
> $stukken = explode("|<|",$gegevens);
> $korte_tekst = $stukken[0];
> Wanneer ik die <?php die('Access denied'); ?> uit de bestanden verwijder
> is er geen probleem.
> Als ik in mijn mysql_query $korte_tekst vervang door gewoon een string
> (dus geen gegevens uit het bestandje) is er ook geen probleem...
>
> Iemand enig idee waarom php (of ik beter gezegd) hier in de mist gaat?
Het bovenste gedeelt, vanaf <?php tot de eerste |<| wordt gewoon
meegenomen. Omdat daar een quote in zit wordt de string in je query te
vroeg afgebroken, en weet MySQL niet welk functies je nu bedoeld met de
rest 'Acces denied') etc..'.
Maak gebruik van fgets() om het bestand per regel binnen te halen, waarbij
je ervoor zorgt de eerste regel over te slaan.
Ook valt het aan te raden even het volgende te doen:
array_walk($stukken,'mysql_real_escape_string');
Dan worden alle quotes/rare karakters "ge-escaped" (pfff engels naar
nederlands krijgen... wat zou een goede term hiervoor zijn?), zodat ze
altijd als volledige string naar de database gaan.
--
Rik Wasmus
* I'm testing several new newsreaders at the moment. Please excuse
possible errors and weird content. *
> Het bovenste gedeelt, vanaf <?php tot de eerste |<| wordt gewoon meegenomen.
> Omdat daar een quote in zit wordt de string in je query te vroeg afgebroken,
> en weet MySQL niet welk functies je nu bedoeld met de rest 'Acces denied')
> etc..'.
Hoe verklaar je dan het feit dat wanneer ik $korte_tekst op het scherm
afbeeld die <?php etc NIET wordt afgedrukt op het scherm, maar als ik
diezelfde variabele dan gebruik in een SQL query, die <?php etc wél
meergerekend wordt? Zie PHP daar dan twee verschillende waarden voor
die ene variabele?
> Maak gebruik van fgets() om het bestand per regel binnen te halen, waarbij je
> ervoor zorgt de eerste regel over te slaan.
Probleem (misschien zie jij daar een 'vlugge makkelijke oplossing'
voor) is dat mijn bestanden separated zijn door |<| en niet in te delen
zijn in regels... De ene keer valt het bestand uitéén op twee regels,
de andere keer vijf...
> Ook valt het aan te raden even het volgende te doen:
>
> array_walk($stukken,'mysql_real_escape_string');
>
> Dan worden alle quotes/rare karakters "ge-escaped" (pfff engels naar
> nederlands krijgen... wat zou een goede term hiervoor zijn?), zodat ze
> altijd als volledige string naar de database gaan.
Door dat toe te passen krijg ik nu wel mijn gegevens in de database, al
zit daar dan wel telkens die <?php etc in, nu die er nog uit en ik ben
iemand die vanacht rustig kan gaan slapen ;)
Hoe dan ook: alvast dank voor je reactie!
--
Groeten,
StriKe
http://www.internetfreakz.be
On Thu, 25 Jan 2007 20:09:19 +0100, StriKe
<strike_usenet@internetfreakz.be.invalid> wrote:
>> Het bovenste gedeelt, vanaf <?php tot de eerste |<| wordt gewoon
>> meegenomen. Omdat daar een quote in zit wordt de string in je query te
>> vroeg afgebroken, en weet MySQL niet welk functies je nu bedoeld met de
>> rest 'Acces denied') etc..'.
>
> Hoe verklaar je dan het feit dat wanneer ik $korte_tekst op het scherm
> afbeeld die <?php etc NIET wordt afgedrukt op het scherm, maar als ik
> diezelfde variabele dan gebruik in een SQL query, die <?php etc wél
> meergerekend wordt? Zie PHP daar dan twee verschillende waarden voor die
> ene variabele?
Nee, je bekijkt het waarschijnlijk als HTML. In HTML wordt alles tussen <>
verborgen, aangezien dit tags zijn. Bekijk eens de source van je pagina in
plaats van je pagina zelf, of bekijk htmlspecialchars($kortetekst);.
>> Maak gebruik van fgets() om het bestand per regel binnen te halen,
>> waarbij je ervoor zorgt de eerste regel over te slaan.
>
> Probleem (misschien zie jij daar een 'vlugge makkelijke oplossing' voor)
> is dat mijn bestanden separated zijn door |<| en niet in te delen zijn
> in regels... De ene keer valt het bestand uitéén op twee regels, de
> andere keer vijf...
Dat maakt an sich niet uit, als de eerste regel altijd weggegooid moet
worden. Door eerst een fgets() uit te voeren wordt de pointer in de file
verplaatst naar de volgende regel, dus met 1 fgets() en dan een fread()
tot het einde zal gewoon het hele bestand minus de eerste regel gelezen
worden.
Ofwel:
$bestand = $dir . "/" . $bestanden[$i];
$openbestand = fopen($bestand, "r");
fgets($openbestand); //donder de eerste regel weg
$gegevens = fread($openbestand, filesize($bestand)); //lees de rest
--
Rik Wasmus
* I'm testing several new newsreaders at the moment. Please excuse
possible errors and weird content. *
> Nee, je bekijkt het waarschijnlijk als HTML. In HTML wordt alles tussen <>
> verborgen, aangezien dit tags zijn. Bekijk eens de source van je pagina in
> plaats van je pagina zelf, of bekijk htmlspecialchars($kortetekst);.
Hmm, hoe een mens zich daar blind kan op staren :(
Alvast bedankt voor de verheldering :D
> Dat maakt an sich niet uit, als de eerste regel altijd weggegooid moet
> worden. Door eerst een fgets() uit te voeren wordt de pointer in de file
> verplaatst naar de volgende regel, dus met 1 fgets() en dan een fread() tot
> het einde zal gewoon het hele bestand minus de eerste regel gelezen worden.
> Ofwel:
>
> $bestand = $dir . "/" . $bestanden[$i];
> $openbestand = fopen($bestand, "r");
> fgets($openbestand); //donder de eerste regel weg
> $gegevens = fread($openbestand, filesize($bestand)); //lees de rest
Hmm, redelijk dom van me om dat niet te zien dat je met één
bestandspointer 'blijft stilstaan' natuurlijk, en niet opnieuw van
vooraf aan in het bestand begint te lezen na een fgets()
Ook hier bedankt, de oplossing werkt perfect! :-)
--
Groeten,
StriKe
http://www.internetfreakz.be
Erik Hensema
27/01/07, 18:17
On Thu, 25 Jan 2007 17:47:56 GMT, StriKe (strike_usenet@internetfreakz.be.invalid) wrote:
> Ik heb een groot aantal bestanden waarvan de inhoud nu in een database
> terecht moet komen; op zich geen probleem maar toch zit ik bij het
> uitvoeren van de insert opdracht in PHP met volgende foutmelding:
>
> You have an error in your SQL syntax; check the manual that corresponds
> to your MySQL server version for the right syntax to use near 'Access
> denied'); ?> Op de hoek van de Edingsesteenweg en de Dr. De Rolaan in
> Mo' at line 3
>
> De bestanden zijn allemaal als volgt opgebouwd:
>
><?php die('Access denied'); ?>
> een korte tekst|<||<|webmaster|<|titel|<|mailadres|<|een
> afbeelding|<|1058301758|<|0|<|
>
> De kern van mijn script ziet er zo uit:
[...]
> Iemand enig idee waarom php (of ik beter gezegd) hier in de mist gaat?
Je vergeet om de bestanden door mysql_escape_string() te halen.
Altijd alle strings door mysql_escape_string() halen voordat je
ze in de database probeert te duwen!!
--
Erik Hensema (erik@hensema.net)
Quoting-HOWTO: http://www.leerquoten.nl
Erik Hensema <usenet@smac.hensema.net> wrote:
> Je vergeet om de bestanden door mysql_escape_string() te halen.
> Altijd alle strings door mysql_escape_string() halen voordat je
> ze in de database probeert te duwen!!
mysql_real_escape_string() is beter.
Prepared statements zijn het beste op het moment:
http://nl3.php.net/manual/en/function.mysqli-stmt-prepare.php
--
Rik Wasmus
Erik Hensema
28/01/07, 14:44
On Sat, 27 Jan 2007 14:34:50 +0100, Rik (luiheidsgoeroe@hotmail.com) wrote:
> Erik Hensema <usenet@smac.hensema.net> wrote:
>> Je vergeet om de bestanden door mysql_escape_string() te halen.
>> Altijd alle strings door mysql_escape_string() halen voordat je
>> ze in de database probeert te duwen!!
>
> mysql_real_escape_string() is beter.
>
> Prepared statements zijn het beste op het moment:
> http://nl3.php.net/manual/en/function.mysqli-stmt-prepare.php
Zo zo, mysql begint bijna een volwassen database te worden! :-O
--
Erik Hensema (erik@hensema.net)
Quoting-HOWTO: http://www.leerquoten.nl
Erik Hensema <usenet@smac.hensema.net> wrote:
> On Sat, 27 Jan 2007 14:34:50 +0100, Rik (luiheidsgoeroe@hotmail.com)
> wrote:
>> Erik Hensema <usenet@smac.hensema.net> wrote:
>>> Je vergeet om de bestanden door mysql_escape_string() te halen.
>>> Altijd alle strings door mysql_escape_string() halen voordat je
>>> ze in de database probeert te duwen!!
>>
>> mysql_real_escape_string() is beter.
>>
>> Prepared statements zijn het beste op het moment:
>> http://nl3.php.net/manual/en/function.mysqli-stmt-prepare.php
>
> Zo zo, mysql begint bijna een volwassen database te worden! :-O
Zowaar, ik ken nog de tijd dat UNION queries en subqueries gewoon niet
mogelijk waren. (Alhoewel, als ik van de gemiddelde leeftijd van de
bezoekers van deze groep moet uitgaan zou iedereen dat bijna wel kennen
die met MySQL heeft gewerkt, en ben ik een van de uitzonderingen die dat
"ver in het verleden" vind).
Helaas nog voldoende hosts die geen ondersteuning voor mysqli in PHP
bakken...
--
Rik Wasmus
On Sat, 27 Jan 2007 18:44:26 +0000 (UTC),
Erik Hensema <usenet@smac.hensema.net> wrote:
> On Sat, 27 Jan 2007 14:34:50 +0100, Rik (luiheidsgoeroe@hotmail.com) wrote:
>> Prepared statements zijn het beste op het moment:
>> http://nl3.php.net/manual/en/function.mysqli-stmt-prepare.php
>
> Zo zo, mysql begint bijna een volwassen database te worden! :-O
Jij hebt zeker nog nooit de foutmeldingen van mysqli voor je kiezen
gehad :-)
Hans
--
IM: hans.wolters@jabber.xs4all.nl
http://lonki.xs4all.nl