Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

MySQL: speciale tekens selecteren

Pagina: 1
Acties:
  • 290 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo forum-genoten,

Ik zit met een mySQL probleempje waar ik niet aan uit kom.

Ik heb een tabel met daarin het veld 'plaatsnaam' (collatie latin1_swedish_ci). Hierin staat de plaatsnaam 'Meslin-l'Evêque' opgeslagen.

Als ik vervolgens in phpMyAdmin de volgende query uitvoer:
SQL:
1
SELECT plaatsnaam FROM plaats WHERE plaatsnaam LIKE 'Meslin-l\'Evê%'; 

krijg ik netjes de plaats te zien.

Echter, als ik de woonplaats uit een $_GET haal krijg ik geen resultaten terug. De bijbehorende phpcode:

PHP:
1
2
3
4
5
6
<?php 
$woonplaats = urldecode(htmlentities(mysql_real_escape_string($_GET['woonplaats']))); 
$sql        = "SELECT plaatsnaam FROM plaats WHERE plaatsnaam LIKE '".$woonplaats."%'"; 

//query uitvoeren en weergeven met een while loopje, spreekt verder voor zich 
?> 


Wie kan mij opweg helpen?
Alvast bedankt! _/-\o_

[ Voor 2% gewijzigd door RobIII op 07-11-2007 19:55 . Reden: code tags toegevoegd ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:44

crisp

Devver

Pixelated

urldecode - waarom?
htmlentities - waarom?

Intentionally left blank


Verwijderd

Topicstarter
Htmlentities omdat de variable wordt opgeslagen in de database en ik hier geen troep in wil.
Urldecode omdat de gegevens via de url worden verzonden (ajax request).

Ik gebruik hier het volgende javascript voor:
JavaScript:
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
function url_encode(string) 
{ 
    var string; 
    var safechars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/-_.&?="; 
    var hex = "0123456789ABCDEF"; 
    var encoded_string = ""; 
    
    for(var i = 0; i < string.length; i++) 
    { 
        var character = string.charAt(i); 
        
        if(character == " ") 
        { 
            encoded_string += "+"; 
        } 
        else if(safechars.indexOf(character) != -1) 
        { 
            encoded_string += character; 
        } 
        else 
        { 
            var hexchar = character.charCodeAt(0); 
            
            if(hexchar > 255) 
            { 
                encoded_string += "+"; 
            } 
            else 
            { 
                encoded_string += "%"; 
                encoded_string += hex.charAt((hexchar >> 4) & 0xF); 
                encoded_string += hex.charAt(hexchar & 0xF); 
            } 
        } 
    } 
    return encoded_string; 
}

[ Voor 0% gewijzigd door RobIII op 07-11-2007 19:57 . Reden: code tags toegevoegd ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26

TeeDee

CQB 241

Verwijderd schreef op woensdag 07 november 2007 @ 15:56:
Htmlentities omdat de variable wordt opgeslagen in de database en ik hier geen troep in wil.
Je hebt HtmlEntities gebruikt, en je hebt nu dus troep in je DB.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:44

crisp

Devver

Pixelated

Je requestparameters die je in $_GET terugvind zijn al url_decoded. Overigens heeft javascript een eigen method voor url-encoding:
JavaScript:
1
var url = 'foo.php?bar=' + encodeURIComponent(bar);
tevens een hint naar onze mooie [code]-tags ;)

htmlentities/htmlspecialchars (de laatste is meestal voldoende) is een encoding die je gebruikt voor output naar HTML, niet om SQL-input te escapen. Slechts in speciale gevallen kan het zinvol zijn je data al HTML-encoded in de DB op te slaan, maar doorgaans kan je encoding beter doen op het moment dat je ook daadwerkelijk data output.

Intentionally left blank


Verwijderd

Topicstarter
De code tags zal ik voortaan gebruiken ja, ik kon ze al niet vinden :P.

Bedankt voor je tips, ik heb ze in mijn script verwerkt. Echter lost dit het probleem niet op, enig idee hoe dat komt?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waar hoort mijn topic?
SEA >> PRG

(En zie idd code tags ;) )
Verwijderd schreef op woensdag 07 november 2007 @ 18:33:
Bedankt voor je tips, ik heb ze in mijn script verwerkt. Echter lost dit het probleem niet op, enig idee hoe dat komt?
Heb je al gedebugged? (Debuggen: Hoe doe ik dat?); Krijg je überhaupt gegevens uit je DB, of krijg je niet eens iets terug (na je wijziging(en))?

[ Voor 84% gewijzigd door RobIII op 07-11-2007 19:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • djiwie
  • Registratie: Februari 2002
  • Laatst online: 26-11 15:25

djiwie

Wie?

Wat is de SQL-query die opgebouwd wordt? (de inhoud van $sql dus?)
En wellicht kun je latin1_general_ci gebruiken in plaats van latin1_swedish_ci als collatie, ik neem aan dat Meslin-l'Evêque niet een Zweedse naam is ;)

Verwijderd

Topicstarter
Die SQL-syntax is correct, de query wordt naar behoren uitgevoerd (Amsterdam werkt bijvoorbeeld prima), echter kan hij het record niet vinden als je speciale tekens (ë, é, ä, ect.) gebruikt:

Plaatsnaam in de database: Meslin-l'Evêque

Sql query:
SELECT plaatsnaam FROM plaats WHERE plaatsnaam LIKE 'Meslin-l\'Evê%';
--> 0 results

SELECT plaatsnaam FROM plaats WHERE plaatsnaam LIKE 'Meslin-l\'Eve%';
--> 1 result

Let op het opmerkelijke verschil van de laatste letter in de query, heel onlogisch dat hij de plaats met een normale 'e' wel vind.

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:44

crisp

Devver

Pixelated

Het lijkt er op dat je ergens een mismatch hebt in character-encoding. Zowel je database, connectie naar de database en de pagina's die je serveert moeten dezelfde character-encoding hebben.

Intentionally left blank


Verwijderd

Topicstarter
Ik ga de character-encoding nazoeken, zodra ik meer weet zal ik het hier posten (waarschijnlijk morgen pas).

Verwijderd

PHP:
1
2
3
4
5
6
<?php
//hier maak je je database connectie
mysql_query('SET CHARACTER SET "latin1"');

//hier je query
?>


Wat levert dat op?

Je zet namelijk je verbindings karakterset op latin1 (iso-8859-1)

[ Voor 4% gewijzigd door Verwijderd op 08-11-2007 14:00 ]


  • Blackbird-ce
  • Registratie: September 2005
  • Laatst online: 06-10 23:35
was het niet zo dat MySQL zélf al rekening houdt met verschillen tussen e, é, è, ê, etc?
Ik heb in het verleden voor een opdracht snel een dergelijk testje gedaan om te kijken of resultaten gevonden zouden worden als een gebruiker wel/niet gebruik zou maken van vreemde tekens. Bij ons gaf MySQL in alle gevallen het gewenste resultaat.

Verwijderd

Topicstarter
De karakterset aanpassen maakte geen verschil. Na veel proberen ben ik erachter gekomen dat htmlentities de boosdoener is, laat deze weg en het geheel werkt wél naar behoren :-).

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26

TeeDee

CQB 241

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1