Kijken of nummer voorkomt

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Rob -

- Rob -

20/02/2017 20:00:17
Quote Anchor link
Hallo!

Ik had een systeem gemaakt, waarmee ik kon kijken of jouw ID voorkwam in een colom van een row, bijvoorbeeld of het ID 1 voorkomt in: 23, 1
Dit werkt. Maar nu zit ik met het probleem:
Als ik kijk of het ID 1 overeen komt met bijvoorbeeld: 21, 55, 3
Dan geeft mijn systeem aan: A, 1 komt erin voor dus laten we melding zien. Maar dit is NIET de bedoeling. Alleen als jouw ID los van andere nummers staat. Mijn code is momenteel dit om het te controleren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
if(preg_match("$gelezen", $id)) {
 // REST van de code
}

$gelezen is in dit geval 221 en $id is 1
Hoe zou ik dit kunnen oplossen? En alsjeblieft geen comments dat ik een aparte tabel moet maken omdat ik dit makkelijker vind, dus geen comments hierover pls ;-)


Alvast hartstikke bedankt!
 
PHP hulp

PHP hulp

21/11/2024 22:51:53
 
Ben van Velzen

Ben van Velzen

20/02/2017 20:05:33
Quote Anchor link
>> Hoe zou ik dit kunnen oplossen? En alsjeblieft geen comments dat ik een aparte tabel moet maken omdat ik dit makkelijker vind, dus geen comments hierover pls ;-)

Dat blijkt dat je het makkelijker vindt. Dan vind je het vast geen probleem om het zelf op te lossen, toch?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

20/02/2017 23:49:50
Quote Anchor link
zo te zien en volgens mij...

Pas je een vergelijking toe op een string. Je zult getallen moeten vergelijken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$array
= explode(',', '21,55,3');
if(in_array(1, $array))
{

    echo 'gevonden!';
}

?>


Verder ga je later hard huilen als je je eigen code nog eens terugleest...
Gewijzigd op 21/02/2017 02:07:09 door Frank Nietbelangrijk
 
- Ariën  -
Beheerder

- Ariën -

20/02/2017 23:54:24
Quote Anchor link
Misschien is het toch wat raadzamer om onze tips eens op te volgen, of met goede redenen te komen waarom je juist alles komma gescheiden wilt opslaan.

En dat het 'makkelijker is', dat is geen argument, want een losse tabel gebruiken is juist nog makkelijker.
Stel.... Je wilt er iemand uithalen die halverwege de lijst staat, hoe ga je dat dan doen?

Normaal is het een DELETE-query, maar nu moet je weer extra regels schrijven.
Gewijzigd op 20/02/2017 23:54:40 door - Ariën -
 
- Rob -

- Rob -

21/02/2017 07:57:35
Quote Anchor link
Mijn broer heeft een manier gevonden ;-) Met een JSON array, die kan ik decode en encode hiermee kan ik bv. jouw ID uit de array halen en gelijkertijd checken of jouw id in die array komt, thnx ;-) Script zal ik vanmiddag wel laten zien ;-)

Toevoeging op 21/02/2017 07:58:57:

En het lag niet aan die code ;S maar aan mijn query, waar ik net achter kwam
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql = $connection->query("SELECT * FROM `paneel_meldingen` WHERE `deelnemers` LIKE '%$id%' AND `gelezen`='0' ORDER BY `id` DESC");
Gewijzigd op 21/02/2017 08:02:25 door - Rob -
 
- Ariën  -
Beheerder

- Ariën -

21/02/2017 09:24:05
Quote Anchor link
Maar toch blijf ik benieuwd waarom je zo omslachtig doet.
 
Ivo P

Ivo P

21/02/2017 19:37:58
Quote Anchor link
LIKE '%$id%'

ja want als je op 1 zoekt en in de string staat '1111111, 2, 1' dan haalt hem er er terecht uit

als als alle enen ontbreken niet.....

zoek dan op LIKE '% $id,%'

maar helaas werkt dat weer niet als het laatste getal gezocht wordt....
 
Ben van Velzen

Ben van Velzen

21/02/2017 21:34:44
Quote Anchor link
FIND_IN_SET is natuurlijk een optie, maar wat je ook doet, het is langzamer dan gewoon fatsoenlijk normaliseren. Dan hoef je ook geen gekke kunstgrepen in je code uit te halen, maar kun je gewoon nette queries schrijven.
 
Willem vp

Willem vp

22/02/2017 09:38:01
Quote Anchor link
Ivo P op 21/02/2017 19:37:58:
zoek dan op LIKE '% $id,%'

maar helaas werkt dat weer niet als het laatste getal gezocht wordt....

Je vergeet de spatie die vóór $id moet staan. Die is er dan weer niet bij het eerste getal. ;-)

Met een reguliere expressie zou je in MySQL het probleem met de komma aan het eind nog kunnen verhelpen:

REGEXP ' $id(,|$)'

Helaas werkt dit truukje dan weer niet met de spatie ervoor. Met een regex in PHP zou dat dan weer wel kunnen:

/(^|\s)$id(,|$)/

Maar je maakt de spatie dan weer significant. Op zich zou er niets op tegen moeten zijn als er na een komma meteen een getal komt:

/(^|\s|,)$id(,|$)/

maar het is wellicht eenvoudiger om dan op word boundaries te matchen:

/\b$id\b/

En toch ga ook ik voor een tabel. Veel sneller. ;-)
 
Ivo P

Ivo P

22/02/2017 09:51:12
Quote Anchor link
work-around: geen spaties opnemen, en altijd afsluiten met een komma. Ook als er maar 1 waarde in staat en dus ook achter het laatste getal.

En dan gaan we door naar de vragen
"hoe delete ik id=35 uit de lijst?"
"waarom wordt mijn site zo traag?"

en tenslotte "help, door een regex fout loopt er van alles in de soep en zien gebruikers elkaars berichten"

Fijn, zo zelf het wiel uitvinden en volharden dat een ovalen 6-hoek ook best wel een beetje wil rollen.

Toevoeging op 22/02/2017 10:04:20:

work-around: geen spaties opnemen, en altijd afsluiten met een komma. Ook als er maar 1 waarde in staat en dus ook achter het laatste getal.

En dan gaan we door naar de vragen
"hoe delete ik id=35 uit de lijst?"
"waarom wordt mijn site zo traag?"

en tenslotte "help, door een regex fout loopt er van alles in de soep en zien gebruikers elkaars berichten"

Fijn, zo zelf het wiel uitvinden en volharden dat een ovalen 6-hoek ook best wel een beetje wil rollen.
 
Ben van Velzen

Ben van Velzen

22/02/2017 10:04:20
Quote Anchor link
>> Fijn, zo zelf het wiel uitvinden en volharden dat een ovalen 6-hoek ook best wel een beetje wil rollen.
Dat zeg je nu wel, maar heb je die tests gezien met vierkante wielen op een nogal bijzondere ondergrond?
Klinkt natuurlijk leuk als in "ja het kan werken" maar dan moet je al een erg bijzondere situatie hebben, die hier niet aanwezig is uiteraard.
Gewijzigd op 22/02/2017 10:10:34 door Ben van Velzen
 
Willem vp

Willem vp

22/02/2017 10:13:39
Quote Anchor link
Hmm... volgens mij zit er een regexfout in deze site, want ik zie de laatste berichten dubbel. ;-)
 
- Ariën  -
Beheerder

- Ariën -

22/02/2017 10:21:09
Quote Anchor link
@Willem vp: Nee, het lijkt eerder op een dubbele POST door mogelijk een onderbreking in een netwerk. Kan een WiFi-verbinding zijn, of een hick-up bij de server van deze site.

Eigenlijk moeten we dat ondervangen.
 
Ivo P

Ivo P

22/02/2017 10:21:23
Quote Anchor link
als die regex http code 503 had (iets met service unavailable)
dan was het een regex fout.
 
Ben van Velzen

Ben van Velzen

22/02/2017 10:37:13
Quote Anchor link
Service unavailable inderdaad, dus mijn laatste post had even een edit nodig.
 
Thomas van den Heuvel

Thomas van den Heuvel

22/02/2017 15:33:46
Quote Anchor link
Dit alles lijkt mij voortborduren op een slecht ontwerp, maar als je dit echt, ondanks alle waarschuwingen, zo wilt doen zou je iets kunnen doen met LOCATE() om een soort van in_array() functionaliteit na te bootsen.

Wat je doet is het volgende:
- plak een komma voor en achter de needle (de gezochte waarde)
- plak een komma voor en achter de haystack (de komma-gescheiden set waarin je zoekt)

Dit doe je met CONCAT().

Gegeven de set 21,55,3 (let op, géén extra spaties tussen de waarden / na de komma's!), je kunt dan als volgt zoeken op de waarde 3:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
mysql> SELECT LOCATE(CONCAT(',', '3', ','), CONCAT(',', '21,55,3', ',')) > 0 AS found;
+-------+
| found |
+-------+
|     1 |
+-------+
1 row in set (0.01 sec)


12 komt hier niet in voor:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
mysql> SELECT LOCATE(CONCAT(',', '12', ','), CONCAT(',', '21,55,3', ',')) > 0 AS found;
+-------+
| found |
+-------+
|     0 |
+-------+
1 row in set (0.00 sec)


En 55 weer wel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
mysql> SELECT LOCATE(CONCAT(',', '55', ','), CONCAT(',', '21,55,3', ',')) > 0 AS found;
+-------+
| found |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

Afhankelijk van hoe (en hoe vaak) je dit gebruikt is dit mogelijk niet de meest efficiënte oplossing...
 
Ben van Velzen

Ben van Velzen

22/02/2017 16:48:31
Quote Anchor link
Of dit natuurlijk. Vreselijke hack, maar het werkt wel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MariaDB [(none)]> SELECT FIND_IN_SET('1', '1,2,3,4');
+-----------------------------+
| FIND_IN_SET('1', '1,2,3,4') |
+-----------------------------+
|                           1 |
+-----------------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> SELECT FIND_IN_SET('5', '1,2,3,4');
+-----------------------------+
| FIND_IN_SET('5', '1,2,3,4') |
+-----------------------------+
|                           0 |
+-----------------------------+
1 row in set (0.00 sec)
Gewijzigd op 22/02/2017 16:49:36 door Ben van Velzen
 
Ivo P

Ivo P

22/02/2017 17:48:38
Quote Anchor link
1 row in set (0.00 sec)

En dan ook nog eens kijken wat tussen die ( ) komt te staan als je een paar duizend rows met willekeurige getallen reeksen hebt.

Zo maar een vermoeden dat die tijd op gaat lopen.
 
Ben van Velzen

Ben van Velzen

22/02/2017 18:37:00
Quote Anchor link
Dat sowieso, maar snelheid ga je uit zo'n oplossing sowieso niet halen.
 



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.