Versio

Query fout

Overzicht Reageren

M H

M H

24/01/2012 09:28:01
Quote Anchor link
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

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
<?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'];
              
              
            }


?>


Weten jullie hoe ik dit kan oplossen?

Alvast bedankt!
 
PHP hulp

PHP hulp

25/05/2012 13:43:32
Gesponsorde koppelingen:
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 09:41:51
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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...
?>


En ik denk dat het fout gaat met de implode. Wat je misschien beter kan doen is:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$ids
= array_map('intval', $ids);
?>


Hiermee voorkom je eventuele SQL-injectie.

Success!
 
M H

M H

24/01/2012 09:49:51
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
print_r($idadmin );
?>


De output dan netjes dit is:
Array ( [0] => 1
[1] => 2
)
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 09:53:47
Quote Anchor link
Zou je nog eens volledig je script willen posten? Dus inclusief declaratie van $idadmin, of komt dat van een formulier oid?
 
M H

M H

24/01/2012 10:00:33
Quote Anchor link
Hier haal ik $idadmin weg:
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
<?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);

?>
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 10:09:42
Quote Anchor link
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:

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
<?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);
?>


En als ik het bij mij met command line shell in PHP uitvoer krijg ik:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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")


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!
 
M H

M H

24/01/2012 11:46:01
Quote Anchor link
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
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 11:58:58
Quote Anchor link
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?
 
M H

M H

24/01/2012 12:02:31
Quote Anchor link
De gehele functie:

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
<?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;
              
              
            }
            
            
            
    }

?>
 
- SanThe -

- SanThe -

24/01/2012 12:08:24
Quote Anchor link
IN(" . implode('",", $idadmin) . "');

Dit moet zijn:
IN('" . implode("','", $idadmin) . "')";
 
M H

M H

24/01/2012 12:10:38
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$admin
[] =  $row['admin'];
$administrations[] = $admin;
?>


En nu zou ik graag de values die hierin zetten willen echoën op het scherm, zonder dat je dit krijgt 0 => 1 etc.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach ($administrations as $key => $value){
                   echo $value;
               }

?>


Dit geeft als uitkomst 'Array'.
Wat doe ik verkeerd?
 
Merijn Venema

Merijn Venema

24/01/2012 15:20:49
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

function RecursiveCheck(array $array)
{

    foreach ($array as $k => $v )
    {

        if(is_array($v)){
            RecursiveCheck($v);
        }

        else{
            echo "Key: " . $k  . " met value: " . $v . '<br/>';
        }
    }
}

?>
Gewijzigd op 24/01/2012 15:22:01 door Merijn Venema
 
M H

M H

24/01/2012 16:19:43
Quote Anchor link
Nu gooit hij mijn array leeg als ik dit doe en krijg ik key als 0 en value '' .
 
Kees Schepers
Moderator

kees Schepers

24/01/2012 16:59:12
Quote Anchor link
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?
 
M H

M H

24/01/2012 17:01:24
Quote Anchor link
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
 
- SanThe -

- SanThe -

25/01/2012 15:35:14
Quote Anchor link
Marijke Hakvoort op 24/01/2012 12:10:38:
Ik heb hier een array:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$admin
[] =  $row['admin'];
$administrations[] = $admin;
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach ($administrations as $key => $value){
                   echo $value;
               }

?>


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
foreach ($administrations as $key1 => $value1)
{

    foreach ($value1 as $key2 => $value2)
    {

        echo $value2 . '<br />';
    |
|

?>
 



Overzicht Reageren

Get Adobe Flash player