Hallo allemaal

Onderste heb ik ook al bij Database en SQL hulp gezet, maar misschien hoort hij meer hier thuis omdat ik bij de andere geen reacties krijg...

Ik loop al enkele dagen te rommelen met een issue en ik kom er niet uit. Stackflow en andere sites geraadpleegd maar niets boodt de oplossing die ik wilde/werkte.
Nu zijn jullie mijn laatste hoop!

Issue:
CMS met een gallery. achter elke foto zijn er 3 checkboxen. 1ste checkbox: toon op homepage. 2de checkbox: toon in gallery en de 3rde is dat je hem kan verwijderen. checkbox 1 en 2 kunnen ook beide geselecteerd zijn.
Ik krijg het niet werkend om de waarde van de check in mijn database te krijgen. Of ik krijg het helemaal niet werkend, of enkel bij het 1ste record, ookal vink ik de 9de record aan.

Mijn code:
<?php

ini_set('display_errors', 1);
error_reporting(E_ALL);

ob_start();

require('../../lib/dbconnection.php');
require("../../lib/checklogin.php");
require("includes/upload.inc.php");

$query = 'SELECT * FROM gallery where image_deleted != 1 order by id desc';
$result=$conn->query($query);
$count=$result->num_rows;


<!DOCTYPE html>
<html>
<head>
<title>Classic Nails - CMS</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="description" content="ClassicNails">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="../css/screen.css">
<link rel="stylesheet" href="../css/libs/magnific-popup.css">
<script src="../js/libs/min/jquery-min.js" type="text/javascript"></script>
<script src="../js/min/custom-min.js" type="text/javascript"></script>
<script src="js/jquery.magnific-popup.js"></script>
<script>
$(document).ready(function() {
$('.image-link').magnificPopup({
type:'image',
gallery:{
enabled:true
}
});
});
</script>
</head>
<body>
<?php include('includes/header.inc.php');
<?php include('includes/nav.inc.php');
<div class="wrapper">
<article class="content">
<h1>Foto gallery</h1>
<?php
if (isset($uploadResult)) {
echo "<p><strong>$uploadResult</strong></p>";
}

<form action="" method="post" enctype="multipart/form-data" name="uploadImage" id="uploadImage">
<p>
<label for="image">Upload image:</label>
<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAX_FILE_SIZE; " />
<input type="file" name="images" id="imagesd" />
</p>
<p>
<input type="submit" name="upload" id="upload" value="Upload" />
</p>
</form>
<div id="maincontent">
<h2>Foto informatie</h2>
<form name="FotoInformatie" id="fotoInformatie" method="post" action="">
<table>
<tr>
<td align="center"><strong>Foto<strong></td>
<td align="center"><strong>Titel</strong></td>
<td align="center"><strong>Beschrijving</strong></td>
<td align="center"><strong>Homepage</strong></td>
</tr>
<?php
while ($rows=$result->fetch_assoc()) {

<tr>
<td class="hide" align="center"><?php $id[]=$rows['id']; <?php echo $rows['id']; </td>
<td><a href="../img/uploads/<?php echo $rows['filename'];" class="image-link"><img src="../img/thumbs/<?php echo $rows['filename']; "></a></td>
<td align="center"><input name="title[]" type="text" id="title" value="<?php echo $rows['title']; "></td>
<td align="center"><input name="caption[]" type="text" id="caption" value="<?php echo $rows['caption']; "></td>
<td><input type="checkbox" name="checkboxHome[]" id="checkBoxHome" value="<?php echo $rows['home']"/></td>
</tr>
<?php
}

<tr>
<td colspan="4" align="center">
<input type="submit" name="submit" value="Submit">
</tr>
</table>
</form>
</div>
</article> <!-- end of content -->
</div> <!-- end of container -->
<?php include('includes/footer.inc.php');
</body>
</html>

<?php

if(isset($_POST['submit'])) {
$title = $_POST['title'];
$caption = $_POST['caption'];
var_dump($_POST['$checkboxHome']);
if ('$checkboxHome' == "" xor NULL) {
$checkboxHome = '0';
} else {
$checkboxHome = '1';
}
for($i=0;$i<$count;$i++){
$result1=mysqli_query($conn, "UPDATE gallery SET title='$title[$i]', caption='$caption[$i]', home='$checkboxHome[$i]' WHERE id='$id[$i]'");
// header("location:/admin/foto-admin.php");
}
}
?>

Nu is enkel 1 checkbox aanwezig. Het gaat mij om het principe.

ben bekend met de prepare statements die mogelijkerwijs ontbreken. dat is van latere zorg..

Hoop dat iemand mij kan helpen.

alvast bedankt.
Het buffert je output..

Hoe leg ik dat uit?

alles wat je echo't wordt eerst nog in het geheugen geplaatst en nog niet verzonden..

pas aan het einde van je script wordt alles vanuit het geheugen alsnog verzonden.

Het hele punt is dat je hierdoor nog headers kunt verzenden terwijl je al output gebufferd hebt. Maar volgens vele is het een bad practice omdat je hierdoor geheugen verspilt maar ook omdat je (veel belangrijker) hierdoor uitgenodigd wordt je script in onlogische volgorde te schrijven.

Waar ik op doelde is dat jij MIDDEN in je html nog een enorm blok PHP code hebt staan en dat dit bovenin hoort omdat dat veel logischer is


<?php 
	// hier heel je PHP logica shit ZONDER ook maar enige output
	
	$message = '';
	
	if(validate())
	{
		header('flauwekul.php');
		exit;
	}
?>
<!-- HIER PAS JE OUTPUT -->
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>

<body>
<!-- IN DE OUTPUT MAG JE WEL KLEINE STUKJES PHP GEBRUIKEN OM DE VARIABELEN TE ECHOËN -->
<p><?php echo $message; ?></p>
</body>
</html>
Dave Greebe op 25/07/2014 22:58:38

ob_start() loste mijn problem met header already sent op...

Gaat het er alleen om dat het werkt?
Frank Nietbelangrijk op 26/07/2014 00:08:53

Het buffert je output..

Hoe leg ik dat uit?

alles wat je echo't wordt eerst nog in het geheugen geplaatst en nog niet verzonden..

pas aan het einde van je script wordt alles vanuit het geheugen alsnog verzonden.

Het hele punt is dat je hierdoor nog headers kunt verzenden terwijl je al output gebufferd hebt. Maar volgens vele is het een bad practice omdat je hierdoor geheugen verspilt maar ook omdat je (veel belangrijker) hierdoor uitgenodigd wordt je script in onlogische volgorde te schrijven.

Waar ik op doelde is dat jij MIDDEN in je html nog een enorm blok PHP code hebt staan en dat dit bovenin hoort omdat dat veel logischer is


<?php 
	// hier heel je PHP logica shit ZONDER ook maar enige output
	
	$message = '';
	
	if(validate())
	{
		header('flauwekul.php');
		exit;
	}
?>
<!-- HIER PAS JE OUTPUT -->
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>

<body>
<!-- IN DE OUTPUT MAG JE WEL KLEINE STUKJES PHP GEBRUIKEN OM DE VARIABELEN TE ECHOËN -->
<p><?php echo $message; ?></p>
</body>
</html>


Thanks voor de heldere uitleg.

Overigens kom ik er helaas nog niet uit met mijn code. ik heb nu

<?php

if(isset($_POST['submit'])) {
foreach ($_POST['title'] as $id => $title) {
$_POST['caption'][$id];
$_POST['checkboxHome'][$id];
print_r ($checkboxHome)[$id];
// $home = (in_array($id, $_POST['checkboxHome'])) ? : false;
// $result1=mysqli_query($conn, "UPDATE gallery SET title='$title', caption='$caption', home='$checkboxHome' WHERE id='$id'");
}
}

?>

De melding die ik nu krijg bij een submit;

Notice: Undefined variable: checkboxHome in /Users/davegreebe/Development/ClassicNails-Studio/public_html/admin/foto-admin.php on line 18

Notice: Undefined offset: 75 in /Users/davegreebe/Development/ClassicNails-Studio/public_html/admin/foto-admin.php on line 17

Notice: Undefined variable: checkboxHome in /Users/davegreebe/Development/ClassicNails-Studio/public_html/admin/foto-admin.php on line 18

Notice: Undefined offset: 70 in /Users/davegreebe/Development/ClassicNails-Studio/public_html/admin/foto-admin.php on line 17

Notice: Undefined variable: checkboxHome in /Users/davegreebe/Development/ClassicNails-Studio/public_html/admin/foto-admin.php on line 18

Notice: Undefined offset: 69 in /Users/davegreebe/Development/ClassicNails-Studio/public_html/admin/foto-admin.php on line 17

Dit is als ik een checkbox aanvink en submit...
Als ik dat niet doe, dan krijg ik melding;

Notice: Undefined index: checkboxHome in /Users/davegreebe/Development/ClassicNails-Studio/public_html/admin/foto-admin.php on line 17

Notice: Undefined variable: checkboxHome in /Users/davegreebe/Development/ClassicNails-Studio/public_html/admin/foto-admin.php on line 18
Waarden van checkboxes worden niet doorgegeven als aan/uit-waarden of hun booleaanse equivalenten true/false. Het enige dat je ziet, is de waarde uit value="..." als de checkbox is ingeschakeld. Is de checkbox echter uitgeschakeld, dan zie je niets.

Je moet daarom controleren of een variabele bestaat en vervolgens of die variabele een bepaalde (geldige) waarde heeft. Aan het eerste schort het nog: je controleert onvoldoende of variabelen die je wilt gebruiken wel bestaan.
Ik zou zeggen, lees voor je foreach eens je $_POST['title']-array uit met print_r.
Dan moet wel duidelijk worden welke elementen deze array heeft.
Je hoeft niet steeds hele lappen tekst te quoten.

En die meldingen zeggen dat die vars niet bestaan.
<?php

// laten we controleren of de aanvraag verstuurd is in de GET of in de POST methode.
// Als de aanvraag in de POST methode is...
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Handig tijdens het programmeren:
echo '<pre>';
print_r($_POST);
echo '</pre>';

// nu iets proberen te doen met die post vars
if(isset($_POST['title']) && is_array($_POST['title']))
{
foreach ($_POST['title'] as $id => $title)
{
echo $id . ': ' .$title . '<br>';
}
}
}

?>

Toevoeging op 26/07/2014 14:59:23:

Hier een voorbeeld waarnaar je op zoek bent:
(gewoon opslaan onder een willekeurige naam met de extensie .php en het werkt)

<?php

// normaal haal je deze array uit je database
$fotos = array(
	array(
		'id' => 1,
		'title' => 'test 1',
		'homepage' => false,
	),
	array(
		'id' => 3,
		'title' => 'test 2',
		'homepage' => false,
	),
	array(
		'id' => 8,
		'title' => 'test 3',
		'homepage' => true,
	),
);

// laten we controleren of de aanvraag verstuurd is in de GET of in de POST methode.
// Als de aanvraag in de POST methode is...
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
    // Handig tijdens het programmeren:
    echo '<pre>';
    print_r($_POST);
    echo '</pre>';
    
    /*
	 eerst alle ['homepage'] elementen op false!
	 Dit is ook een loop door alle elementen van $fotos maar met een for() ipv een foreach(). 
	 Dit doen we omdat we de array $fotos moeten veranderen (en niet alleen uitlezen).
	*/
	for($i = 0 ; $i < count($fotos) ; $i++)
		$fotos[$i]['homepage'] = false;
	
    /*
	 checkboxen worden alleen maar gepost als ze aanstaan.
	 Als ze allemaal uitstaan dan is er ook geen variabele $_POST['homepage'] en we moeten 
	 dit dus eerst controleren.
	*/
    if(isset($_POST['homepage']))
    {
		// loop door alle elementen van $fotos
		for($i = 0 ; $i < count($fotos) ; $i++)
        {
			// indien het id van de foto in de array $_POST['homepage'] voorkomt
			if(in_array($fotos[$i]['id'], $_POST['homepage']))
				$fotos[$i]['homepage'] = true;
        }
    }

    /*
	 text-inputs worden altijd gepost.
	 We hoeven dus niet nog eens te controleren of $_POST['title'] wel bestaat.
	*/
	$i = 0;
	foreach($_POST['title'] as $title)
	{
		$fotos[$i++]['title'] = $title; // de ++ achter $i++ zorgt er voor dat $i met 1 verhoogd wordt.
	}
}

?>
<form action="" method="post">
<?php
foreach($fotos as $foto)
{
	echo '<input type="text" name="title[]" value="'.$foto['title'].'" />';
	echo '<input type="checkbox" name="homepage[]" value="'.$foto['id'].'"';
	echo $foto['homepage']?' checked="checked"':'';
	echo ' /> plaats op de homepage<br>';
}
?>
<input type="submit" value="Verzenden" />
</form>


Toevoeging op 26/07/2014 15:11:15:

Merk op dat de dat de checkboxen een value meekrijgen!

<input type="checkbox" name="homepage[]" value="3" />
@Frank. Ik ben nou jouw voorbeeld in mijn code aan het gebruiken. Je voorbeeld is precies zoals ik het wil, alleen er gebeurd iets, in mijn ogen raars als ik de array wilt outputten om te kijken wat ik terugkrijg. Dit doe ik nu steeds vaker zodat ik het begin te snappen

Mijn stukje aangepast code is alsvolgt;
<?php

$query = 'SELECT * FROM gallery where image_deleted = "true" order by id desc';
$result=$conn->query($query);
$rows=$result->num_rows;
$fotos=$result->fetch_array(1);
echo '<pre>';
echo 'Inhoud van de $fotos-array';
print_r($fotos);
echo '</pre>';

OUTPUT:
Inhoud van de $fotos-arrayArray
(
[id] => 73
[filename] => image-123.jpg
[title] => image-123
[caption] => image-123
[home] => false
[fotoboek] => false
[image_deleted] => true
)
?>
Dit lijkt mij opzich te kloppen, maar als ik verder ga....

<?php
foreach($fotos as $foto)
print_r($foto['title']);
{
echo '<input type="text" name="title[]" value="'.$foto['title'].'" />';
echo '<input type="checkbox" name="home[]" value="'.$foto['id'].'"';
echo $foto['home']?' checked="checked"':'';
echo ' /> plaats op de homepage<br>';
}

OUTPUT:
Warning: Illegal string offset 'title' in /Users/davegreebe/Development/ClassicNails-Studio/public_html/phphulp.php on line 81
7
Warning: Illegal string offset 'title' in /Users/davegreebe/Development/ClassicNails-Studio/public_html/phphulp.php on line 81
i
Warning: Illegal string offset 'title' in /Users/davegreebe/Development/ClassicNails-Studio/public_html/phphulp.php on line 81
i
Warning: Illegal string offset 'title' in /Users/davegreebe/Development/ClassicNails-Studio/public_html/phphulp.php on line 81
i
Warning: Illegal string offset 'title' in /Users/davegreebe/Development/ClassicNails-Studio/public_html/phphulp.php on line 81
f
Warning: Illegal string offset 'title' in /Users/davegreebe/Development/ClassicNails-Studio/public_html/phphulp.php on line 81
f
Warning: Illegal string offset 'title' in /Users/davegreebe/Development/ClassicNails-Studio/public_html/phphulp.php on line 81
t
?>

Het lijkt erop als of hij alleen het 1ste charakter van elke kolom pakt en niet alles.
Ben aan het puzzelen waarom hij dat doet maar ik kom er niet uit.

Jij of iemand anders een idee waarom??
Je probeert nu een niveau te diep te gaan in de array. Uit je eerste test blijkt dat $fotos dit is:

Array
(
    [id] => 73
    [filename] => image-123.jpg
    [title] => image-123
    [caption] => image-123
    [home] => false
    [fotoboek] => false
    [image_deleted] => true
)

Als je daar nu een foreach op los laat dan krijg je elk element apart. Dus in de eerste loop krijg je alleen de waarde 73 (van het id), in de tweede loop krijg je alleen image-123.jpg (van filename) etc. Dat zijn allemaal geen arrays meer en dus kan je ook niet meer $foto['title'] doen, dat werkt niet.

Wat je moet doen is de fetch binnen een while loop zetten en bij elk record gewoon direct het juiste element aanspreken, geen foreach loop daar gebruiken:

<?php
$query = 'SELECT * FROM gallery where image_deleted = "true" order by id desc';
$result=$conn->query($query);
$rows=$result->num_rows;
while( $fotos = $result->fetch_array(1) ){
    echo '<input type="text" name="title[]" value="'.$fotos['title'].'" />';
    echo '<input type="checkbox" name="home[]" value="'.$fotos['id'].'"';
    echo $fotos['home']?' checked="checked"':'';
    echo ' /> plaats op de homepage<br>';
}
?>
En wat staat er precies op regel 81 van phphulp.php?

Toevoeging op 29/07/2014 10:23:52:

hmmm ja je zou zo moeten fetchen:

<?php

$query = 'SELECT * FROM gallery where image_deleted = "true" order by id desc';
$result=$conn->query($query);
while($row=$result->fetch_array(??)) // waar staat die 1 voor?
$fotos[]=$row; // voeg de row toe aan de array fotos
?>

Ik hoop dat ik het goed zeg.. de bedoeling is dat $fotos ALLE records in zich krijgt.

Reageren