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:

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!
Hmm... volgens mij zit er een regexfout in deze site, want ik zie de laatste berichten dubbel. ;-)
@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.
als die regex http code 503 had (iets met service unavailable)
dan was het een regex fout.
Service unavailable inderdaad, dus mijn laatste post had even een edit nodig.
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:
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:
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:
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...
Of dit natuurlijk. Vreselijke hack, maar het werkt wel:

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)
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.
Dat sowieso, maar snelheid ga je uit zo'n oplossing sowieso niet halen.

Reageren