Array gebruiken in MySQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Anne

Anne

08/03/2009 11:08:00
Quote Anchor link
Beste allemaal,

Ik vraag me al enige tijd af of het mogelijk is om een array te gebruiken bij het WHERE element in MySQL.

Dus zoiets als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
    $sql = "
    SELECT *
    FROM
        bedrijf
    WHERE
     branche_id LIKE '%".mysql_real_escape_string($array)."%'
     ";

Het gebruiken van een array lukt me namelijk met geen mogelijkheid... Is het ook mogelijk om alle waarden van de array op te slaan in een gewone string?
 
PHP hulp

PHP hulp

26/12/2024 01:57:29
 
Rens nvt

Rens nvt

08/03/2009 11:11:00
Quote Anchor link
je kunt implode() gebruiken om de waardes van een array om te zetten naar een string
 

08/03/2009 11:12:00
Quote Anchor link
Dus het komt er op neer dat je bedrijven uit meerdere branche_id's wilt selecteren?
Dan zul je iets als volgt moeten gaan doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$sql
= "
    SELECT *
    FROM
        bedrijf
    WHERE
     branche_id LIKE '%"
.mysql_real_escape_string($array[0])."%' OR LIKE  '%".mysql_real_escape_string($array[1])."%'      ";
?>

Enzovoort.
Gewijzigd op 01/01/1970 01:00:00 door
 
Anne

Anne

08/03/2009 11:21:00
Quote Anchor link
Bedankt voor jullie reacties! Wat ik wil doen is het volgende:
er staan een aantal verschillende branches opgeslagen in $uitkomst. Het aantal branches is afhankelijk van een andere SQL query.

Wat ik nu wil doen is kijken welk bedrijf met zijn branche lijkt op de array $uitkomst.

(branche_id moet eigenlijk branche zijn, want in branche_id staat geen id maar de naam van de branche.)

Hier het script wat ik gebruik:
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
     <?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{


$sql = "
    SELECT
        naam
    FROM
        branche
    WHERE
     trefwoorden LIKE '%"
.mysql_real_escape_string($_POST['branche_zoek'])."%'
"
;

if(!$res = mysql_query($sql))
{

    trigger_error(mysql_error().'<br />In query: '.$sql);
}

elseif(mysql_num_rows($res) == 0)
{
 
}

else
 {
 while($row = mysql_fetch_assoc($res))
   {

   $uitkomst .= $row['naam'].'<br />';
   }
 }


if($uitkomst == '')
{


echo '- Er zijn geen bedrijven gevonden die voldoen aan uw zoekopdracht.<br>
Probeer te zoeken op een grotere plaats in uw omgeving.'
;

}

else {
 
    $sql = "
    SELECT *
    FROM
        bedrijf
    WHERE
     branche_id LIKE '%"
.mysql_real_escape_string($uitkomst)."%'
    AND
     plaats_id LIKE '%"
.mysql_real_escape_string($_POST['plaats_zoek'])."%'
    OR
     overal = 1    
    AND
     branche_id LIKE '%"
.mysql_real_escape_string($uitkomst)."%'
     "
;
if(!$res = mysql_query($sql))
{

    trigger_error(mysql_error().'<br />In query: '.$sql);
}

elseif(mysql_num_rows($res) == 0)
{

    echo 'Geen resultaten';
}

else
{
echo '<table border="0" cellspacing="10" width="100%">';
    $teller = 1;
    while($row = mysql_fetch_assoc($res))
    {

        if($teller == 1) echo '<tr>';
         echo '<td style="border: 0px solid #AAAAAA;" width="147" align="center" valign="middle"><a href="'.$row['website'].'" target="'.$row['venster'].'"><img src="logo/'.$row['logo'].'" alt="'.$row['naam'].'" border="0" align="" /></a></td>';
        if($teller == 3) { echo '</tr>'; $teller = 0; }
        $teller++;
    }

    echo '</table><br>';
}
}
}

?>


Bij branche_id LIKE '%".mysql_real_escape_string($uitkomst)."%' gaat iets verkeerd, want ik weet zeker dat $uitkomst een aantal branches bevat, maar ik krijg geen resultaten...
 
Rens nvt

Rens nvt

