MySQL regel OR

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Kees van Norde

Kees van Norde

24/10/2015 01:59:00
Quote Anchor link
Hoi,

Het is de bedoeling dat ik in de database laat zoeken of 1 van de 3 dingen gevonden wordt.
Bij al reeds bestaande moet namelijk geen nieuwe aangemaakt worden.
Ik gebruik daarvoor deze code:
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
16
        $item_exists_sql = "SELECT news_title, news_body, news_thumbnail FROM e107_news where news_title = '" . $titel . "' OR news_body = '" . $content . "' OR news_thumbnail = '" . $afbeelding . "'";
        $item_exists = mysql_query($item_exists_sql, $db);
        if(mysql_num_rows($item_exists)<1)

        {

            echo "<font color=green>Inserting new item..</font><br/>";
             $item_insert_sql = "INSERT INTO e107_news set news_title = '$titel', news_body = '$content', news_datestamp = '$item_date', news_author = '$userid', news_category = '$catid', news_thumbnail = '$afbeelding'";
             $insert_item = mysql_query($item_insert_sql, $db);
             $item_update_sql = "UPDATE e107_user set user_currentvisit = '$item_date' WHERE user_id = '$userid'";
             $update_item = mysql_query($item_update_sql, $db);
        }
        else
        {
            echo "<font color=blue>Not inserting existing item..</font><br/>";
        }

Echter werkt nu alleen de title controle (de eerste).
De andere 2 dingen worden genegeerd (ook al is het aanwezig in de database wordt er evengoed toegevoegt).
Iemand enig idee wat ik fout heb aan die regel?
Het gaat om deze regel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$item_exists_sql = "SELECT news_title, news_body, news_thumbnail FROM e107_news where news_title = '" . $titel . "' OR news_body = '" . $content . "' OR news_thumbnail = '" . $afbeelding . "'";


Gr. Kees.
 
PHP hulp

PHP hulp

19/12/2024 15:48:48
 
Ivo P

Ivo P

24/10/2015 08:47:38
Quote Anchor link
Als je in de tabel voor elk van die 3 kolommen aangeeft dat deze unique mort zijn? Dan krijg je er in elk geval geen dubbele in.

Toevoeging op 24/10/2015 08:51:52:

BTW
Jouw nieuwsberichten gaan nooit over foto's?
Of andere teksten waarin een ' zal staan?
Om nog maar te zwijgen over bewuste pogingen om je database om zeep te helpen

Http://wiki.pfz.nl/sqlinjectie
 
Kees van Norde

Kees van Norde

24/10/2015 10:58:23
Quote Anchor link
Het werkt omgekeerd zeg maar.
Het is de bedoeling dat als 1 van de 3 al bestaat inde database dat dan het complete bericht genegeerd wordt.
Als ik zou zeggen dat ze alle 3 al zouden moeten bestaan en 1 wijkt af maar de andere 2 zijn uniek zou het niet werken.
Het komt soms voor dat een titel wordt aangepast, maar dan ziet hij het op dit moment als een compleet nieuw nieuwsbericht. Dan wil ik dus dat hij die niet plaatst omdat 2 en 3 wel hetzelfde zijn en 1 dus niet.

Alleen werkt die code nu niet (hij doet alleen controle op 1).
Iemand enig idee hoe de code moet zijn om wel controle te krijgen op alle 3, en dat dan 1 van de 3 moet matchen?

De sqlinjectie ga ik even naar kijken, dat is nieuw voor mij.

Gr. Kees.
Gewijzigd op 24/10/2015 10:58:55 door Kees van Norde
 
Ivo P

Ivo P

24/10/2015 11:14:10
Quote Anchor link
3x een unique constraint op de losse kolommen en niet een met de combinatie van de kolommen

Toevoeging op 24/10/2015 11:16:37:

Andere benadering
Geef een bericht een id

Bij edits komt het id mee. Dus dan update.
Geen id dan insert

Wat als iemand een bericht bewerkt op

Toevoeging op 24/10/2015 11:17:09:

Titel inhoud en afbeelding
 
Kees van Norde

Kees van Norde

24/10/2015 12:55:21
Quote Anchor link
Ivo P op 24/10/2015 11:14:10:
3x een unique constraint op de losse kolommen en niet een met de combinatie van de kolommen

Begrijp ik hieruit dat het niet in 1 query kan?

En het wordt trouwens nooit alle 3 bewerkt het is echt of/of/of.

Toevoeging op 24/10/2015 13:31:00:

De code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$item_exists_sql = "SELECT news_title, news_body, news_thumbnail FROM e107_news where news_title = '" . $titel . "' OR news_body = '" . $content . "' OR news_thumbnail = '" . $afbeelding . "'";

Blijkt toch wel te werken, ik had in de test namelijk verschil in alle 3 vandaar dat het leek dat de 2de en 3de controle niet werkte.
Dit blijkt dus wel te werken.
Echter nu zit ik nog met 1 ding.
Hoe controleer je of er een gedeelte aanwezig is?
Ik bedoel zo ongeveer dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$item_exists_sql = "SELECT link FROM e107_news where link BEVAT '" . $link . "'";

