Ik neem niet aan dat de data al gevalideerd is. En in mijn check weet ik dat de data een integer is (in de regexp accepteerd ie ook doubles en floaters). Maar ik weet dat de data correct is en daarna alles met mijn data doen. Het is gechecked, alles wat ik daarna doe is op mijn conto en heeft dan niks meer te maken met users die SQL injection willen doen.quote:Op vrijdag 16 februari 2007 18:52 schreef Swetsenegger het volgende:
Je gaat er maar vanuit dat je daadwerkelijk de userinput controleert. Zowel mysql als php zijn zo inconsistent als de tyfus met strings en integers, dus is 1 fuck-up voldoende om sql injection toe te staan.
Nee, ik begrijp je redenatie achter de safety maatregel. Ik snap alleen niet waarom je dit met een integer doet. Het is namelijk geen string. Dat is mijn enige commentaar.quote:Ik begrijp jouw weerstand niet tegen een extra safety maatregel als mysql_real_escape_string. Zeker niet in toepassingen zoals de meeste hier maken waar performance geen groot issue is. Want eigenlijk is dat de enige reden die ik kan bedenken voor je aversie tegen een failback systeem![]()
Totdat er een keer niet gechecked isquote:Op vrijdag 16 februari 2007 22:38 schreef slakkie het volgende:
[..]
Ik neem niet aan dat de data al gevalideerd is. En in mijn check weet ik dat de data een integer is (in de regexp accepteerd ie ook doubles en floaters). Maar ik weet dat de data correct is en daarna alles met mijn data doen. Het is gechecked, alles wat ik daarna doe is op mijn conto en heeft dan niks meer te maken met users die SQL injection willen doen.
Tja, volgens php is $a="1" ook een integer, of probeert het in ieder geval als integer te parsen.quote:Nee, ik begrijp je redenatie achter de safety maatregel. Ik snap alleen niet waarom je dit met een integer doet. Het is namelijk geen string. Dat is mijn enige commentaar.
Ja, als het niet gechecked wordt is er toch ergens een grove fout gemaakt - die er uitgehaald had moeten worden in de unit test of end-to-end test.quote:Op vrijdag 16 februari 2007 22:41 schreef Swetsenegger het volgende:
We zitten al op 1 lijn. Je moet user input controleren. Maar het wordt wel eens vergeten he, zeker in work in progress. Dus wat is er erg om in elke query een mysql_real_escape_string op te nemen om slips op te vangen? Dat is alles wat ik zeg.quote:Op vrijdag 16 februari 2007 22:58 schreef slakkie het volgende:
[..]
Ja, als het niet gechecked wordt is er toch ergens een grove fout gemaakt - die er uitgehaald had moeten worden in de unit test of end-to-end test.
$a = "1"; $a = intval($a); zou dit volgens mij moeten oplossen, daar heb je geen extra functie voor nodig.
jij hebt een andere mening hierover dan ik. Laten we het daarbij houden. Heb zo'n idee dat we niet dichter bijelkaar gaan komen.
Ja, php is loosely typed. Dus na $a = "1"; $b = 2 + $a; is $b == 3. En na $a = "1"; $b = 2 . $a; is $b == "21";quote:Op vrijdag 16 februari 2007 22:41 schreef Swetsenegger het volgende:
Tja, volgens php is $a="1" ook een integer, of probeert het in ieder geval als integer te parsen.
Hier zijn we het allemaal mee eens denk ikquote:Op vrijdag 16 februari 2007 23:15 schreef JeRa het volgende:
Ik ben persoonlijk meer fan van een doodsbedreiging en een flinke scheldpartijquote:Op vrijdag 16 februari 2007 23:15 schreef JeRa het volgende:
+ Vang verkeerde user input op met een nette waarschuwing.
"Denk je GODVERDOMME dat ik een mongool ben ofzo met je kut injection!!!!"quote:Op vrijdag 16 februari 2007 23:28 schreef Tijn het volgende:
[..]
Ik ben persoonlijk meer fan van een doodsbedreiging en een flinke scheldpartij
quote:Op vrijdag 16 februari 2007 23:30 schreef Swetsenegger het volgende:
[..]
"Denk je GODVERDOMME dat ik een mongool ben ofzo met je kut injection!!!!"
INSERT ... ON DUPLICATE KEY UPDATE met een primary key?quote:Op zaterdag 17 februari 2007 18:30 schreef wonderer het volgende:
Is er een makkelijker manier om te controleren of een bepaald record al bestaat dan met een SELECT en daarna een if(mysql_num_rows($result)!=0)(UPDATE) else (INSERT)?
Na een Update of een Insert kun je met mysql_affected_rows() opvragen hoeveel rijen er zijn aangepast. Als dat 0 is dan kun je met de andere functie in de herkansingquote:Op zaterdag 17 februari 2007 18:30 schreef wonderer het volgende:
Is er een makkelijker manier om te controleren of een bepaald record al bestaat dan met een SELECT en daarna een if(mysql_num_rows($result)!=0)(UPDATE) else (INSERT)?
Die is nog beterquote:Op zaterdag 17 februari 2007 18:48 schreef JeRa het volgende:
[..]
INSERT ... ON DUPLICATE KEY UPDATE met een primary key?
Mijn server draait 4.1.12 dus dat moet kunnen. Kun je in een tabel meer keys hebben? Ik heb nu de kolom "ID" als key maar ik wil zoeken op een ander veld.quote:Op zaterdag 17 februari 2007 18:51 schreef Light het volgende:
[..]
Die is nog beterMaar pas beschikbaar vanaf MySQL 4.1.
Dat kan, de ON DUPLICATE KEY clausule is geldig wanneer er een PRIMARY of UNIQUE key overtreden wordt, dus bij een nieuwe PK maar een al bestaande UNIQUE key gaat dat gewoon werkenquote:Op zaterdag 17 februari 2007 18:57 schreef wonderer het volgende:
[..]
Mijn server draait 4.1.12 dus dat moet kunnen. Kun je in een tabel meer keys hebben? Ik heb nu de kolom "ID" als key maar ik wil zoeken op een ander veld.
Je weet dat je een UNIQUE constraint ook op meerdere velden tegelijk kunt plaatsen? Dus, in jouw geval, een combinatie van karakter en verhaal?quote:Op zaterdag 17 februari 2007 19:06 schreef wonderer het volgende:
Oh, bah, ik bedenk me net dat het een veel op veel relatie is... (karakters in verhalen. Een karakter kan in meerdere verhalen zitten en een verhaal kan meerdere karakters hebben). Dus UNIQUE gaat niet werken. Het moet de combinatie van karakter en verhaal zijn...
Hm, nou ja, die on duplicate kan ik nog wel voor andere dingen gebruiken. Dus helemaal nutteloos was het niet
Een key kan best op meer dan 1 veld slaan.quote:Op zaterdag 17 februari 2007 19:06 schreef wonderer het volgende:
Oh, bah, ik bedenk me net dat het een veel op veel relatie is... (karakters in verhalen. Een karakter kan in meerdere verhalen zitten en een verhaal kan meerdere karakters hebben). Dus UNIQUE gaat niet werken. Het moet de combinatie van karakter en verhaal zijn...
Hm, nou ja, die on duplicate kan ik nog wel voor andere dingen gebruiken. Dus helemaal nutteloos was het niet
Nee? Leg uitquote:Op zaterdag 17 februari 2007 19:20 schreef JeRa het volgende:
[..]
Je weet dat je een UNIQUE constraint ook op meerdere velden tegelijk kunt plaatsen? Dus, in jouw geval, een combinatie van karakter en verhaal?
Je kunt een UNIQUE constraint leggen op één veld (UNIQUE(a)) of op meerdere velden (UNIQUE(a, b)). In dat geval mogen er geen twee records voorkomen waarbij a én b hetzelfde zijnquote:Op zaterdag 17 februari 2007 19:31 schreef wonderer het volgende:
[..]
Nee? Leg uit
Ik heb het nou trouwens veranderd naar een cvs-stukje in een veld dat ik dan bij het ophalen met explode kan doen en dan is het ook klaar. Maar vertel vooral over dat unique gedoe want het komt regelmatig terug.
Als je het over die unique constraints hebt: die doe je wel in de tabel zelfquote:Op zaterdag 17 februari 2007 19:55 schreef wonderer het volgende:
Ooh, okee, dat doe je in de query en niet in de tabel zelf. Thanks.
Dat lijkt heel erg op REPLACE. Heeft dat hetzelfde effect?quote:Op zaterdag 17 februari 2007 18:48 schreef JeRa het volgende:
[..]
INSERT ... ON DUPLICATE KEY UPDATE met een primary key?
Replace is eigenlijk een onding. Sowieso doet replace geen update. Als een waarde al bestaat dan wordt'ie doodleuk uit je database gegooid en er vervolgens opnieuw ingezet.quote:Op zaterdag 17 februari 2007 22:36 schreef SuperRembo het volgende:
[..]
Dat lijkt heel erg op REPLACE. Heeft dat hetzelfde effect?
| 1 2 3 4 5 6 | if ($post == "") { $post = "leeg bericht.."; } ?> |
| 1 2 3 4 5 6 | if ($post == "bla") { $post = "je typte bla.."; } ?> |
Krijg ik dan geen problemen als ik bijv. enkele producten verwijder en dan later wil updaten mbv rangs? Dan zou je in sommige gevallen wel + 10 moeten doen....of als ik een product verwijder alle BOVENLIGGENDE (dus hoger dan de rank van het verwijderde product) - 1quote:Op maandag 19 februari 2007 11:05 schreef Siegfried het volgende:
Ik vermoed dat je een rang veld moet toevoegen in je DB.
GH2108 = 1
HG2122 = 2
GH2138 = 3
Als je op dat pijltje klikt moet je dat veld updaten, en van 3 -> 2 maken, en van 2 -> 3 maken.
Thanks!quote:Op zondag 18 februari 2007 15:42 schreef Geqxon het volgende:
Leuke opgave, ben even aan het knutselen geweest
[ code verwijderd ]
Uh, nee.. Gewoon:quote:Op maandag 19 februari 2007 11:11 schreef wobbel het volgende:
Jah heel leuk, ik kan bij 1 veld wel 2 + 1 = 3 doen, maar hoe moet ik dan die 3 - 1 doen? Gewoon 2 + 1 = 3, dan zoeken waar RANG 3 is en daar - 1?
En als ik een product toevoeg, moet ik de hoogste rang pakken en daar + 1 he?
Hou zoals eerder gezegd een rang of positie bij:quote:Op maandag 19 februari 2007 10:46 schreef wobbel het volgende:
Ik had het al een keer gevraagd, maar kwam er niet echt uit
Ik heb meerdere producten in een tabel ( in dit geval 3 stuks ) maar nu wil ik dat je de volgorde kan aanpassen. Dat ik bijv. op kolom "Rank" kan sorteren op ASC/DESC bijv.
Als ik bij de GH2138 op het pijltje omhoog doe dat de GH2138 op nr 2 komt en de GH2122 1tje naar beneden gaat, maar hoe laat ik dat nou mooi werken met PHP en MySQL?
[afbeelding]
Het dollarteken in de string is puur dat het op .txt moet eindigen. Zo uit mijn roestige hersenpan is het volgens mij zo dat als het ergens mee moet beginnen, dat het dollarteken dan aan het begin moet.quote:Op maandag 19 februari 2007 11:32 schreef Likkende_Lassie het volgende:
[..]
Thanks!(vanwaar die '$' in de string imagepatern? )
Wat als ik nou alles wil renamen / zien wat begint met iets?
Nee, dakje ^ is op het begin van de string, $ op het eind.quote:Op maandag 19 februari 2007 11:36 schreef Geqxon het volgende:
[..]
Het dollarteken in de string is puur dat het op .txt moet eindigen. Zo uit mijn roestige hersenpan is het volgens mij zo dat als het ergens mee moet beginnen, dat het dollarteken dan aan het begin moet.
Je hebt helemaal gelijk, ik was net bezig mijn stoffige schoolboeken over regular expressions er op na te slaan.quote:Op maandag 19 februari 2007 11:56 schreef JeRa het volgende:
[..]
Nee, dakje ^ is op het begin van de string, $ op het eind.
ik voeg altijd een veld 'ORDER' toe, waarbij ieder record een waarde krijgt met een meervoud van 10. Dus 10 / 20 / 30 / 40. Als je dan een record verplaatst doe je die ORDER + 11 (of -11), zodat hij voorbij de de volgende komt. Daarna update je in een loop *alle* records in de tabel zodat ze weer netjes een waarde met een veelvoud van 10 hebbenquote:Op maandag 19 februari 2007 10:46 schreef wobbel het volgende:
Ik had het al een keer gevraagd, maar kwam er niet echt uit
Ik heb meerdere producten in een tabel ( in dit geval 3 stuks ) maar nu wil ik dat je de volgorde kan aanpassen. Dat ik bijv. op kolom "Rank" kan sorteren op ASC/DESC bijv.
Als ik bij de GH2138 op het pijltje omhoog doe dat de GH2138 op nr 2 komt en de GH2122 1tje naar beneden gaat, maar hoe laat ik dat nou mooi werken met PHP en MySQL?
[afbeelding]
Tnx, ben wat verder nu idd!quote:Op maandag 19 februari 2007 12:22 schreef Tijn het volgende:
Je zou bijvoorbeeld fopen() kunnen gebruiken, veldmuis.
Jawel, met die twee functies kun je een bestand inlezen en voor de rest is het pure string manipulatiequote:Op maandag 19 februari 2007 12:33 schreef veldmuis het volgende:
[..]
fgets en fread lijken niet de oplossing als ik het zo zie op php.net?
quote:Op maandag 19 februari 2007 12:36 schreef Tijn het volgende:
Nou, je zou met fgets() wel de regel kunnen uitlezen en dan die regel door een sjieke reguliere expressie halen om je data eruit te filteren.
Hoe dat zit met die reguliere expressie moet je maar even aan iemand anders vragen, daar ben ik niet zo handig in :@
| 1 2 3 4 5 | $patern="#waarde1(.*?)</p>#i" preg_replace($patern,$string,$match); echo $match[1]; ?> |
dat gaat dus helemaal niet werken, want als ik bij 1 product rank + 1 doe, hoe weet ik dan welk product er dan 1 af moet?quote:Op maandag 19 februari 2007 11:34 schreef Siegfried het volgende:
[..]
Uh, nee.. Gewoon:
UPDATE `tabel` SET `rang` = '3' WHERE `id` = 'GH2122 ' LIMIT 1
UPDATE `tabel` SET `rang` = '2' WHERE `id` = 'GH2138' LIMIT 1
Lijkt mij
quote:Op maandag 19 februari 2007 12:53 schreef veldmuis het volgende:
Ik zou toch graag een iets hardere schop in de goeie richting willen :P.
Van stringmanipulatie en reguliere expressies snap ik niets :@.
Als ik nou de inhoud tussen Waarde1: en </P> zou willen uitlezen, hoe doe ik dat dan? :@.
| 1 2 3 4 5 6 | $inhoud = file_get_contents('bestandsnaam'); $matches = array(); preg_match('#^Waarde1:(.*)</P>#Ui', $inhoud, $matches); echo $matches[1]; ?> |
$matches is in eerste instantie een lege array maar wordt gevuld met strings door de functie preg_match(). Daarna is $matches[1] gelijk aan de eerste subset in de regular expression in preg_match() (als je dat niet snapt maakt het niet uitquote:Op maandag 19 februari 2007 13:04 schreef veldmuis het volgende:
Dank allen! Ik ga verder proberen!![]()
Nou ben ik alleen nog nieuwsgierig wat de [1] achter $matches/$match doet?
Zou dat dan geen [0] moeten zijn?quote:Op maandag 19 februari 2007 13:08 schreef Swetsenegger het volgende:
[..]
^waarde1: betekent toch dat de string daarmee begint?
Mjah, als test. Maar als hij ook waarde2, waarde3 etc wil matchen moet er toch een andere expression komenquote:Op maandag 19 februari 2007 13:08 schreef Swetsenegger het volgende:
[..]
^waarde1: betekent toch dat de string daarmee begint?
Maar het betekent toch ook dat de string er zo uit moet zien: "Waarde1:....." Op het moment dat de string niet met Waarde1 begint matched hij toch niet? dus de ^ moet toch gewoon weg?quote:Op maandag 19 februari 2007 13:12 schreef JeRa het volgende:
[..]
Mjah, als test. Maar als hij ook waarde2, waarde3 etc wil matchen moet er toch een andere expression komen
quote:Op maandag 19 februari 2007 13:15 schreef veldmuis het volgende:
"Call to undefined function preg_match()"
Betekent dat dat m'n PHP de preg_match() niet ondersteunt of dat ik gewoon iets fout doe in de code?.
| 1 2 3 | (PHP 3 >= 3.0.9, PHP 4, PHP 5) |
Je zou denken dat eerste, maar het lijkt me sterk dat je met PHP 3 bezig bentquote:Op maandag 19 februari 2007 13:15 schreef veldmuis het volgende:
"Call to undefined function preg_match()"
Betekent dat dat m'n PHP de preg_match() niet ondersteunt of dat ik gewoon iets fout doe in de code?.
quote:Op maandag 19 februari 2007 13:17 schreef veldmuis het volgende:
PHP Version 5.0.5, maar het zou zomaar kunnen dat het een ERG beperkte PHP is.
Post je code eens dan.quote:Afhankelijkheden
Deze functies zijn beschikbaar als onderdeel van de standaard module die altijd beschikbaar is.
bron
Of het is om een wazige reden zonder pcre gecompiledquote:Op maandag 19 februari 2007 13:16 schreef Swetsenegger het volgende:
[..]
[ code verwijderd ]
Dan zou je php versie onder 3.0.9 moeten liggen en DAT lijkt me niet.
Dat zou eventueel kunnen, voor de size-obsessed compileerders onder ons die denken genoeg te hebben aan de ereg_*-functiesquote:Op maandag 19 februari 2007 13:23 schreef Tiemie het volgende:
[..]
Of het is om een wazige reden zonder pcre gecompiled.
--without-pcre-regex
Ik heb deze gepakt:quote:Op maandag 19 februari 2007 13:19 schreef Swetsenegger het volgende:
[..]
[..]
Post je code eens dan.
| 1 2 3 4 5 6 7 8 | #!/usr/bin/php $inhoud = file_get_contents('test'); $matches = array(); preg_match('#^Waar:(.*)</P>#Ui', $inhoud, $matches); echo $matches[1]; ?> |
Ow, dan is dat het. De reden is ruimtegebrek. Gok ik.quote:Op maandag 19 februari 2007 13:23 schreef Tiemie het volgende:
[..]
Of het is om een wazige reden zonder pcre gecompiled :{ .
--without-pcre-regex
Is het daarmee te doen?quote:Op maandag 19 februari 2007 13:25 schreef JeRa het volgende:
[..]
Dat zou eventueel kunnen, voor de size-obsessed compileerders onder ons die denken genoeg te hebben aan de ereg_*-functies
http://nl2.php.net/manual/nl/function.ereg.phpquote:
Ja dat kanquote:Op maandag 19 februari 2007 13:36 schreef wobbel het volgende:
Kan ik ook een join doen in een delete?
Dus dat ik gegevens verwijder uit 2 tabellen die een relatie met elkaar hebben dmv ID?
Subqueries worden al erg lang door MySQL ondersteund, maar met een DELETE is het gewoon een simpele JOINquote:Op maandag 19 februari 2007 13:45 schreef Geqxon het volgende:
[..]
MySQL en subqueries? Ik leer telkens wat nieuws hier
Ik heb mijzelf in 2004/2005 MySQL aangeleerd, en één van de grote punten was de slechte support voor subqueries. Maar zoals ik al zei: Ik leer hier constantquote:Op maandag 19 februari 2007 13:46 schreef JeRa het volgende:
[..]
Subqueries worden al erg lang door MySQL ondersteund, maar met een DELETE is het gewoon een simpele JOIN
Zo dus:quote:
| 1 2 3 4 5 | FROM SHOP_Products INNER JOIN SHOP_Products_Lang ON ( SHOP_Products_Lang.ProductId = SHOP_Products.IdProduct ) WHERE SHOP_Products.SubcategoryId = '" . $SQL_SID . "' |
Precies. Probeer het eerst uit met SELECT FROM <rest van je query> en als dat werkt gewoon je SELECT FROM vervangen door deletequote:
Interbase (firebird) doet dat ook begreep ikquote:Op maandag 19 februari 2007 14:02 schreef JeRa het volgende:
Overigens, in sommige andere RDBMS'en wordt het bovenstaande gedaan door foreign key constraints met een ON DELETE-clausuleeen ON DELETE CASCADE zorgt er dan voor dat wanneer je een record verwijdert waarna andere records verwijzen, dat dan die andere records ook worden verwijderd. Erg handig als je de database-inhoud consistent wilt houden
PostgreSQL is een goede open source RDBMS die zoiets doet (maar ook de grotere commerciële varianten).
Werkt inderdaad...MAAR!quote:Op maandag 19 februari 2007 12:55 schreef JeRa het volgende:
[..]
1
2
3
4
5
6<?php
$inhoud = file_get_contents('bestandsnaam');
$matches = array();
preg_match('#^Waarde1:(.*)</P>#Ui', $inhoud, $matches);
echo $matches[1];
?>
Vreemd, zou gewoon moeten werken. Geen komma's quotes of andere ongein verkeerd?quote:Op maandag 19 februari 2007 14:20 schreef wobbel het volgende:
Betreffende query: DELETE FROM SHOP_Products INNER JOIN SHOP_Products_Lang ON ( SHOP_Products.IdProduct = SHOP_Products_Lang.ProductId ) WHERE SHOP_Products.SubcategoryId = '1'
MySQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN SHOP_Products_Lang ON ( SHOP_Products.IdProduct = ' at line 3
Inderdaad.quote:Op maandag 19 februari 2007 14:43 schreef JeRa het volgende:
Er zit een verschil in aanroep. In Swetsenegger's voorbeeld wordt er DELETE tabel1.*, tabel2.* FROM ... gedaan
| 1 |
die # is alleen start patroon, mag bijna elk teken zijnquote:Op maandag 19 februari 2007 16:29 schreef veldmuis het volgende:
Hmm, ben eruit intussen.
Ik begrijp dat je moet escapen, maar wat is nou het verschil tussen / en #?
Ik las overal / maar jullie gaven in jullie voorbeeld # aan, en dat werkt dus wel.
eh... niet de zooi parsen maar bewerken?quote:Op maandag 19 februari 2007 17:26 schreef veldmuis het volgende:
Okay, andere vraag.
dmv een shell_exec haal ik met wget het bestand op waar ik de data uit wil halen, dat gaat prima, maar daardoor krijg ik allemaal bagger in de pagina. Kan ik de output die wget geeft ergens anders heen sturen zodat het niet op m'n scherm komt?
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |