Query fout
Hallo,
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
Weten jullie hoe ik dit kan oplossen?
Alvast bedankt!
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!
Gesponsorde koppelingen:
Het beste advies wat ik je kan geven is door eerst te constateren wat er precies fout gaat. Je hebt nu namelijk geen foutafhandeling.
Ik kan je ten sterkste PDO aanraden, maar om het bij dit topic te houden zou ik het volgende even toevoegen:
En ik denk dat het fout gaat met de implode. Wat je misschien beter kan doen is:
En als je zeker wilt zijn dat ID's integers zijn (werkt alleen in php 5.3:
Hiermee voorkom je eventuele SQL-injectie.
Success!
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!
Hey,
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
)
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?
Hier haal ik $idadmin weg:
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);
?>
Arrghh! 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!
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!
Werkt helaas nog steeds niet echt,
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
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
Gebruik je ook wel echt de juiste variabele in je implode functie? Want daar lijkt het nu fout te gaan.
Post anders de volledige code?
Post anders de volledige code?
De gehele functie:
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;
}
}
?>
IN(" . implode('",", $idadmin) . "');
Dit moet zijn:
IN('" . implode("','", $idadmin) . "')";
Dit moet zijn:
IN('" . implode("','", $idadmin) . "')";
Thanks!
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?
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?
Dat betekent dat de $value ook een array is. M.a.w. de $administrations tabel is een multidimensionale array, arrays binnen arrays. Wat je zou kunnen doen is recursief loopen door alle nodes, dus een simpele check of het een array is.
Code (php)
Gewijzigd op 24/01/2012 15:22:01 door Merijn Venema
Nu gooit hij mijn array leeg als ik dit doe en krijg ik key als 0 en value '' .
Met een beetje testen moet je hier zelf wel uitkomen hoor! Gebruik bijvoorbeeld print_r() om te zien hoe je array eruit ziet en vervolgens kun je daarmee kijken hoe je hem moet doorlopen.
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 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:



