mySql Query uitbreiden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Pykow
  • Registratie: Augustus 2007
  • Laatst online: 09-09 17:25

Pykow

Angelo OTR

Topicstarter
beste tweakers. ik heb een klein vraagje waar ik op dit moment niet uit kan komen.

Hieronder de code die ik gebruik
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$selectie = "";
       $brief = $_POST['brief'];         
           if (count($brief) > 0) 
            {
                for ($i=0;$i<count($brief);$i++) 
                {
                      $selectie[$i] = " id_nlookupitem = '".$brief[$i]."' OR";
                } 
                $row = $userdb->q("SELECT DISTINCT relation.id,name,emailprivate
                                FROM relation
                                inner join nlookuplink
                                on id_relation = relation.id 
                                where emailprivate <> '' 
                                AND ".$selectie[$i]."
                    ");
                    echo"".$selectie[$i]. "";
            }


Ik heb een Checkbox name='brief[]. en voor iedere geselecteerde item moet hij id_nlookupitem = 'id' or . toevoegen aan me query, alleen ik krijg het maar niet voormekaar.

ik krijg steeds als uitkomst selectie = 030, dus hij begint bij 0 en daarna plakt hij de eerst volgende ID er tegen aan. maar de bedoeling is dat ik het volgende krijg:

Wanneer er 1 geselecteerd is:
code:
1
2
3
4
5
6
SELECT DISTINCT relation.id,name,emailprivate
FROM relation
inner join nlookuplink
on id_relation = relation.id 
where emailprivate <> '' 
AND id_nlookupitem = '29'


en wanneer er meer geselecteerd zijn:
Wanneer er 1 geselecteerd is:
code:
1
2
3
4
5
6
SELECT DISTINCT relation.id,name,emailprivate
FROM relation
inner join nlookuplink
on id_relation = relation.id 
where emailprivate <> '' 
AND id_nlookupitem = '29' OR id_nlookupitem = '30' OR id_nlookupitem = '31'

Angelo NL / Global Cargo VTC


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 16:09

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

code:
1
$selectie = "";

Oftewel, selectie is een string?
code:
1
$selectie[$i] = " id_nlookupitem = '".$brief[$i]."' OR";

indexeren in een string wijst naar één karakter ;)

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • Pykow
  • Registratie: Augustus 2007
  • Laatst online: 09-09 17:25

Pykow

Angelo OTR

Topicstarter
ik moet toch eerst mijn variable defineren ?
en omdat ik id_nlookupitem en het woord OR gebruik, moet ik het toch in een string zetten ?

ik had ook geprobeerd
code:
1
$selectie =+ " id_nlookupitem = '".$brief[$i]."' OR";

zodat de string achter elkaar geplakt wordt en uiteindelijk als 1 string wordt doorgestuurd naar me query.

maar dan begint hij dus met een cijfer 0 gevolgt door de eerste ID die hij tegen komt.. Ik zou minimaal 2 ID verwachten als ik er 2 selecteer of tenminste :

id_nlookupitem = '30' or id_nlookupitem = '31' or

[ Voor 23% gewijzigd door Pykow op 09-04-2010 16:10 ]

Angelo NL / Global Cargo VTC


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 16:09

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Dat het een string is is ook geen fout, het gaat fout door de manier waarop je de string opbouwt.

=+ is volgens mij bedoeld om getallen op te tellen niet om strings samen te voegen.

Ik zou zeggen, lees je even in wat betreft strings en in dit geval met name het samenvoegen (oftewel concateneren) er van :)

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • Pykow
  • Registratie: Augustus 2007
  • Laatst online: 09-09 17:25

Pykow

Angelo OTR

Topicstarter
ik heb te veel in C# zitten programmeren haha.
een + teken is in PHP gewoon een .
met andere worden ik heb nu gezegt:
code:
1
$selectie .= " id_nlookupitem = '".$brief[$i]."' OR";


nu nog even de laatste OR uit me string zien te verwijderen.
Moet ik dan substring of iets in die richting te gebruiken ? zodat ik de laatste 2 letters kan verwijderen uit me string ?

iets van ?
code:
1
substr_replace($string ,"",-2);

of zit ik er compleet naast

[ Voor 10% gewijzigd door Pykow op 09-04-2010 16:24 ]

Angelo NL / Global Cargo VTC


Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

angienl schreef op vrijdag 09 april 2010 @ 16:08:
ik moet toch eerst mijn variable defineren ?
en omdat ik id_nlookupitem en het woord OR gebruik, moet ik het toch in een string zetten ?
Jawel, alleen van het verkeerde type. Je definieert $selectie eerst als string om hem vervolgens als array te benaderen. Maak van $selectie eens een array(). Dan zou je er zoiets van kunnen maken:

PHP:
1
2
3
4
5
6
7
8
9
$selectie = array();
$brief = array(1,2,3); // dummy
if (count($brief) > 0) {
    foreach($brief as $id) {
        $selectie[] = "id_nlookupitem = " . $id;
    }
    $q = implode(' OR ', $selectie);
    // ...
}

Zorg ook dat je je input valideert, voordat je de query uitvoert ;).
Een loose-typed taal als PHP heeft als groot nadeel dat debuggen gewoon lastiger is. Je kunt namelijk alle types door elkaar heen gooien. Dat is wel iets om in de gaten te houden :)

[ Voor 0% gewijzigd door Bee.nl op 09-04-2010 16:27 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 16:09

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

angienl schreef op vrijdag 09 april 2010 @ 16:22:
ik heb te veel in C# zitten programmeren haha.
een + teken is in PHP gewoon een .
met andere worden ik heb nu gezegt:
code:
1
$selectie .= " id_nlookupitem = '".$brief[$i]."' OR";


nu nog even de laatste OR uit me string zien te verwijderen.
Moet ik dan substring of iets in die richting te gebruiken ? zodat ik de laatste 2 letters kan verwijderen uit me string ?

iets van ?
code:
1
substr_replace($string ,"",-2);

of zit ik er compleet naast
Wat dacht je er van om het eerste item gewoon apart af te handelen en pas bij meer dan één item "OR bladiebla" constructies toe te voegen?

[ Voor 83% gewijzigd door Orion84 op 09-04-2010 16:25 ]

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

Orion84 schreef op vrijdag 09 april 2010 @ 16:24:
[...]

Wat dacht je er van om het eerste item gewoon apart af te handelen en pas bij meer dan één item "OR bladiebla" constructies toe te voegen?
Als je implode() gebruikt, hoef je daar geen rekening mee te houden. Weer een if-constructie minder.

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:17

Dido

heforshe

Begin met
"select blaat from xyz where A = B and 0 = 1"

en plak daar steeds "OR item = jeuh" achter.

Dan ben je van die laatste OR af

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 16:09

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Bee.nl schreef op vrijdag 09 april 2010 @ 16:26:
[...]


Als je implode() gebruikt, hoef je daar geen rekening mee te houden. Weer een if-constructie minder.
Kan ook, maar lijkt me minder efficient, eerst een hele array gaan vullen en die daarna plat slaan tot string, terwijl je ook gewoon in één keer de correcte string kan opbouwen. En je hebt helemaal geen extra if nodig. Gewoon het eerste geval vóór de for mikken (>0 is daar al gecheckt) en de for index op 1 laten beginnen.

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Dido schreef op vrijdag 09 april 2010 @ 16:27:
Begin met
"select blaat from xyz where A = B and 0 = 1"

en plak daar steeds "OR item = jeuh" achter.

Dan ben je van die laatste OR af
Iets zegt me dat dat niet gaat werken...

Acties:
  • 0 Henk 'm!

  • Pykow
  • Registratie: Augustus 2007
  • Laatst online: 09-09 17:25

Pykow

Angelo OTR

Topicstarter
Het is me gelukt ik krijg nu een mooie filter.
bedankt voor de snelle reacties :D

Nu ben ik bijna klaar met het filteren van me lijst.

alleen 1 raar puntje nog.
ik zeg in mijn query.
emailprivate <> ' '

Dus ik verwacht dat ik alleen resultaten krijg waar een email adres niet leeg is.
Bij de andere querys werkt die wel, maar hier niet.

[ Voor 88% gewijzigd door Pykow op 09-04-2010 16:44 ]

Angelo NL / Global Cargo VTC


Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

Orion84 schreef op vrijdag 09 april 2010 @ 16:30:
[...]

Kan ook, maar lijkt me minder efficient, eerst een hele array gaan vullen en die daarna plat slaan tot string, terwijl je ook gewoon in één keer de correcte string kan opbouwen. En je hebt helemaal geen extra if nodig. Gewoon het eerste geval vóór de for mikken (>0 is daar al gecheckt) en de for index op 1 laten beginnen.
Daar heb je ook wel weer gelijk in. Dat krijg je ervan als je even snel wat code klopt :X
angienl schreef op vrijdag 09 april 2010 @ 16:37:
hmm ik probeerde de implode functie in te bouwen, maar dan krijg ik als resultaat ARRAY.
Ja dat is ook logisch. Je gebruikt $selectie (array) in je query, terwijl je $q (string) moet hebben.
En kijk nog even naar het voorstel van Orion84, stukje efficienter :)
angienl schreef op vrijdag 09 april 2010 @ 16:37:
alleen 1 raar puntje nog.
ik zeg in mijn query.
emailprivate <> ' '
Ik denk dat je wat haakjes toe moet voegen...

[ Voor 11% gewijzigd door Bee.nl op 09-04-2010 16:46 ]


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 16:09

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Misschien moet je eens proberen om voorbeelden te begrijpen in plaats van ze klakkeloos in je eigen project te plakken. Nog afgezien van de discussie of je dat voorbeeld wel wilt gebruiken. Het feit dat je zomaar een voorbeeld overneemt terwijl daar al van werd gezegd dat dat niet echt ideaal is geeft wel aan dat je vooral geinteresseerd bent in kant en klare oplossingen, maar dat is nu net niet de bedoeling van dit forum :)

[code]$q = implode(' OR ',$selectie);[/code]
Kijk nog eens goed naar die regel en bedenk je eens wat die doet ;)
Je opmerking over for each snap ik niet.



Edit: pff en dan snel alles weer weghalen...

[ Voor 39% gewijzigd door Orion84 op 09-04-2010 16:47 ]

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • Pykow
  • Registratie: Augustus 2007
  • Laatst online: 09-09 17:25

Pykow

Angelo OTR

Topicstarter
Ik heb gelijk op internet gezocht naar de betekenis hiervan.
ik wil juist zo veel mogelijk leren van php ;) sommige functies zijn echt heel lastig.
in C# zeg je gewoon Combobox_selecteditem == voetbal etc :P
zolang hij resultaat krijg en dus in die regel komt plaatst die OR in de string $selectie.

Nu nog even aan me query sleutelen zodat mensen zonder email niet uit de lijst komen. echt raar maar goed bedankt iedereen

Angelo NL / Global Cargo VTC


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 16:09

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Ik kan wederom geen touw vastknopen aan je reactie, maar graag gedaan en veel succes met verder knutselen in elk geval :)

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
angienl schreef op vrijdag 09 april 2010 @ 16:49:
Ik heb gelijk op internet gezocht naar de betekenis hiervan.
ik wil juist zo veel mogelijk leren van php ;) sommige functies zijn echt heel lastig.
in C# zeg je gewoon Combobox_selecteditem == voetbal etc :P
zolang hij resultaat krijg en dus in die regel komt plaatst die OR in de string $selectie.

Nu nog even aan me query sleutelen zodat mensen zonder email niet uit de lijst komen. echt raar maar goed bedankt iedereen
Misschien is emailprivate wel een nullable value en dan is checken op een lege string niet genoeg en moet je ook checken op emailprivate == null?

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:17

Dido

heforshe

Tharulerz schreef op vrijdag 09 april 2010 @ 16:32:
Iets zegt me dat dat niet gaat werken...
offtopic:
Waarom niet? Ik had eerst natuurlijk de standaard 1=1 staan, maar aangezien we hier een OR opbouwen moet je eerste deel false zijn, aangezien true or X altijd true is.
Het enige waar ik over twijfel is of er haakje om de (0=1 or a=b or a=c or a=d) moeten - maar die stonden er al niet. Moeten ze er wel, kun je ze eenvoudig toevoegen, natuurlijk.

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Pykow
  • Registratie: Augustus 2007
  • Laatst online: 09-09 17:25

Pykow

Angelo OTR

Topicstarter
nee, het is uiteindelijk gelukt met de volgende query

code:
1
2
3
4
5
6
SELECT DISTINCT relation.id,name,emailprivate
                                FROM relation
                                inner join nlookuplink
                                on id_relation = relation.id 
                                where emailprivate <> '' 
                                AND ".$q."

Angelo NL / Global Cargo VTC


Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Dido schreef op vrijdag 09 april 2010 @ 17:13:
[...]

offtopic:
Waarom niet? Ik had eerst natuurlijk de standaard 1=1 staan, maar aangezien we hier een OR opbouwen moet je eerste deel false zijn, aangezien true or X altijd true is.
Het enige waar ik over twijfel is of er haakje om de (0=1 or a=b or a=c or a=d) moeten - maar die stonden er al niet. Moeten ze er wel, kun je ze eenvoudig toevoegen, natuurlijk.
offtopic:
Ik had me misschien fout uitgedrukt: het gaat wel werken, en de haakjes zijn niet nodig, maar als je dit gaat aanraden aan OP (die me nu niet echt een ervaren programmeur lijkt), dan krijg je gegarandeerd morgen een topic waarom zijn query niets teruggeeft (als hij geen OR elementen heeft).

Het lijkt me veel logischer om gewoon een ternary te zetten op die $i, waar het AND geeft als $i 0 is en OR geeft als $i > 0 is.

Acties:
  • 0 Henk 'm!

  • mtsr
  • Registratie: December 2008
  • Laatst online: 25-07 11:13
angienl schreef op vrijdag 09 april 2010 @ 17:26:

code:
1
2
3
4
5
6
SELECT DISTINCT relation.id,name,emailprivate
                                FROM relation
                                inner join nlookuplink
                                on id_relation = relation.id 
                                where emailprivate <> '' 
                                AND ".$q."
Let op dat dit niet werkt voor emailprivate gelijk NULL. Misschien moet je die mogelijkheid nog toevoegen in je where.
Pagina: 1