Array gebruiken in MySQL
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)
1
2
3
4
5
6
7
2
3
4
5
6
7
$sql = "
SELECT *
FROM
bedrijf
WHERE
branche_id LIKE '%".mysql_real_escape_string($array)."%'
";
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?
je kunt implode() gebruiken om de waardes van een array om te zetten naar een string
Dan zul je iets als volgt moeten gaan doen:
Code (php)
1
2
3
4
5
6
7
8
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])."%' ";
?>
$sql = "
SELECT *
FROM
bedrijf
WHERE
branche_id LIKE '%".mysql_real_escape_string($array[0])."%' OR LIKE '%".mysql_real_escape_string($array[1])."%' ";
?>
Enzovoort.
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)
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
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>';
}
}
}
?>
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...
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:
Enzovoort.
Dan zul je iets als volgt moeten gaan doen:
Code (php)
1
2
3
4
5
6
7
8
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])."%' ";
?>
$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)
1
2
3
4
5
6
7
8
9
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));
?>
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));
?>
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)
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
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
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:
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(??):
Gewijzigd op 01/01/1970 01:00:00 door Anne
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