mysql database zoeken naar \

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pink A

Pink A

12/09/2018 16:53:40
Quote Anchor link
In de database zijn namen gekomen met \ erbij, dus bijvoorbeeld "Erik\\\\".
Nu wil ik deze namen opzoeken en verwijderen, maar hoe zoek je op \ ?
Simpel SELECT * FROM `namen` WHERE naam LIKE '%\%' is werkt niet met het teken \.
 
PHP hulp

PHP hulp

19/04/2024 19:19:48
 
Thomas van den Heuvel

Thomas van den Heuvel

12/09/2018 17:00:56
Quote Anchor link
Ik denk dat hier een aantal andere problemen spelen.

Waarom zou dit in eerste instantie een probleem vormen?

En dan is het de vraag waar je dit probleem oplost.

Als iemand zich registreert, zou je regels kunnen opstellen welke karakters iemand mag gebruiken voor zijn/haar (nick)naam in de vorm van een whitelist.

Vervolgens zou dit wellicht voor problemen kunnen vormen bij het uitvoeren van queries, maar als je alles op de juiste wijze escaped zou dit niet voor problemen hoeven te zorgen.

Dus ook al los je dit "probleem" (het aanwezig zijn van underscores backslashes in gebruikersnamen) op dan is waarschijnlijk het achterliggende probleem (potentieel onveilige queries) daarmee nog niet opgelost.

WHERE naam LIKE '%\\%'
werkt waarschijnlijk beter, je moet namelijk de speciale betekenis van de backslash zelf (\) escapen.
Gewijzigd op 12/09/2018 17:02:32 door Thomas van den Heuvel
 
Bart V B

Bart V B

12/09/2018 17:02:38
Quote Anchor link
Waarom zijn er überhaupt backslashes ingekomen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM `namen` WHERE naam LIKE '%\\%';
 
Pink A

Pink A

12/09/2018 17:09:59
Quote Anchor link
Ik weet het, nu is de code beter zodat het niet meer voorkomt, maar zit met oude database.
SELECT * FROM `namen` WHERE naam LIKE '%\\%'; werkt helaas niet
 
Adoptive Solution

Adoptive Solution

12/09/2018 17:36:20
Quote Anchor link
In plaats van 2 gebruik er 4

LIKE '%\\\\%';

Halverwege deze pagina :

https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html
 
Thomas van den Heuvel

Thomas van den Heuvel

13/09/2018 00:18:50
Quote Anchor link
\\ in SQL
\\\\ in PHP

:p

Hangt er vanaf in welke context je werkt.
 
Obelix Idefix

Obelix Idefix

13/09/2018 11:07:33
Quote Anchor link
Pink A op 12/09/2018 17:09:59:
Ik weet het, nu is de code beter zodat het niet meer voorkomt, maar zit met oude database.

Ik zou dan de mogelijkheid om de database te benaderen korte tijd uitschakelen / website om onderhoudsredenen niet benaderbaar maken.

De database / tabel die het betreft exporteren. In veel programma's (Excel, Word, Notepad, ......) kun je vrij eenvoudig zoek / vervang toepassen.
Daarna gegevens inlezen.
 
Pink A

Pink A

13/09/2018 13:57:08
Quote Anchor link
Obelix en Idefix, dank je, dat is een heel goed idee! Zo kwam ik erachter dat het maar om 8 records ging van de 21.000. Super!
Ik heb deze pagina ook gelezen met bruikbare info https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html, maar helaas werkt het toch niet zo in mijn PhpMyAdmin.
Dank voor al jullie suggesties en meedenken!

Toevoeging op 13/09/2018 13:57:27:

solved

Toevoeging op 13/09/2018 14:07:56:

Misschien nog een goede toevoeging. Meestal komt de \ alleen in een database voor als er een ' is gebruikt. Dus zoeken op %'% helpt je om de \ te vinden.
 
B a s
Beheerder

B a s

13/09/2018 14:16:20
Quote Anchor link
Ter info, mocht je ooit weer een dergelijk probleem hebben dan kun je alle namen in één keer aanpassen met:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
UPDATE tabelnaam SET naam = REPLACE(naam, '\', '');
 
Thomas van den Heuvel

Thomas van den Heuvel

13/09/2018 16:01:19
Quote Anchor link
Mja, of je checkt alle invoer voordat je het de database inkiepert.

Alle oplossingen hierboven zijn symptoombestrijding van een achterliggend probleem dat elders opgelost moet worden.
 
- Ariën  -
Beheerder

- Ariën -

13/09/2018 16:20:27
Quote Anchor link
Thomas van den Heuvel op 13/09/2018 16:01:19:
Mja, of je checkt alle invoer voordat je het de database inkiepert.

Ja, maar je hebt vaak ook legacy-code, die misschien ervoor heeft gezorgd heeft dat elke apostrof met stripslashes in de database kwam.

Ik hoop dat diegene inmiddels weten dan dat dit al lang niet meer kan. Maar vroeger bestond er in MySQL nog geen escape-functie. Maar dan praat ik ook echt over bijna 15 jaar geleden. Maar met hele oude datasets, kan dit zeker gebeuren.

Dit kan je vaak moeilijk terugdraaien. Misschien bij een veld met namen of iets dergelijks,in ieder geval waar je normaal geen apostrof verwacht. In een veld waar HTML-code in staat, kan het filteren juist desastreus zijn.
Gewijzigd op 13/09/2018 16:20:51 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

13/09/2018 20:26:20
Quote Anchor link
Euh? Ik had het over validatie/filtering, niet over escaping. Dit zijn twee verschillende dingen.

mysql_real_escape_string() bestaat sinds PHP versie 4(.3.0) en add/stripslashes waren nooit bedoeld voor escaping.

Apostrofs in de database kan prima, mits je alle data maar op eenzelfde consequente manier blijft behandelen en overal op de juiste manier escapet.
Gewijzigd op 13/09/2018 20:26:57 door Thomas van den Heuvel
 
Ozzie PHP

Ozzie PHP

13/09/2018 23:42:38
Quote Anchor link
Thomas van den Heuvel op 13/09/2018 16:01:19:
Mja, of je checkt alle invoer voordat je het de database inkiepert.

Idealiter wel, maar als je kont onder de stront zit, zul je 'm toch een keer moeten afvegen.


(Wat een leuke zelfbedachte uitspraak ... die houd ik erin.)
 
Thomas van den Heuvel

Thomas van den Heuvel

14/09/2018 02:25:27
Quote Anchor link
Dat is waarschijnlijk het verschil tussen investeren in de poep efficienter schoonmaken of de bibs in eerste instantie schoonhouden, tis maar net wat je hobby is :].

EDIT: en/of inzetten op zindelijkheidstraining.
Gewijzigd op 14/09/2018 02:26:52 door Thomas van den Heuvel
 
Ozzie PHP

Ozzie PHP

14/09/2018 07:34:01
Quote Anchor link
Hahaha ... lol ... couldn't agree more.

Maar ja, als je nog een baby bent (in het programmeren) dan is dat misschien nog wat lastig ;-)

Anders gezegd, die rommel is ooit in de database terechtgekomen als gevolg van het handelen van iemand die op dat moment nog niet zo bekwaam was. Leren lopen gaat ook niet in 1 dag. En al er dus destijds rommel is gemaakt, zul je die een keer moeten opruimen ... en ervoor zorgen dat het niet meer kan gebeuren uiteraard ;)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.