Hallo,

Bij het uitvoeren van onderstaande code komen bij de echo van $frontpage en $ID 2x een 'f' als waarde terug. Geen idee waarom. Kan iemand mij helpen? Alvast bedankt!


<?php
if (isset($_POST['frontpage'])){
	print_r($_POST);
	
	
		$queryError = false;	
		
		foreach($_POST AS $P) {
			$frontpage=$P['frontpage'];
			$ID=$P['ID'];
			echo $frontpage;
			echo $ID;
			$queryfront = mysql_query("UPDATE `content` SET frontpage = '$frontpage' WHERE `ID`=". (int) $ID, $connection);
			
			
			if(!$queryfront) {
				$queryError = true;
				echo 'error executing frontpage query' . mysql_errno() . ' : ' . mysql_error();
			}
		}

		if (!$queryError) { 
			
		} 
	}
?>
Het is al eerder aangeven, $_POST['ID'] bestaat niet.
Je kan dit controleren door:
<?php
var_dump[$_POST};
?>


Dit komt omdat je nergens een formulier element hebt met de naam "ID"
Wat je wilt is de juiste database-tabel id's meenemen in de POST variabelen. Dat kun je oplossen door het name attribuut een naam te geven als frontpage_12. Met een simpele truck halen we die 12 dan weer uit de naam. Plaats onderstaande snippets op de juiste plek in je code. (Je weet wel waar)

<?php
if (isset($_POST['test'])){
// even zien wat er in $_POST zit:
echo '<pre>';
print_r($_POST);
echo '</pre>';

// loop door ALLE $_POST elementen
foreach($_POST as $index => $value)
{
// indien de index van het element begint met 'frontpage_'
if(substr($index, 0 , 10) == 'frontpage_')
{
// extract het id van de database-tabel:
$arr = explode('_', $index);
$id = (int) $arr[1];

$result = mysql_query("UPDATE content SET frontpage = '" . $value . "' WHERE ID=" . $id, $connection);


if(!$result)
echo 'error executing frontpage query' . mysql_errno() . ' : ' . mysql_error();
}
}
}
?>

<?php
while ($row = mysql_fetch_assoc($result)) {

echo '<tr><td><a href="managearticle.php?edit=' . $row['ID'] . '">' . $row['title'] . '</a></td>';
echo '<td><input type="text" name="frontpage_'.$row['ID'].'" value="' . $row['frontpage'] . '" /></td></tr>';
}
?>
?>
Waarom dan geen hidden input met name="ID[]"?
Ger omdat dat in de $_POST array twee losse onderliggende array's oplevert. En dan hoor ik je al denken 'Nou en?' maar mijn antwoord daarop is dat je dan geen foreach meer kunt gebruiken maar natuurlijk wel een for lus. Echter is dat niet voor iedereen vanzelfsprekend. Daarnaast zul je voor de rest van je leven moeten onthouden dat die twee array's dan wel altijd synchroon moeten lopen.
Beste Frank,

Bedankt, heb het even getest en het werkt! Ik heb nog niet naar de code zelf gekeken wat het verschil is. Dit zal ik morgen doen zodat ik hier weer van kan leren. Maar nogmaals enorm bedankt!

Groetjes Dennis
Voor de kolom ´block´ wil ik exact dezelfde functie, maar dit werkt niet zodra ik f(substr($index, 0 , 10) == 'frontpage_') in f(substr($index, 0 , 10) == 'block_') verander. Uiteraard ook de onderstaande regel heb ik aangepast:

<input type="text" name="block_'.$row['ID'].'" value="' . $row['block'] . '" /></td>

Ik ben er zelf achter gekomen, wanneer ik frontpage laat staan werkt het, maak ik er bv frontpagg van werkt het ook maar zodra ik er een letter afhaal dus, frontpag werkt het niet meer. Dus ik vraag me af of met die cijfers 0, 10 de lengte van de regel mee wordt gegeven. Klopt dit?
Frank Nietbelangrijk op 13/05/2014 21:42:08

Ger omdat dat in de $_POST array twee losse onderliggende array's oplevert. En dan hoor ik je al denken 'Nou en?' maar mijn antwoord daarop is dat je dan geen foreach meer kunt gebruiken maar natuurlijk wel een for lus. Echter is dat niet voor iedereen vanzelfsprekend. Daarnaast zul je voor de rest van je leven moeten onthouden dat die twee array's dan wel altijd synchroon moeten lopen.

Ik hoef niets te onthouden want ik weet dat ze synchroon lopen.
De uitzondering daarop zijn checkboxen.
Voor de kolom ´block´ wil ik exact dezelfde functie, maar dit werkt niet zodra ik f(substr($index, 0 , 10) == 'frontpage_') in f(substr($index, 0 , 10) == 'block_') verander. Uiteraard ook de onderstaande regel heb ik aangepast:

<input type="text" name="block_'.$row['ID'].'" value="' . $row['block'] . '" /></td>

Ik ben er zelf achter gekomen, wanneer ik frontpage laat staan werkt het, maak ik er bv frontpagg van werkt het ook maar zodra ik er een letter afhaal dus, frontpag werkt het niet meer. Dus ik vraag me af of met die cijfers 0, 10 de lengte van de regel mee wordt gegeven. Klopt dit?


Maar wat moet ik nu veranderen zodat het woord 'block' ook werkt?
Als je nu gewoon eens de manual erbij pakt en kijkt hoe de functie [php]substr[/php] werkt, zou dat een idee zijn? Een functie gebruiken zonder dat je zelfs maar weet waarvoor elke parameter dient is altijd een slecht idee....
Als je aantal inputs hebt die bij elkaar horen, kan je dat gewoon als een array laten behandelen:
<?php
echo '<input type"="text" name="frontpage[' . $row['ID'] . ']>';
echo '<input type"="text" name="block[' . $row['ID'] . ']>';

// Het uitlezen ervan
foreach ($_POST['frontpage'] as $id => $value) {
	echo 'Frontpage: ' . $value . '<br> Block: ' . $_POST['block'][$id] . '<br>';
}

Reageren