Ik bedoel daar dus mee dat er veel meer in kan staan maar dat hij alleen maar kijkt of dat gedeelte wat ik opgeef aanwezig is.
Als voorbeeld dat hij controleerd of de tekst "hallo hoe is het" aanwezig is (ondanks dat er nog veel meer in staat).

Gr. Kees.
Gewijzigd op 24/10/2015 12:56:15 door Kees van Norde
 
- SanThe -

- SanThe -

24/10/2015 13:39:46
 
Kees van Norde

Kees van Norde

24/10/2015 14:00:57
Quote Anchor link
Het is gelukt, enorm bedankt!
 

24/10/2015 21:55:25
Quote Anchor link
@SanThe: 5.0 docs =]
 
Kees van Norde

Kees van Norde

26/10/2015 13:51:03
Quote Anchor link
Ik ben inmiddels weer verder en op een nieuw "probleem" uitgekomen.
Ik heb uiteraard eerst zelf gezocht omdat ik ook niet alles alleen maar simpel wil vragen (je leert het meeste van zelf zoeken immers).

Echter zoek ik niet goed of het bestaat gewoonweg niet.

Het gaat er nu om dat ik 2 dingen wil vergelijken en als er een URL in staat dat hij die negeert bij het vergelijken.
Zoiets als dit ongeveer:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$item_exists_sql = "SELECT body FROM e107_news where body BEVAT '" . $body . "' AND EXCLUDE een mogelijke URL";

Het kan dus een heel verhaal zijn en die moet hij op aanwezigheid controleren maar mocht er een URL in het verhaal staan moet hij dat niet vergelijken (alleen de URL niet en de rest wel).

Het effect moet dus zijn mochten de teksten hetzelfde zijn en alleen de URL anders moet hij dat niet als enkele post zien maar ook als dubbelpost.

Ik hoop dat het zo duidelijk is en of iemand weet of dit mogelijk is.
 
Thomas van den Heuvel

Thomas van den Heuvel

26/10/2015 14:34:50
Quote Anchor link
Kees van Norde op 24/10/2015 10:58:23:
Het komt soms voor dat een titel wordt aangepast, maar dan ziet hij het op dit moment als een compleet nieuw nieuwsbericht. Dan wil ik dus dat hij die niet plaatst omdat 2 en 3 wel hetzelfde zijn en 1 dus niet.

Misschien is dit een oversimplificatie, maar dit komt toch neer op het maken van aparte acties voor het bijwerken van een bericht? Het lijkt mij onhandig/onwenselijk om het toevoegen van een nieuw bericht en het wijzigen van een bestaand bericht op dezelfde manier te behandelen als daar op dit moment sprake van is.

Weet je zeker dat je in deze thread (oorspronkelijke + vervolgvragen) niet heel hard de verkeerde kant op aan het rennen bent?

Beschrijf naast wat er mis gaat ook wat je wilt, en wat er op dit moment (daadwerkelijk) gebeurt. Ik denk dat we je dan beter de goede kant op kunnen sturen.
Gewijzigd op 26/10/2015 14:35:59 door Thomas van den Heuvel
 
Kees van Norde

Kees van Norde

26/10/2015 18:40:41
Quote Anchor link
Thomas van den Heuvel op 26/10/2015 14:34:50:
Kees van Norde op 24/10/2015 10:58:23:
Het komt soms voor dat een titel wordt aangepast, maar dan ziet hij het op dit moment als een compleet nieuw nieuwsbericht. Dan wil ik dus dat hij die niet plaatst omdat 2 en 3 wel hetzelfde zijn en 1 dus niet.

Misschien is dit een oversimplificatie, maar dit komt toch neer op het maken van aparte acties voor het bijwerken van een bericht? Het lijkt mij onhandig/onwenselijk om het toevoegen van een nieuw bericht en het wijzigen van een bestaand bericht op dezelfde manier te behandelen als daar op dit moment sprake van is.

Je moet het zo zien, ik lees een rss feed uit en deze wil ik dan uitlezen en opslaan in de database (uiteraard met bronvermelding).
Om de paar minuten wordt er gecontroleerd of er een nieuw artikel is.
Ik controleer dan of een artikel al aanwezig is of niet.
Regelmatig worden artikelen aangepast en dan ziet hij het als een nieuwe post.
Daarom wil ik diverse controles hebben daarop.
De ene keer wordt de titel gewijzigt, de andere keer de content etc.

Ik heb de bronvermelding altijd als laatste regel in de content staan.
Omdat die url ook steeds veranderd ziet hij dus eigenlijk altijd dat de content niet indentiek is en ziet hij het daarom altijd als nieuwe post.

