Query fout
Ik heb een fout in mijn query staan, maar ik kom er zelf niet uit.
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given on line 63
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$modules = "SELECT
tbl_kortingen.titel as titel,
tbl_kortingen.bedrag as prijs
FROM
tbl_kortingen
WHERE tbl_kortingen.id_administration IN (".implode(",",$idadmin).")";
$results = mysql_query($modules);
while ($rows = mysql_fetch_array($results)){
return $rows['titel'];
}
?>
$modules = "SELECT
tbl_kortingen.titel as titel,
tbl_kortingen.bedrag as prijs
FROM
tbl_kortingen
WHERE tbl_kortingen.id_administration IN (".implode(",",$idadmin).")";
$results = mysql_query($modules);
while ($rows = mysql_fetch_array($results)){
return $rows['titel'];
}
?>
Weten jullie hoe ik dit kan oplossen?
Alvast bedankt!
Ik kan je ten sterkste PDO aanraden, maar om het bij dit topic te houden zou ik het volgende even toevoegen:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$results = mysql_query($modules);
if(false === $results) {
trigger_error('query fout: ' . mysql_error(), E_USER_ERROR);
}
while...
?>
$results = mysql_query($modules);
if(false === $results) {
trigger_error('query fout: ' . mysql_error(), E_USER_ERROR);
}
while...
?>
En ik denk dat het fout gaat met de implode. Wat je misschien beter kan doen is:
Code (php)
1
2
3
4
2
3
4
<?php
$sql = 'SELECT .. FROM ...';
$sql .= 'WHERE tbl_kortingen.id_administration IN("' . implode('",", $ids) . '")';
?>
$sql = 'SELECT .. FROM ...';
$sql .= 'WHERE tbl_kortingen.id_administration IN("' . implode('",", $ids) . '")';
?>
En als je zeker wilt zijn dat ID's integers zijn (werkt alleen in php 5.3:
Hiermee voorkom je eventuele SQL-injectie.
Success!
Bedankt voor het meedenken.
Op deze manier bij de implode geeft hij aan dat $idadmin geen array is:
Warning: implode() [function.implode]: Argument must be an array
Terwijl als ik doe:
De output dan netjes dit is:
Array ( [0] => 1
[1] => 2
)
Zou je nog eens volledig je script willen posten? Dus inclusief declaratie van $idadmin, of komt dat van een formulier oid?
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$query = "SELECT tbl_customers.name as client,
tbl_administrations.id as idadmin,
tbl_administrations.name as admin
FROM tbl_customers,
tbl_administrations
WHERE
tbl_customers.id = ".$id." AND
tbl_administrations.id_customer = ".$id;
$result = mysql_query($query);
$array = array();
while ($row = mysql_fetch_array($result)){
$admin = $row['admin'] ."<br>";
$client = $row['client'] ."<br>";
$idadmin[] = $row['idadmin'] ."<br>";
$array[] = $idadmin;
}
print_r( $idadmin);
?>
$query = "SELECT tbl_customers.name as client,
tbl_administrations.id as idadmin,
tbl_administrations.name as admin
FROM tbl_customers,
tbl_administrations
WHERE
tbl_customers.id = ".$id." AND
tbl_administrations.id_customer = ".$id;
$result = mysql_query($query);
$array = array();
while ($row = mysql_fetch_array($result)){
$admin = $row['admin'] ."<br>";
$client = $row['client'] ."<br>";
$idadmin[] = $row['idadmin'] ."<br>";
$array[] = $idadmin;
}
print_r( $idadmin);
?>
MySQL-injection :p Lees het even goed door en wees bewust van de risico's.
Ik heb je script even beveiligd en fout afhandeling toegevoegd:
En als ik het bij mij met command line shell in PHP uitvoer krijg ik:
Hier zie ook wat het gevolg is van die array_map. Die zorgt ervoor 'test' -> 0 wordt. 'test' Had namelijk ook DROP TABLE administrations; ofzo kunnen zijn.
Als je deze foutmelding krijgt:
Warning: implode() [function.implode]: Argument must be an array
Doe daar eens een regel boven:
var_dump($idadmin);
Controleer ook even de namen want daar heb ik niet naar gekeken!
Arrghh! Ik heb je script even beveiligd en fout afhandeling toegevoegd:
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
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
<?php
$query = "SELECT tbl_customers.name as client,
tbl_administrations.id as idadmin,
tbl_administrations.name as admin
FROM tbl_customers,
tbl_administrations
WHERE
tbl_customers.id = " . (int)$id . " AND
tbl_administrations.id_customer = " . (int)$id;
$result = mysql_query($query);
if(false === $result) {
trigger_error('query fout: ' . mysql_error(), E_USER_ERROR);
}
$array = array();
if(mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_array($result)){
$admin = $row['admin'] ."<br>";
$client = $row['client'] ."<br>";
$idadmin[] = $row['idadmin'] ."<br>";
$array[] = $idadmin;
}
}
print_r( $idadmin);
?>
$query = "SELECT tbl_customers.name as client,
tbl_administrations.id as idadmin,
tbl_administrations.name as admin
FROM tbl_customers,
tbl_administrations
WHERE
tbl_customers.id = " . (int)$id . " AND
tbl_administrations.id_customer = " . (int)$id;
$result = mysql_query($query);
if(false === $result) {
trigger_error('query fout: ' . mysql_error(), E_USER_ERROR);
}
$array = array();
if(mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_array($result)){
$admin = $row['admin'] ."<br>";
$client = $row['client'] ."<br>";
$idadmin[] = $row['idadmin'] ."<br>";
$array[] = $idadmin;
}
}
print_r( $idadmin);
?>
En als ik het bij mij met command line shell in PHP uitvoer krijg ik:
Code (php)
1
2
3
4
5
2
3
4
5
php > $array = array('test', 3, 5);
php > $array = array_map('intval', $array);
php > $sql = 'WHERE tbl_kortingen.id_administration IN("' . implode('","', $array) . '")';
php > echo $sql;
WHERE tbl_kortingen.id_administration IN("0","3","5")
php > $array = array_map('intval', $array);
php > $sql = 'WHERE tbl_kortingen.id_administration IN("' . implode('","', $array) . '")';
php > echo $sql;
WHERE tbl_kortingen.id_administration IN("0","3","5")
Hier zie ook wat het gevolg is van die array_map. Die zorgt ervoor 'test' -> 0 wordt. 'test' Had namelijk ook DROP TABLE administrations; ofzo kunnen zijn.
Als je deze foutmelding krijgt:
Warning: implode() [function.implode]: Argument must be an array
Doe daar eens een regel boven:
var_dump($idadmin);
Controleer ook even de namen want daar heb ik niet naar gekeken!
dit is de output:
Array ( [0] => 1
[1] => 2
)
Warning: implode() [function.implode]: Argument must be an array on line 65
array(2) { [0]=> string(5) "1
" [1]=> string(5) "2
" }
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given on line 70
Post anders de volledige code?
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
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
<?php
function getDiscount($client){
$dbid = "SELECT
tbl_customers.id as id
FROM
tbl_customers
WHERE
tbl_customers.name LIKE \"%$client%\"
";
$resultat = mysql_query($dbid) or die ( mysql_error());
while ($line = mysql_fetch_array($resultat)){
$id = $line['id'];
}
$query = "SELECT tbl_customers.name as client,
tbl_administrations.id as idadmin,
tbl_administrations.name as admin
FROM tbl_customers,
tbl_administrations
WHERE
tbl_customers.id = " . (int)$id . " AND
tbl_administrations.id_customer = " . (int)$id;
$result = mysql_query($query);
if(false === $result) {
trigger_error('query fout: ' . mysql_error(), E_USER_ERROR);
}
$array = array();
if(mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_array($result)){
$admin = $row['admin'] ."<br>";
$client = $row['client'] ."<br>";
$idadmin[] = $row['idadmin'] ."<br>";
$array[] = $idadmin;
}
}
print_r( $idadmin);
$modules = "SELECT
tbl_kortingen.titel as titel,
tbl_kortingen.bedrag as prijs
FROM
tbl_kortingen
WHERE tbl_kortingen.id_administration IN(" . implode('",", $idadmin) . "');
$results = mysql_query($modules);
while ($rows = mysql_fetch_array($results)){
echo $modules;
}
}
?>
function getDiscount($client){
$dbid = "SELECT
tbl_customers.id as id
FROM
tbl_customers
WHERE
tbl_customers.name LIKE \"%$client%\"
";
$resultat = mysql_query($dbid) or die ( mysql_error());
while ($line = mysql_fetch_array($resultat)){
$id = $line['id'];
}
$query = "SELECT tbl_customers.name as client,
tbl_administrations.id as idadmin,
tbl_administrations.name as admin
FROM tbl_customers,
tbl_administrations
WHERE
tbl_customers.id = " . (int)$id . " AND
tbl_administrations.id_customer = " . (int)$id;
$result = mysql_query($query);
if(false === $result) {
trigger_error('query fout: ' . mysql_error(), E_USER_ERROR);
}
$array = array();
if(mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_array($result)){
$admin = $row['admin'] ."<br>";
$client = $row['client'] ."<br>";
$idadmin[] = $row['idadmin'] ."<br>";
$array[] = $idadmin;
}
}
print_r( $idadmin);
$modules = "SELECT
tbl_kortingen.titel as titel,
tbl_kortingen.bedrag as prijs
FROM
tbl_kortingen
WHERE tbl_kortingen.id_administration IN(" . implode('",", $idadmin) . "');
$results = mysql_query($modules);
while ($rows = mysql_fetch_array($results)){
echo $modules;
}
}
?>
Dit moet zijn:
IN('" . implode("','", $idadmin) . "')";
Ik heb voor nu de output die ik hoor te zien :)
Toevoeging op 24/01/2012 14:45:08:
Klein vraagje:
Ik heb hier een array:
En nu zou ik graag de values die hierin zetten willen echoën op het scherm, zonder dat je dit krijgt 0 => 1 etc.
Dit geeft als uitkomst 'Array'.
Wat doe ik verkeerd?
Nu gooit hij mijn array leeg als ik dit doe en krijg ik key als 0 en value '' .
Met wat je nu geeft kunnen wij niet zien waaruit $admin is opgebouwd. En je doet $admin[]= $row['admin']; maar moet dat niet gewoon $admin = $row['admin'] zijn?
met print_r() kreeg ik de array te zien, maar $key en $value kon ik niet echoën binnen de foreach. Op de 1 of andere manier verandert er het 1 en ander in de array binnen de foreach
Marijke Hakvoort op 24/01/2012 12:10:38:
Lijkt mij een beetje vreemde constructie. Je zet $row['admin'] in het array $admin en daarna zet je het complete array $admin weer in een ander array $administrations.
Maar okee: