abonnement Unibet Coolblue
  donderdag 15 maart 2012 @ 12:04:49 #1
12348 _Flash_
Heeft altijd blackjack
pi_109125419


Als je vragen hebt over PHP/MySQL, dan zit je hier goed met een vaste kliek guru's en een groot aantal regelmatige bezoekers. Beperk je vragen niet tot "hij doet het niet" of "hij geeft een fout" - onze glazen bol is kapot en we willen graag van je weten wát er niet lukt en wélke foutmelding je precies krijgt :)

Zie ook:
PHP Dataverwerking
Officiële PHP website
PHP Documentatie
MySQL Reference Manual
Yet Another PHP Faq
PHP Cheat Sheet
PHP5 Power Programming - boek met uitleg over OOP, Pear, XML, etc

Tutorials:
W3Schools PHP
W3Schools SQL
Devil, just come on back if you ever wanna try again, because I told you once you son of a bitch, I'm the best there's ever been!
  donderdag 15 maart 2012 @ 12:25:35 #2
12348 _Flash_
Heeft altijd blackjack
pi_109126001
Ok. Zal ik eens een vraag neerzetten.

Stel je hebt een tabel met klanten en een tabel met adressen. Eén klant heeft drie adressen.
Nu ben je een zoekfunctie aan het schrijven die ook in de adressen moet gaan zoeken naar bepaalde keywords. Dit wil je in één query doen, waar dan alle unieke klanten uit komen rollen waarbij de keywords voorkomen in minimaal 1 van de doorzoekbare velden van de klant en/of bijbehorende adressen.

Nu kan je via 3 left joins de drie adressen aan een klant breien en dan in de WHERE via LIKE gaan testen. Dit gaat zwaar ten koste van de performance.

Hoe zou je dit het beste kunnen oplossen?

Idee van mijzelf: plemp alle adresinformatie in één nieuwe kolom (tekstarea) in de klantentabel en zoek hierbinnen. Scheelt je JOINS en is relatief eenvoudig, bij een update van adresinformatie moet je even dit veld ook updaten.

Wie weet er wat slimmers?
Devil, just come on back if you ever wanna try again, because I told you once you son of a bitch, I'm the best there's ever been!
  donderdag 15 maart 2012 @ 12:29:07 #3
75592 GlowMouse
l'état, c'est moi
pi_109126126
Die twee opties zijn vergelijkbaar.
eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
  donderdag 15 maart 2012 @ 12:39:45 #4
12348 _Flash_
Heeft altijd blackjack
pi_109126493
Qua performance zijn ze niet vergelijkbaar. Als je ze aan elkaar joint en dan gebruik maakt van LIKE om in die 20 a 30 extra velden te zoeken, dan kost dat zo een seconde of 20 tot 60. (Stel 1000 klanten en dus ook 3000 adressen).

Hou je de adresinformatie ook in een hulp-kolom in de klantentabel bij, dan werkt de zoekfunctie bijna instantaneous.

Ik vraag me af of er via mysql nog wat te bedenken is dat snel en toch eleganter dan het genoemde alternatief werkt.

Ik bedenk me, dat is niet echt een PHP-vraag, maar goed :-)
Devil, just come on back if you ever wanna try again, because I told you once you son of a bitch, I'm the best there's ever been!
  donderdag 15 maart 2012 @ 13:38:40 #5
4159 GI
Nee ik heet geen JOE
pi_109128268
Waarom hou je in de adressentabel niet een key (of meerdere keys) bij om te kijken bij welke klant het hoort ?
  donderdag 15 maart 2012 @ 13:50:33 #6
12348 _Flash_
Heeft altijd blackjack
pi_109128694
Zit de vertraging in dit geval niet in het toepassen van LIKE op zoveel velden?

NB, voor iedere key en ieder extra veld ontstaat weer een ritsje extra LIKES:

WHERE (klant.naam LIKE %key1% OR adres1.plaats LIKE %key1% OR...)
AND (klant.naam LIKE %key2% OR adres1.plaats LIKE %key2% OR...)
Devil, just come on back if you ever wanna try again, because I told you once you son of a bitch, I'm the best there's ever been!
pi_109129973
@_FLASH_
gebruik PostgrSQL ipv MysQL en doe een FULLTEXT search ipv like.
FULLTEXT search is vele malen snellen dan een LIKE.
  donderdag 15 maart 2012 @ 14:35:51 #8
63192 ursel
"Het Is Hier Fantastisch!
pi_109130285
Ook voor MySQL zijn daar oplossingen voor. Hoef je niet direct andere DB neer te zetten.
  donderdag 15 maart 2012 @ 14:42:12 #9
75592 GlowMouse
l'état, c'est moi
pi_109130453
quote:
0s.gif Op donderdag 15 maart 2012 12:39 schreef _Flash_ het volgende:
Qua performance zijn ze niet vergelijkbaar.
Dan doe je wat verkeerd, je zult de index voor de join wel vergeten zijn.
quote:
0s.gif Op donderdag 15 maart 2012 14:25 schreef totalvamp het volgende:
@_FLASH_
gebruik PostgrSQL ipv MysQL en doe een FULLTEXT search ipv like.
FULLTEXT search is vele malen snellen dan een LIKE.
Maar de resultaten zijn ook anders.
eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
  donderdag 15 maart 2012 @ 14:57:15 #10
