Iedereen alvast beste wensen..

Maar nu heb ik een probleem..
Een eenvoudige arrays kon ik wel opslaan..maar een multidimensionele arrays niet. Kan iemand mij uitleggen hoe ik multidimensionele arrays kan opslaan.

De output van print_r($_POST) ziet er als volgt uit:

Array
(
    [laatzien] => Array
        (
            [1] => text.php
        )

    [fotoid] => Array
        (
            [12] => 69
            [13] => 29
        )

    [aantallimit] => Array
        (
            [12] => 15
            [13] => 15
        )

    [textid] => Array
        (
            [12] => 12
            [13] => 13
        )

    [orginalrowid] => Array
        (
            [12] => 1
            [13] => 1
        )

    [savetext] => Save
)


Met deze code probeer ik arrays op te slaan..:

<?php
  if (is_array($_POST)) {
      foreach ($_POST as $key => $value) {
          $exceptions = 'savetext, laatzien, ';
          if (!preg_match("/$key, /", $exceptions)) {
              foreach ($value as $subKey => $subValue) {
                  echo $subKey . $subValue . "<br>";
                  $sql = "UPDATE $invultexttab SET aantallimit='???', text_foto_id='???', text_border='???', text_title='???' WHERE text_id='$subKey'";
              }
          }
      }
  }
?>


Die echo $subKey.$subValue."<br>"; heb ik als output:
1269
1329
1215
1315
1212
1313
121
131

Zo te zien loopt arrays goed..alleen wil al deze gegevens niet goed opslaan in juiste velden.

Kan iemand dus mij even uitleggen.

bvd
@ Sander: wat geeft $sql NÁ de implode()?
Want die $sql (die is dan een string en geen array meer!) kan je als query gebruiken in mysql_unbufferd_query().
Is het niet beter dat dit eruit komt?
Array
(
    [0] => UPDATE invultext SET text_foto_id=69, aantallimit=15, text_border=1, text_title=1 WHERE text_id=12
    [1] => UPDATE invultext SET text_foto_id=29 , aantallimit=15, text_border=1, text_title=1  WHERE text_id=13
)
@ Eddy
UPDATE invultext SET text_foto_id='69' WHERE text_id='12'; UPDATE invultext SET text_foto_id='29' WHERE text_id='13'; UPDATE invultext SET aantallimit='15' WHERE text_id='12'; UPDATE invultext SET aantallimit='15' WHERE text_id='13'

Maar verder zie ik dat het nog niet helemaal perfect is, omdat text_border en text_title een checkbox zijn, als ik ze afvink, dwz op 0 en wordt dus niet opgeslagen.

Ook al als ik mysql_unbuffered_query() gebruik, krijg ik melding: niet gelukt.

Als ik die in foreach stop:

foreach ($sql as $url)
{
$result=mysql_query($url);
}

dan werkt het wel. Alleen de probleem met checkbox blijft.

@Hipsa..dat is wel beter..als je mij uitlegt hoe het moet..dan pas ik het aan.
Sander schreef op 03.01.2009 13:31
Alleen de probleem met checkbox blijft.
Om die reden is het ook niet handig om tijdens de controle van je formulier de $_POST array als uitgangspunt te nemen en die te doorlopen. Niet aangevinkte checkboxen missen in die array en dus zullen die velden ontbreken in je controle.

Zet in je controle de namen van alle velden die in je formulier zitten in een array en doorloop die. Dan weet je zeker dat je controles uitvoert op alle velden in je formulier, ongeacht of ze in de $_POST array voorkomen.

Hier zie je een voorbeeldje van die aanpak...
Om het makkelijker in 2 query's te stoppen heb je even een kleine aanpassing van de arrays nodig.
<?php

$_POST = array(
'laatzien' => array( 1 => 'text.php'),
'fotoid' => array( 12 => 69, 13 => 29),
'aantallimit' => array( 12 => 15, 13 => 15),
'textid' => array( 12 => 12, 13 => 13),
'orginalrowid' => array(12 => 1, 13 => 1),
'savetext' => 'Save'
);

$allowed = array('fotoid','aantallimit','orginalrowid');

