[PHP/MYSQL] Syntax error ondanks escape

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de volgende code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$info = "een+st'ring.html"
$proc = urldecode($info);
$proc = str_replace('.html', '', $proc);
$decoded_title = mysql_real_escape_string($proc);

$sql = "SELECT * FROM `games_live` WHERE `title` = '$decoded_title' LIMIT 1";
echo $sql.'<br>';
$query = mysql_query($sql) or die(mysql_error())

if(mysql_num_rows($query) == 0){
echo '404';
}

else{
echo '300';
}


Als de query een resultaat vindt in de database, dus er is een rij met `title` = 'een st\'ring', dan zie ik de volgende output naar de browser:
SELECT * FROM `games_live` WHERE `title` = 'een st\'ring' LIMIT 1
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 'ring.html'' at line 1
Als ik nu die echo van $sql letterlijk in phpmyadmin plak werkt het wel weer gewoon.

Het gekke is echter dat zodra ik de bijhorende rij verwijder, of $info verander zodat de query niks zal vinden, er geen errors meer zijn.

Ik zit al dagen vast, zie ik wat over het hoofd?

[ Voor 3% gewijzigd door Verwijderd op 12-02-2008 14:54 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Zet de waarde eerst eens hard in je query, dus zonder variable e.d. en check het dan nog eens. Ik weet niet wat recente PHP versies doen met variablen binnen quotes, daarom is dit wel een aardige test.

[ Voor 36% gewijzigd door djluc op 12-02-2008 14:55 ]


Acties:
  • 0 Henk 'm!

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 14-09 14:42

dominic

will code for food

Bij MSSQL dien je enkele quotes de vervangen twee maal een enkele quote wil je deze escapen.

' wordt dus ''

Geen idee of dit voor MySql ook werkt.

code:
1
 select [column] from [table] where [keyword] = 'leuk zo''n query'

[ Voor 20% gewijzigd door dominic op 12-02-2008 14:57 ]

Download my music on SoundCloud


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
djluc schreef op dinsdag 12 februari 2008 @ 14:55:
Zet de waarde eerst eens hard in je query, dus zonder variable e.d. en check het dan nog eens. Ik weet niet wat recente PHP versies doen met variablen binnen quotes, daarom is dit wel een aardige test.
Ga ik zo proberen.
dominic schreef op dinsdag 12 februari 2008 @ 14:56:
Bij MSSQL dien je enkele quotes de vervangen twee maal een enkele quote wil je deze escapen.

' wordt dus ''

Geen idee of dit voor MySql ook werkt.
De PHP functie die string zou moeten escapen voor gebruik in MySQL escapet ze met \, dus dat zou correct moeten zijn lijkt me.

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Nu online

Sebazzz

3dp

En haal die tickjes ( ` ) weg. Dat is iets van phpmyadmin maar niet van SQL.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 14-09 14:42

dominic

will code for food

Verwijderd schreef op dinsdag 12 februari 2008 @ 14:58:
[...]


Ga ik zo proberen.


[...]


De PHP functie die string zou moeten escapen voor gebruik in MySQL escapet ze met \, dus dat zou correct moeten zijn lijkt me.
PHP != MySQL, let dus goed op

Download my music on SoundCloud


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Als ik de code lokaal uitvoer en de twee puntkomma's invoer die je mist op regel 1 en 8, krijg ik geen foutmelding.

Zorg dat error reporting op E_ALL staat, en ga debuggen. Heb je PHP hoger dan 4.3 draaien? Anders werkt mysql_real_escape_string niet, bijvoorbeeld.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 21:01
SELECT * FROM `games_live` WHERE `title` = 'een st\'ring' LIMIT 1
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 'ring.html'' at line 1
Dat is raar: je foutmelding zegt iets over ring.html terwijl dat in je query niet voorkomt. Ik vermoed dus dat je code die je hier post er anders uit ziet dan in het echt. Stop je wel de goede string in mysql_query()? Ik denk dat wat je echo in regel 7 een andere string is dan wat je in regel 8 aan mysql_query() meegeeft.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Sebazzz schreef op dinsdag 12 februari 2008 @ 14:58:
En haal die tickjes ( ` ) weg. Dat is iets van phpmyadmin maar niet van SQL.
Heh? Dat is juist van MySQL.

`` = MySQL
[] = MSSQL

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Sebazzz schreef op dinsdag 12 februari 2008 @ 14:58:
En haal die tickjes ( ` ) weg. Dat is iets van phpmyadmin maar niet van SQL.
Ik vond pas een undocumented feature van MySQL; je mag een tabel geen 'columns' noemen, hoewel dat woord niet op de lijst van reserved keywords staat. Backticks om de tabelnaam heen in de query did the trick.

Edit: COLUMNS not reserved in: 5.0.48, 5.0.3-5.0.48
Ah :+

[ Voor 16% gewijzigd door CodeCaster op 12-02-2008 15:17 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Vervang "mysql_query()" met "exit()" en je ziet het probleem in 1x.

Kijk overigens eens kritisch naar je foutmelding
SELECT * FROM `games_live` WHERE `title` = 'een st\'ring' LIMIT 1
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 'ring.html'' at line 1
In de query die je laat zien komt het hele stuk ".html" niet voor. Typfoutje, of zit je naar de verkeerde query te turen?
`title` = 'een st\'ring',
Als het goed is staat die backslash ook niet in je database. Die slash dient slechts omhet sluitende haakje te escapen in je WHERE-clause.

[ Voor 101% gewijzigd door frickY op 12-02-2008 15:30 ]


Acties:
  • 0 Henk 'm!

  • keisersose
  • Registratie: Maart 2003
  • Laatst online: 29-05 17:34
Het lijkt inderdaad alsof je sql query die je met echo output anders is dan die je aan mysql_query meegeeft. Alsof je dan ineens $info gebruikt in plaats van $decoded_title.

Is het stukje code in je startpost hetzelfde als je echte code? (Aangezien er ook twee keer een ; mist, lijkt dat niet het geval.
Inderdaad wat frickY zegt:
Vervang "mysql_query()" met "exit()" en je ziet het probleem in 1x.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
frickY schreef op dinsdag 12 februari 2008 @ 15:23:
In de query die je laat zien komt het hele stuk ".html" niet voor. Typfoutje, of zit je naar de verkeerde query te turen?
Zat ik ook al naar te kijken, is deze code letterlijk de code die fout gaat? Want dan is $sql op magische wijze verandert tussen regels 7 en 8 in :)
Sebazzz schreef op dinsdag 12 februari 2008 @ 14:58:
En haal die tickjes ( ` ) weg. Dat is iets van phpmyadmin maar niet van SQL.
Backticks zijn juist van (My)SQL en ze (correct) gebruiken zou ik juist ten zeerste aanmoedigen - je bespaart er gezeur mee met reserved keywords en niet-standaard karakters in je tabelnamen :)