12348 _Flash_
Heeft altijd blackjack
pi_109130895
quote:
0s.gif Op donderdag 15 maart 2012 14:42 schreef GlowMouse het volgende:

[..]

Dan doe je wat verkeerd, je zult de index voor de join wel vergeten zijn.

Ongetwijfeld :)
De id's van beide tabellen zijn primary keys.
In de join zeg ik iets als SELECT ... FROM klant LEFT JOIN adres AS adres1 ON klant.id=adres.id_klant WHERE ...

Bedoel je met "index voor de join" iets dat ik in de tabellen zelf moet instellen of iets in de query?
Devil, just come on back if you ever wanna try again, because I told you once you son of a bitch, I'm the best there's ever been!
  donderdag 15 maart 2012 @ 15:29:05 #11
75592 GlowMouse
l'état, c'est moi
pi_109131983
Post de EXPLAIN van je query met joins en like eens.
eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
  donderdag 15 maart 2012 @ 16:09:06 #12
12348 _Flash_
Heeft altijd blackjack
pi_109133366
Oei daar vraag je me wat. Op de live site is het deel van de adressen er nu hardhandig uitgecomment om de performance weer acceptabel te krijgen. Zal vanavond even echo'en en copypasten.

Edit; toch even handmatig de PHP code hersteld die de query genereert, ter lering en/of vermaak:

$zoektermen = explode(" ", $zoekstring);
foreach ($zoektermen AS $zoekterm) {
$where_deel .= " AND (".$system_prefix."klant.klantnaam LIKE '%".$zoekterm."%' OR ".$system_prefix."klant.klantcode LIKE '%".$zoekterm."%' OR ad1.adres1 LIKE '%".$zoekterm."%' OR ad1.adres2 LIKE '%".$zoekterm."%' OR ad2.adres1 LIKE '%".$zoekterm."%' OR ad2.adres2 LIKE '%".$zoekterm."%' OR ad2.plaats LIKE '%".$zoekterm."%' OR ad1.telefoon LIKE '%".$zoekterm."%' OR ad2.telefoon LIKE '%".$zoekterm."%')";
}
$sql_query = mysql_query("SELECT COUNT(".$system_prefix."klant.id) as aantal FROM (".$system_prefix."klant LEFT JOIN ".$system_prefix."klant_adres AS ad1 ON (".$system_prefix."klant.id=ad1.klant AND ad1.soort=1)) LEFT JOIN ".$system_prefix."klant_adres AS ad2 ON (".$system_prefix."klant.id=ad2.klant AND ad2.soort=2) WHERE ".$system_prefix."klant.status='ok'".$where_deel.";");
Devil, just come on back if you ever wanna try again, because I told you once you son of a bitch, I'm the best there's ever been!
  donderdag 15 maart 2012 @ 16:19:24 #13
12348 _Flash_
Heeft altijd blackjack
pi_109133790
De explain:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE prefix_klant ALL NULL NULL NULL NULL 1451 Using where
1 SIMPLE ad1 ALL NULL NULL NULL NULL 2902
1 SIMPLE ad2 ALL NULL NULL NULL NULL 2902 Using where
Devil, just come on back if you ever wanna try again, because I told you once you son of a bitch, I'm the best there's ever been!
  donderdag 15 maart 2012 @ 16:29:23 #14
75592 GlowMouse
l'état, c'est moi
pi_109134174
In ad1 en ad2 mist de index op klant. Ik zou hier een index maken op (klant,soort) (1 index op 2 velden).
eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
pi_109139029
quote:
0s.gif Op donderdag 15 maart 2012 16:29 schreef GlowMouse het volgende:
In ad1 en ad2 mist de index op klant. Ik zou hier een index maken op (klant,soort) (1 index op 2 velden).
Wat is eigenlijk het voordeel van 1 index op 2 velden en in welke situaties is dat het beste te benutten? Ik heb dat nooit goed gesnapt...
  donderdag 15 maart 2012 @ 20:25:22 #16
75592 GlowMouse
l'état, c'est moi
pi_109142958
quote:
0s.gif Op donderdag 15 maart 2012 19:07 schreef The_Terminator het volgende:

[..]

Wat is eigenlijk het voordeel van 1 index op 2 velden en in welke situaties is dat het beste te benutten? Ik heb dat nooit goed gesnapt...
zie het als een gesorteerde lijst; een telefoonboek is één index op (plaats,naam). Dat werkt makkelijker dan wanneer er alleen op plaats of alleen op naam is gesorteerd, maar alleen als je een naam zoekt in een specifieke plaats (of sorteert op plaats,naam; of bij één plaats wilt sorteren op naam).
eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
pi_109143490
Een index alleen heeft niet heul veul nut tenzij je graag GROUP BY gebruikt op die 2 kolommen (zover ik weet), maar een (primary key/foreign key/unique) constraint met 2 (of meer) kolommen wel.
  donderdag 15 maart 2012 @ 20:34:26 #18
