Meerdere Arrays opslaan
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:
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
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
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
)
(
[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..:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?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'";
}
}
}
}
?>
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
Verder voer je de query nergens uit.
De probleem is de juiste array die in juiste veld moet opgeslagen worden.
Code (php)
Of bedoel je dat niet?
Ik snap niet exact wat er nou in $key, $value, $subKey en $subValue staat, maar hier kan je wel iets mee proberen.
Het wordt dus wel 1 query, maar met meerdere opdrachten.
Daarvoor is het laatste stukje.
Daar implode je de opdrachten, voer je de query uit en is er wat (basis)-foutafhandeling.
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
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
<?php
$sql = array();
if (is_array($_POST))
{
foreach ($_POST as $key => $value)
{
$exceptions = 'savetext, laatzien, ';
if (!preg_match("/$key, /", $exceptions))
{
foreach ($value as $subKey => $subValue)
{
echo $subKey . " met " . $subValue . "<br>";
$sql[] = "UPDATE ".$key." SET aantallimit = ".$subValue." WHERE text_id = ".$subKey." ";
}
}
}
}
$sql = implode(", ", $sql);
if(mysql_query($sql))
{
echo 'gelukt';
}
else
{
echo 'niet gelukt';
}
?>
$sql = array();
if (is_array($_POST))
{
foreach ($_POST as $key => $value)
{
$exceptions = 'savetext, laatzien, ';
if (!preg_match("/$key, /", $exceptions))
{
foreach ($value as $subKey => $subValue)
{
echo $subKey . " met " . $subValue . "<br>";
$sql[] = "UPDATE ".$key." SET aantallimit = ".$subValue." WHERE text_id = ".$subKey." ";
}
}
}
}
$sql = implode(", ", $sql);
if(mysql_query($sql))
{
echo 'gelukt';
}
else
{
echo 'niet gelukt';
}
?>
De output ziet er als uit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Array
(
[0] => UPDATE fotoid SET aantallimit = 69 WHERE text_id = 12
[1] => UPDATE fotoid SET aantallimit = 29 WHERE text_id = 13
[2] => UPDATE aantallimit SET aantallimit = 15 WHERE text_id = 12
[3] => UPDATE aantallimit SET aantallimit = 15 WHERE text_id = 13
[4] => UPDATE textid SET aantallimit = 12 WHERE text_id = 12
[5] => UPDATE textid SET aantallimit = 13 WHERE text_id = 13
[6] => UPDATE newfotoid SET aantallimit = WHERE text_id = 15
[7] => UPDATE newaantallimit SET aantallimit = WHERE text_id = 15
)
(
[0] => UPDATE fotoid SET aantallimit = 69 WHERE text_id = 12
[1] => UPDATE fotoid SET aantallimit = 29 WHERE text_id = 13
[2] => UPDATE aantallimit SET aantallimit = 15 WHERE text_id = 12
[3] => UPDATE aantallimit SET aantallimit = 15 WHERE text_id = 13
[4] => UPDATE textid SET aantallimit = 12 WHERE text_id = 12
[5] => UPDATE textid SET aantallimit = 13 WHERE text_id = 13
[6] => UPDATE newfotoid SET aantallimit = WHERE text_id = 15
[7] => UPDATE newaantallimit SET aantallimit = WHERE text_id = 15
)
Die array 6 en 7 wordt een insert.
Door die
$sql = implode(", ", $sql);
if(mysql_query($sql))
zegt dat het elk keer niet gelukt is. Als ik die , aanpas naar ; en de hele update regels plakt in phpmyadmin, werkt ie wel. Rechtstreeks via php niet.
Waaraan zou het liggen?
Niet Bumpen::
Gewijzigd op 01/01/1970 01:00:00 door Sander C
http://nl.php.net/mysql_query:
mysql_query() sends a unique query (multiple queries are not supported) to the currently active database on the server that's associated with the specified link_identifier .
Je zou ook die array $sql kunnen doorlopen, maar dan krijg je alsnog meerdere queries.
Dan is mysql_unbuffered_query() denk ik een betere oplossing ;).
Ik heb ook zo mijn bedenkingen bij het datamodel. Laat eens zien hoe dat eruit ziet.
text_id int(11) auto_increment,
text_foto_id int(11),
aantallimit varchar(50),
text_border int(1),
text_title int(1)
En de output van die Eddy:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Array
(
[0] => UPDATE invultext SET text_foto_id='69' WHERE text_id='12'
[1] => UPDATE invultext SET text_foto_id='29' WHERE text_id='13'
[2] => UPDATE invultext SET aantallimit='15' WHERE text_id='12'
[3] => UPDATE invultext SET aantallimit='15' WHERE text_id='13'
[4] => UPDATE invultext SET text_border='1' WHERE text_id='12'
[5] => UPDATE invultext SET text_border='1' WHERE text_id='13'
[6] => UPDATE invultext SET text_title='1' WHERE text_id='12'
[7] => UPDATE invultext SET text_title='1' WHERE text_id='13'
)
(
[0] => UPDATE invultext SET text_foto_id='69' WHERE text_id='12'
[1] => UPDATE invultext SET text_foto_id='29' WHERE text_id='13'
[2] => UPDATE invultext SET aantallimit='15' WHERE text_id='12'
[3] => UPDATE invultext SET aantallimit='15' WHERE text_id='13'
[4] => UPDATE invultext SET text_border='1' WHERE text_id='12'
[5] => UPDATE invultext SET text_border='1' WHERE text_id='13'
[6] => UPDATE invultext SET text_title='1' WHERE text_id='12'
[7] => UPDATE invultext SET text_title='1' WHERE text_id='13'
)
SanThe: Ik was niet aan het bumpen. Ik vroeg normaal om een oplossing na een foutmelding.
Want die $sql (die is dan een string en geen array meer!) kan je als query gebruiken in mysql_unbufferd_query().
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:
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.
Gewijzigd op 01/01/1970 01:00:00 door Sander C
Sander schreef op 03.01.2009 13:31:
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.Alleen de probleem met checkbox blijft.
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...
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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);
?>
$_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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Array
(
[12] => Array
(
[fotoid] => 69
[aantallimit] => 15
[textid] => 12
[orginalrowid] => 1
)
[13] => Array
(
[fotoid] => 29
[aantallimit] => 15
[textid] => 13
[orginalrowid] => 1
)
)
(
[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
Gewijzigd op 01/01/1970 01:00:00 door Hipska BE
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:
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.De aanpak van Blanche gaat om lege formulier, terwijl ik geen lege formulier heb.
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.
Code (php)
levert dit:
Code (php)
1
2
3
4
5
2
3
4
5
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;
)
(
[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?
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$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>";
'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?