[ Voor 33% gewijzigd door FragFrog op 12-02-2008 15:33 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Nu online

Sebazzz

3dp

FragFrog schreef op dinsdag 12 februari 2008 @ 15:31:
[...]

Zat ik ook al naar te kijken, is deze code letterlijk de code die fout gaat? Want dan is $sql op magische wijze verandert tussen regels 7 en 8 in :)


[...]

Backticks zijn juist van (My)SQL en ze (correct) gebruiken zou ik juist ten zeerste aanmoedigen - je bespaart er gezeur mee met reserved keywords en niet-standaard karakters in je tabelnamen :)
Ja, van MySQL, maar als ik bijvoorbeeld voor een eigen systeem een andere database (PostgreSQL) bijvoorbeeld aan het systeem hang, werkt het niet meer (ik werk met eigen database drivers die de functies die ik aanroep vertaalt naar de functies van de bijbehorende soort database). Dus ik probeer keywords in tabel of veldnamen te vermijden en zo kan ik het zonder ticks. Ik kan natuurlijk ook in PHP die ticks verwijderen maar voor 5 queries kost dat weer zoveel milliseconden.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 21:01
Sebazzz schreef op dinsdag 12 februari 2008 @ 15:43:
[...]
Ja, van MySQL, maar als ik bijvoorbeeld voor een eigen systeem een andere database (PostgreSQL) bijvoorbeeld aan het systeem hang, werkt het niet meer (ik werk met eigen database drivers die de functies die ik aanroep vertaalt naar de functies van de bijbehorende soort database). Dus ik probeer keywords in tabel of veldnamen te vermijden en zo kan ik het zonder ticks. Ik kan natuurlijk ook in PHP die ticks verwijderen maar voor 5 queries kost dat weer zoveel milliseconden.
Als je databaseonafhankelijk wilt zijn moet je het schrijven van SQL queries sowieso voorkomen en een abstractielaagje gebruiken.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Als je je daadwerkelijk zorgen maakt over portability zijn ticks wel je minste zorg. Er zijn echt wel meer (en grotere) verschillen tussen de verschillende database servers, de enige manier om dan geen problemen te krijgen is door gebruik te maken van een goed ORM / DBAL systeem - en dan heb je ook geen prolemen meer met backticks :) Non-argument dus.

//edit
Wat hij zei ^^ :+

Sterker nog, juist als je portable wilt zijn zal je abstractielaag die ticks toevoegen om te voorkomen dat je met de reserved-keyword lijst van x verschillende databases rekening moet houden :)

[ Voor 23% gewijzigd door FragFrog op 12-02-2008 15:53 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, ik ben totaal achterlijk, mijn eigen websitestructuur werd me blijkbaar al te ingewikkeld.

Korte uitleg: die query werkte prima, echter het gedeelte dat ik in de voorbeeld code vervangen heb door "echo '300';" was eigenlijk een include van een andere pagina. In die pagina werd opnieuw gebruik gemaakt van de query, maar dan met de rauwe $info in de query. Die leverde dus de error op.

Een fijn probleem met de error reporting zorgde er dan ook nog eens voor dat ik zo snel niet het regelnummer aan de mysql error kon meegeven, aangezien die door andere instellingen ge-override werd. Ik nam dus maar aan dat het die query was.

Thanks iedereen!
Pagina: 1