[SQL / PHP] Van Array naar Query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Binnen mijn CMS'je heb ik o.a. de volgende interface:

Afbeeldingslocatie: http://www.danandan.luna.nl/admin.gif

Als je dit form (het werkt nog maar gedeeltelijk) submit, vang ik met $_POST['edit']; de volgende array af:
code:
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
Array
(
    [4] => Array
        (
            [name] => gastenboek
            [type] => guestbook
            [publish] => 1
        )

    [2] => Array
        (
            [name] => tarieven
            [type] => article
            [publish] => 1
        )

    [3] => Array
        (
            [name] => contact
            [type] => article
        )

    [1] => Array
        (
            [name] => over kwispel
            [type] => article
            [publish] => 1
        )

)

Om dit te bereiken ben ik behoorlijk wat tijd kwijt geweest, maar o.a. door posts op GoT kwam ik erachter dat je binnen PHP de waardes van form elementen met dezelfde naam kunt submitten door deze als naam een array-waarde mee te geven, zoals <input type="checkbox" name="edit[1][publish]" checked="checked"> etc.

Mijn vraag is nu: hoe zet ik deze array om in de volgende query, zodat ik wijzigingen van de user kan aanpassen:

PHP:
1
2
3
$query = "UPDATE nodes SET name = 'gastenboek', type = 'guestbook', publish = 1 WHERE node_id = 4";

//...etc. voor de overige 3 array elementen.


Tweede vraag: kan ik deze array met 1 query naar mysql sturen?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

PHP:
1
2
3
4
5
6
foreach($array as $key => $value){
    if($value['publish']){
        $query.='UPDATE nodes SET name = "'.$value['name'].'", type = "'.$value['type'].'" WHERE node_id = '.$key.';';
   }
}
mysql_query($query);
zoiets?

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

zoiets?

PHP:
1
2
3
4
5
6
7
foreach ($array as $key => $val)
{
    if ($array[$key]["publish"] == 1)
    {
        $query = "UPDATE nodes SET name = '".$array[$key]["name"]."', type = '.$array[$key]["type"].', publish = 1 WHERE node_id = ".$key.""; 
    }
}

Je zou om publish te zetten naar 1 kunnenn zegen "WHERE node_id = 1 OR node_id = 2" zo kan je in één keer de publish op één zetten, maar daar kom je dan wel uit met bovenstaande stukje code...

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Perfect! Ik heb nu de volgende code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (!empty ($_POST)) {
    $arr_edit = $_POST['edit'];
    
    $qry_update = '';
    
    foreach ($arr_edit as $key => $value){ 
        $qry_update .= 'UPDATE nodes SET node_name = "'.$value['name'].'", node_type = "'.$value['type'].'", ';
        
        if (isset ($value['publish'])) {
            $qry_update .= 'node_pub = 1 ';
        }
        else {
            $qry_update .= 'node_pub = 0 ';
        }
        
        $qry_update .= 'WHERE node_id = '.$key.';';
     }
     echo $qry_update;
     //$res_update = db_query($qry_update, 0, 0);
}

Dit is precies wat ik nodig heb. Ik heb nu nog maar 1 probleem. Als volgt. Ik heb een tabel nodes:

Afbeeldingslocatie: http://www.danandan.luna.nl/nodes.gif

en een tabel node_types:

Afbeeldingslocatie: http://www.danandan.luna.nl/node_types.gif

De output van de php hierboven is bijvoorbeeld:
code:
1
UPDATE nodes SET node_name = "gastenboek", node_type = "guestbook", node_pub = 1 WHERE node_id = 4;

Maar moet zijn:

code:
1
2
3
4
5
UPDATE nodes SET node_name = "gastenboek", node_type = 2, node_pub = 1 WHERE node_id = 4;
                                                       ^
                                                       ^
                                                       ^
                                                       ^

Met andere woorden: de query tracht nu de string "guestbook" in te vullen in de kolom nodes.node_type, wat een INT kolom is.

Kan ik de php code hierboven middels een join zo aanpassen dat de node_type automatisch wordt opgehaald uit de tabel node_types (kolom nt_id) en in de plaats wordt gezet van "guestbook"?

Of kan ik beter de node_types tabel leegtrekken van tevoren en in een extra loop guestbook koppelen aan nt_id? Ik hoop dat mijn vraag duidelijk is.

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Reveller schreef op 13 april 2004 @ 23:45:
Of kan ik beter de node_types tabel leegtrekken van tevoren en in een extra loop guestbook koppelen aan nt_id? Ik hoop dat mijn vraag duidelijk is.
als er niet veel types zijn lijkt het eerst inlezen daarvan het handigst, zeker omdat input checking dan makkelijker is :)

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@Erkens - bedankt :) Iemand nog een andere mening toegedaan?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou ook eerst een selectie doen op de types, daar een array van bouwen en op de plek waar jij die twee wil hebben het type als key gebruiken om de id te bepalen die dat type bevat in de db:
PHP:
1
2
3
4
5
6
7
8
while ($val = mysql_fetch_array($selectedtypes))
{
  types[$val["nt_name"]] = $val["nt_id"];
}

// gestripte query voor het maken van de id behorend bij het geselecteerde type

UPDATE nodes SET node_type = '".$types[$value["type"]]."' WHERE node_id = 4;

[ Voor 8% gewijzigd door Verwijderd op 14-04-2004 10:44 ]

Pagina: 1