$update = array();
foreach($_POST as $key => $value){
if(is_array($value) and in_array($key,$allowed)){
foreach($value as $subkey => $subvalue){
$update[$subkey][$key] = $subvalue;
}
}
}

print_r($update);
?>
Levert deze array op:
Array
(
    [12] => Array
        (
            [fotoid] => 69
            [aantallimit] => 15
            [textid] => 12
            [orginalrowid] => 1
        )

    [13] => Array
        (
            [fotoid] => 29
            [aantallimit] => 15
            [textid] => 13
            [orginalrowid] => 1
        )

)

Hiermee kan je volgens mij makkelijker een deftige SQL query maken.

EDIT: Update ivm security
Ik wordt nog steeds niks wijzer van..volgens mij krijg ik 2 verschillend soorten uitleg voorgeschoteld.

De aanpak van Blanche gaat om lege formulier, terwijl ik geen lege formulier heb. Alle gegevens zijn al uit database en alles wordt in $_SESSION gestopt waar ik eigenlijk niks aan heb.

De aanpak van Hipska ziet er al wat beter uit..maar er wordt niks bijgezegd hoe je kan opslaan en dezelfde probleem die Blanche ook al zei, die met checkbox.

Kan iemand niet even een snelle code maken waarmee ik uit voeten kan komen.
Sander schreef op 03.01.2009 19:21
De aanpak van Blanche gaat om lege formulier, terwijl ik geen lege formulier heb.
Nee, het is een voorbeeld van de aanpak die ik in mijn vorige post beschrijf. Dus van het definieren van je formuliervelden in een array en die gebruiken om de verschillende velden te controleren. Dit lost het probleem met je checkboxen op.

Verder heb ik helemaal niets gezegd over de verdere verwerking van je formulier of wat je met de geposte data zou moeten doen. Voor dat onderdeel zou je dus op het voorbeeld van Hipska voort kunnen borduren.
Met de paplepel in de mond dan maar :(
<?php

$sql = array();
foreach($update as $id => $data){
$query = 'UPDATE invultext SET ';
foreach($data as $veld => $value) $query .= $veld.'='.$value.', ';
$sql[] = rtrim($query,', ').' WHERE text_id='.$id.';';
}

print_r($sql);
?>
levert dit:
Array
(
    [0] => UPDATE invultext SET fotoid=69, aantallimit=15, textid=12, orginalrowid=1 WHERE text_id=12;
    [1] => UPDATE invultext SET fotoid=29, aantallimit=15, textid=13, orginalrowid=1 WHERE text_id=13;
)


Ik had echt wel gehoopt dat je dit zelf wel kon uitvogelen, zo moeilijk was dat nu toch ook niet?
@Hipska,

Nog heel erg bedankt..maar ik was aan het uitvogelen hoe ik text_border=0 en text_title=0 in arrays te stoppen.

Heb gisteren en halve dag zitten klooien wat het mij geen resultaat oplevert. Ik heb stukje vd code die Blanche opgaf beetje gecombineerd met de jou.


$formuliervelden = array (
'text_foto_id' => $_POST['text_foto_id'],
'aantallimit' => $_POST['aantallimit'],
'text_border' => $_POST['text_border'],
'text_title' => $_POST['text_title']
);
$allowed = array('text_foto_id','aantallimit','text_border','text_title');

$update = array();
foreach($formuliervelden as $key => $value){
    if(is_array($value) and in_array($key,$allowed)){
        foreach($value as $subkey => $subvalue){
         $update[$subkey][$key] = $subvalue;
        }
    }
}

echo "<pre>";
print_r($update);
echo "</pre>";


Het levert mij resultaat op:
Array
(
[12] => Array
(
[text_foto_id] => 69
[aantallimit] => 15
[text_border] => 1
[text_title] => 1
)

[13] => Array
(
[text_foto_id] => 29
[aantallimit] => 15
)

)

Om van gek te worden en array houdt mij alles tegen om text_border=0 en text_border=0 te mogen gebruiken in array 13.
ja maar bestaat $_POST['text_border'][13] en $_POST['text_title'][13] wel?

Reageren