Daarom wil ik de controle zo maak dat hij de kolom content wel nakijkt, behalve het URL gedeelte, dus zeg maar iets in de trend van replace url to "" ofzo dat hij de url niet meetelt.
Ik hoop dat het zo een beetje duidelijk is :)
Thomas van den Heuvel op 26/10/2015 14:34:50:
Weet je zeker dat je in deze thread (oorspronkelijke + vervolgvragen) niet heel hard de verkeerde kant op aan het rennen bent?

Beschrijf naast wat er mis gaat ook wat je wilt, en wat er op dit moment (daadwerkelijk) gebeurt. Ik denk dat we je dan beter de goede kant op kunnen sturen.

Ik weet zeker dat ik hard aan het rennen ben (met dank aan jullie snelle en goede antwoorden) maar gelukkig wel de goede kant op.

Voor wat ik wil en wat er gebeurt zie hierboven :)
Gewijzigd op 26/10/2015 18:54:53 door Kees van Norde
 
Thomas van den Heuvel

Thomas van den Heuvel

26/10/2015 19:38:40
Quote Anchor link
Uhm, links in RSS feeds zouden permalinks moeten zijn bij mijn weten :/.

Als je dan toch de feed binnenhaalt zou je ook kunnen overwegen om alle links van die RSS-bron weg te gooien, omdat je er blijkbaar niet (meer) vanuit kunt gaan dat de desbetreffende artikelen nog bestaan.

Dit klinkt als een update-probleem. In plaats van met veel moeite proberen te bepalen of een artikel nog bestaat (wat trouwens mislukt als alle data verandert) kun je ze beter wegggooien en opnieuw toevoegen, dat lijkt mij een stuk simpeler en minder foutgevoelig.
 
Kees van Norde

Kees van Norde

26/10/2015 20:16:03
Quote Anchor link
Het punt is dat dat geen optie is omdat op mijn eigen site ook reacties gegeven kunnen worden op de artikelen.
Daarom moet het via bovenstaande manier met het risico dat als alles een keer veranderd wordt het dan dubbel komt te staan, maar dat is dan verder niet te voorkomen en komt maar zelden voor.

Ik laat wel de aangepaste de oude overschrijven maar dan blijven de reacties behouden.
Echter moet ik nu alleen nog voor elkaar zien te krijgen dat hij het gedeelte met de URL (in mijn database dus) niet meeneemt in de vergelijking omdat het zo altijd anders is.
Uiteraard vervang ik daarna de URL naar de nieuwe, maar eerst moet die check werken (als dat al mogelijk is).
 
Pg Vincent

Pg Vincent

31/10/2015 12:23:29
Quote Anchor link
In een RSS feed hoort elk item een permalink te hebben, dus kijk dat nog even na.

Het probleem met zoeken naar inhoud is dat het ontiegelijk traag is, LIKE is zo'n beetje het slechtste wat je kunt doen (tenzij je trigram indexes kunt gebruiken).

Wat je sowieso kunt doen is md5 hashes opslaan voor de drie onderdelen. De kans dat twee items op dezelfde publicatiedatum dezelfde md5 hebben voor de titel is nul, niemand maakt twee artikelen met dezelfde titel op dezelfde dag. Dus, als je een nieuw item binnenkrijgt kun je in de database zoeken naar de publicatiedatum en dan per artikel kijken of er hashes overeenkomen. Dat faalt alleen als het hele artikel wordt aangepast en dan kun je altijd nog aan de gang met levenshtein om te zien hoeveel verschillen er zijn; degene met de minste verschillen zal wel het juiste zijn.
 
Kees van Norde

Kees van Norde

31/10/2015 12:45:31
Quote Anchor link
Ik doe het nu via de manier LIKE idd en dat werkt goed!
Op dit moment is het niet traag en het is eigenlijk maar voor een hobby site dus ik hou het wel even in de gaten.
Ik weet niet of het onder reclame maken valt (dat is echt niet mijn bedoeling) maar als jullie willen zien hoe het geworden is kun je dat zien op www.effebuurten.nl

Bedankt nogmaals allemaal voor de hulp!

Gr. Kees.
Gewijzigd op 31/10/2015 12:46:14 door Kees van Norde
 
Ivo P

Ivo P

02/11/2015 09:20:40
Quote Anchor link
"Op dit moment is het niet traag"

Dat is vaak het geval met een ontwikkel-omgeving met daarin hooguit 10 nieuwsberichten of webshop-artikelen. Maar als het aantal oploopt, komt er een moment dat het ineens wel traag is.

En dan wordt het uitstel, want valt nog wel mee, nog meer uitstel want even geen tijd, en afstel want code is toch al best oud en waar stond het ook weer.

Zorg bij voorkeur ervoor dat het direct goed is. Het kan geen kwaad om met 10 artikelen 5 ms winst te halen, maar met 10.000 artikelen in je database wil je wel graag die 90 seconden winst hebben van 91 naar 1 seconde.

En stel dat je site inderdaad voor hobby gebruik is en je nooit boven de 30 berichten komt: het zou toch leuk zijn als je de scripts later hergebruikt voor een andere situatie waarin wel veel data gebruikt wordt het niet direct omvalt.
 



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.