75592 GlowMouse
l'état, c'est moi
pi_109143534
quote:
0s.gif Op donderdag 15 maart 2012 20:33 schreef kucher het volgende:
Een index alleen heeft niet heul veul nut tenzij je graag GROUP BY gebruikt op die 2 kolommen (zover ik weet), maar een (primary key/foreign key/unique) constraint met 2 (of meer) kolommen wel.
helaas, geen koelkast
eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
pi_109144309
quote:
0s.gif Op donderdag 15 maart 2012 11:57 schreef _Flash_ het volgende:
Thanks, mooie site.
Als je nog wat tips wilt voor de beveiliging of om spam te voorkomen (je gaat veel spam krijgen met zo'n formulier) dan moet je het maar laten weten :)
Is goed! Ik ga proberen de rest werkend te maken, en als ik dan nog tijd heb kom ik hier nog wel mijn neus om de hoek steken. Heel erg bedankt O+

quote:
0s.gif Op donderdag 15 maart 2012 11:57 schreef The_Terminator het volgende:

[..]

Mooi!

Ik heb nog wel een suggestie als zijnde een verbetering van je huidige invoer-verwerking:
[ code verwijderd ]

De $input_naam variable kun je vervolgens in je mail gebruiken:
[ code verwijderd ]

Hierdoor weet je zeker dat bijzondere tekens goed verwerkt worden en dat je geen waarschuwingen krijgt indien een een element niet bestaat in de POST array.
Oh, dit ga ik proberen, bedankt! O+
  zondag 18 maart 2012 @ 18:36:41 #20
363305 Muffle
Mufflelicious
pi_109242604
Wie zou mij kunnen helpen met PHP code?
Het betreft algoritmes invoeren om punten te berekenen, maar hiervoor moeten variabelen worden gemaakt enzovoort.
  zondag 18 maart 2012 @ 19:58:34 #21
84244 Scorpie
Abject en infaam!
pi_109245779
Zelf beginnen en als je er niet uitkomt horen we het wel.
Op dinsdag 13 augustus schreef Xa1pt:
Neuh, fraude mag best aangepakt worden. Maar dat het de maatschappij meer oplevert of beter is voor de samenleving, is nog maar de vraag.
Op donderdag 25 juni 2015 schreef KoosVogels:
Klopt. Ik ben een racist.
  zondag 18 maart 2012 @ 21:22:00 #22
12348 _Flash_
Heeft altijd blackjack
pi_109250390
Hoe ver ben je en waar gaat het fout?
Devil, just come on back if you ever wanna try again, because I told you once you son of a bitch, I'm the best there's ever been!
  zondag 18 maart 2012 @ 23:48:59 #23
87680 Mirel
Mirel wil een bongophone.
pi_109259473
Ik moet een contactformulier maken op een website die ik sinds kort beheer (www.sbscoaching.nl). Ik kom er net achter dat ik niks kan invullen in de tekstboxen. Die doen het gewoon in een testbestand.

Hoe komt dit? Ik weet niet echt waar ik naar moet zoeken..

De site heeft zover ik weet nergens een contactformulier staan. Ik zie in de backend wel een mapje genaamd phpmailer, maar ik weet niet waar die voor is.
When all else fails, you always have delusion.
  maandag 19 maart 2012 @ 10:32:30 #24
118585 Crutch
Filantroop || Taalzwengel
pi_109265962
Ik kom er niet uit.
Cookies die ik 'check' en 'set' in een if-statement worden niet onthouden wanneer ik de browser afsluit en daarna weer open.

Als ik een cookie 'set' buiten een if-statement dan blijft deze wel aanwezig.

Dus cookies worden gewoon geaccepteerd, check.
Register Globals staat op 'on', check.

Ik kwam ook ergens de functie ob_start(); tegen, maar dat maakt verder geen verschil als ik die functie aanroep aan het begin van mijn code.

Als ik een cookie aanmaak in een if-statement en ik ververs de pagina dan is ie wel aanwezig, maar sluit ik de browser en open ik de pagina opnieuw dan is ie weer weg.

Ik gebruik overigens MAMP in OSX.
Je moeder is een hamster
pi_109266241
quote:
0s.gif Op maandag 19 maart 2012 10:32 schreef Crutch het volgende:
Ik kom er niet uit.
Cookies die ik 'check' en 'set' in een if-statement worden niet onthouden wanneer ik de browser afsluit en daarna weer open.

Als ik een cookie 'set' buiten een if-statement dan blijft deze wel aanwezig.

Dus cookies worden gewoon geaccepteerd, check.
Register Globals staat op 'on', check.

Ik kwam ook ergens de functie ob_start(); tegen, maar dat maakt verder geen verschil als ik die functie aanroep aan het begin van mijn code.

Als ik een cookie aanmaak in een if-statement en ik ververs de pagina dan is ie wel aanwezig, maar sluit ik de browser en open ik de pagina opnieuw dan is ie weer weg.

Ik gebruik overigens MAMP in OSX.
Geef je een geldigheidsduur mee aan de setcookie functie?
abonnement Unibet Coolblue
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')