08/03/2009 11:26:00
Quote Anchor link
Mathijs schreef op 08.03.2009 11:12:
Dus het komt er op neer dat je bedrijven uit meerdere branche_id's wilt selecteren?
Dan zul je iets als volgt moeten gaan doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$sql
= "
    SELECT *
    FROM
        bedrijf
    WHERE
     branche_id LIKE '%"
.mysql_real_escape_string($array[0])."%' OR LIKE  '%".mysql_real_escape_string($array[1])."%'      ";
?>

Enzovoort.

Om te voorkomen dat je hier hele lappen aan code neer moet zetten (en dat je vast zit aan het aantal waardes in de array) kun je ookdit doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
    function formatQueryData($data)
    {

        return "'%" . mysql_real_escape_string($data) . "%'";
    }


    $searchData = array('string1', 'string2', 'string3');
    $query = "SELECT id FROM branche WHERE field LIKE " . implode(' OR field LIKE ', array_map('formatQueryData', $searchData));
?>
 
Anne

Anne

08/03/2009 11:36:00
Quote Anchor link
Bedankt Rens, maar ik snap er niet zo veel van en ik denk dat dit niet precies is wat ik bedoel.

Het enige wat ik wil doen is dit:
WHERE
trefwoorden LIKE '%".mysql_real_escape_string($uitkomst)."%'

Maar dit lukt niet, nu krijg ik geen resultaten. Komst dat doordat $uitkomst een array is? En is er dan een simpele manier om $uitkomst om te zetten in een enkele string?
Dus iets als $string_met_branches = $uitkomst (dit kan natuurlijk niet, maar bij wijze van een voorbeeld)
 
Frank -

Frank -

08/03/2009 11:42:00
Quote Anchor link
Gebruik geen LIKE maar IN().

WHERE id IN(1,2,3,4);

Met de php-functie implode() (reeds genoemd) is dit eenvoudig te realiseren.

LIKE is gruwelijk traag wanneer je begint met een %, er kan dan geen index worden gebruikt. In jouw geval heb je ook helemaal geen LIKE nodig, gebruik hem dan ook niet.
 
Rens nvt

Rens nvt

08/03/2009 11:44:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
    function formatQueryData($data)
    {

        return "'%" . mysql_real_escape_string($data) . "%'";
    }


    $searchData = array('string1', 'string2', 'string3');
    $query = "SELECT id FROM branche WHERE trefwoorden LIKE " . implode(' OR field LIKE ', array_map('formatQueryData', $uitkomst));

    echo $query;
?>

De output hiervan is een query die trefwoorden vergelijkt met alle waardes in je uitkomt array. Dat is toch wat je vraagt?


@Frank: misschien heb ik niet alles opgepikt uit de post, maar met IN kun je toch niet een trefwoord machen met een 'trefwoorden' veld? Tenminste, ik ga er bij een trefwoorden kolom vanuit dat deze comma seperated is. Wel zou dit kunnen met FIND_IN_SET, maar of dat nou zoveel sneller is? Of bedoel je iets als "WHERE 'waarde' IN (kolom)" ?
Gewijzigd op 01/01/1970 01:00:00 door Rens nvt
 
Anne

Anne

08/03/2009 11:50:00
Quote Anchor link
Bedankt Frank!
Ik schaam me om het te zeggen, maar ik snap dat implode verhaal niet zo goed. Ik heb gezocht op php.net, en met een beetje geklooi krijg ik dan dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$uitkomst = array(???);
$allebranches = implode(",", $uitkomst);
echo $allebranches;


Maar wat moet ik zetten op de plek van de drie vraagtekens?

En als ik het goed begrijp gaat m'n sql stukje code er dan zo uit zien(??):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
    WHERE
     branche_id IN ".$alleresultaten."
Gewijzigd op 01/01/1970 01:00:00 door Anne
 
Toby hinloopen

toby hinloopen

08/03/2009 13:26:00
Quote Anchor link
serialize($array);
json_encode($array);

2 functies die het vlekkeloos en snel doen. serialize is denk het snelste, json kost minder bytes.

Uiteraard nog wel ff escapen met mysql_real_escape_string();

Maar het lijkt me niet de beste oplossing om een array als string op te slaan.
Gewijzigd op 01/01/1970 01:00:00 door toby hinloopen
 



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.