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.
Je hebt nog steeds: $home = $_POST['home'];

En verder is dit gewoon slordig: $home[$i]]['home']'
(na de $i staan twee sluitende blok haken, moet er 1 zijn)

Overigens kan het nu ook zijn dat je in de knoop komt met al die quotes binnen quotes. Als ik het mij goed herinner moet je array keys niet voorzien van quotes als de variabele binnen een string met dubbele quotes staat. Omdat ik het nooit zo gebruik ben ik er niet helemaal zeker van. Ik zou er in elk geval voor kiezen om alles buiten quotes te halen, persoonlijk vind ik dat overzichtelijker. Wat het 1 niet beter maakt dan het ander, puur persoonlijke voorkeur:

<?php
$result1=mysqli_query($conn,
                    "UPDATE gallery SET title='".$title[$i]."', 
                        caption='".$caption[$i]."', 
                        home='".$home[$i]."',
                        fotoboek='".$fotoboek[$i]."' 
                     WHERE home='".$home[$i]['home']."'");
?>


Edit: inmiddels heb je je post aangepast, dus geen idee of bovenstaande nog terechte opmerkingen zijn. Op wat je nu post kan ik geen zinnig antwoord geven. Anders dan dat je script vol fouten zat en het dus allemaal niet werkt.
Erwin H op 30/07/2014 09:37:50

Je hebt nog steeds: $home = $_POST['home'];

En verder is dit gewoon slordig: $home[$i]]['home']'
(na de $i staan twee sluitende blok haken, moet er 1 zijn)

Inderdaad had ik ook al gezien en ik poste te snel en zag nog foutje zoals $home = $_POST['home'];

Erwin H op 30/07/2014 09:37:50

Overigens kan het nu ook zijn dat je in de knoop komt met al die quotes binnen quotes. Als ik het mij goed herinner moet je array keys niet voorzien van quotes als de variabele binnen een string met dubbele quotes staat. Omdat ik het nooit zo gebruik ben ik er niet helemaal zeker van. Ik zou er in elk geval voor kiezen om alles buiten quotes te halen, persoonlijk vind ik dat overzichtelijker. Wat het 1 niet beter maakt dan het ander, puur persoonlijke voorkeur:

<?php
$result1=mysqli_query($conn,
                    "UPDATE gallery SET title='".$title[$i]."', 
                        caption='".$caption[$i]."', 
                        home='".$home[$i]."',
                        fotoboek='".$fotoboek[$i]."' 
                     WHERE home='".$home[$i]['home']."'");
?>


Dit ga ik ook nog even aanpassen..
Erwin H op 30/07/2014 09:37:50

Edit: inmiddels heb je je post aangepast, dus geen idee of bovenstaande nog terechte opmerkingen zijn. Op wat je nu post kan ik geen zinnig antwoord geven. Anders dan dat je script vol fouten zat en het dus allemaal niet werkt.

ga nog ff alles nalopen. Misschien kan Frank nog iets zinnigs zeggen.
Sorry dat ik nu echt veel vraag maar ik merk gewoon echt dat ik iets wilde wat in mijn hoofd simpel klonk maar echt lastig is voor een beginner.. Ben super blij met jullie hulp want anders was ik er echt niet gekomen en hoop dat ik nog even van jullie gebruik mag maken tot het werkt...

kudo's voor de helpers :)
Als je het hebt aangepast, post het dan nog eens, gaan we zoeken naar de volgende fouten (mochten die er nog in staan).
Erwin, Quick question;

wat betekend:
Illegal string offset 'home' in.....

snap de uitleg niet op inet...
melding geeft hij op regel 59, en dat is

<?php
WHERE home='".$home[$i]['home']."'");
?>
Dat betekent dat de key 'home' niet bestaat in die array. $home[$i] kan wel bestaan, maar $home[$i]['home'] dus niet.
Meerdere malen updaten leent zich uitstekend voor prepared statements:
<?php
$update = $conn->prepare('UPDATE
							gallery
						 SET
							title = ?,
							caption = ?,
							home = ?,
							fotoboek = ?
						WHERE
							id = ?');
$update->bind_param('ssssi', $title, $caption, $home, $fotoboek, $id);
foreach ($_POST['title'] as $pid => $phototitle) {
	$title = $phototitle;
	$caption = $_POST['caption'][$pid];
	$id = $pid;
	$home = (isset($_POST['home']) && in_array($pid, $_POST['home'])) ?  'true' : 'false';
	$fotoboek = (isset($_POST['fotoboek']) && in_array($pid, $_POST['fotoboek'])) ?  'true' : 'false';
	$update->execute();
}
?>
Erwin, hier bijgewerkte code. met jouw uitleg snap ik inderdaad om de "where..." fout gaat. $home[$i] is geen array en daarom werkt ['home'] niet. Heb dat veranderd zoals je zult zien.

Ger; ik doe nog even geen prepare omdat ik eerst dit werkend wil krijgen zonder nog meer "voor mij lastige" codes toe te voegen. merk dat dit al een beetje boven mn pet gaat :)

<?php

require('../lib/dbconnection.php');

$query = 'SELECT * FROM gallery where image_deleted = "false" order by id desc';
$result=$conn->query($query);
$rows=$result->num_rows;

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
for($i = 1 ; $i < count($rows) ; $i++)
$_POST['id'][$i]['home'] = false;


if(isset($_POST['home']))
{
for($i = 1 ; $i < count($rows) ; $i++) {
if(in_array($_POST[$i], $_POST['home']))
$_POST['id'][$i]['home'] = true;
}
}

$i = 0;
foreach($_POST['title'] as $title)
{
$_POST[$i++]['title'] = $title;
}

$id = $_POST['id'];
$title = $_POST['title'];
$caption = $_POST['caption'];
$home = $_POST['id'];
$fotoboek = $_POST['fotoboek'];
for($i=0;$i<$rows;$i++){
$result1=mysqli_query($conn,
"UPDATE gallery SET title='".$title[$i]."',
caption='".$caption[$i]."',
home='".$home[$i]."',
fotoboek='".$fotoboek[$i]."'
WHERE home='".$home[$i]."'");
}
//header("location:/phphulp.php");

//mysqli_free_result($result);
//mysqli_close($conn);
}

<form action="" method="post">
while($fotos=$result->fetch_array(1) ){
echo '<input type="text" name="id[]" value="'.$fotos['id'].'" />';
echo '<input type="text" name="title[]" value="'.$fotos['title'].'" />';
echo '<input type="text" name="caption[]" value="'.$fotos['caption'].'" />';
echo '<input type="checkbox" name="home[]" value="'.$fotos['id'].'"';
echo $fotos['home']?' checked="checked"':'false';
echo ' /> home';
echo '<input type="checkbox" name="fotoboek[]" value="'.$fotos['id'].'"';
echo $fotos['fotoboek']?' checked="checked"':'false';
echo ' /> fotoboek<br>';
}
<input type="submit" value="Verzenden" />
</form>

?>

Ik krijg geen foutmeldingen dus dat gaat goed :)
Echter werkt mn update totaal niet. Als ik tekst aanpas komt het niet in m'n database te staan terwijl het wel in mn post komt en in mn ARRAY-object (noem je dat zo???)
tevens zijn al mn checkboxen "gechecked" terwijl de waarde in de DB op false staat.

overigens, als ik alles probeer te snappen, snap ik niet waarom Frank onderstaande erin zette

<?php

for($i = 1 ; $i < count($rows) ; $i++)
$_POST['id'][$i]['home'] = false;

?>

Deze wordt enkel geactiveerd als de POST-method wordt aangeroepen. Mn checkboxen zouden dan op false worden gezet (uitgevinkt ga ik vanuit dan...)
maar dat is in mn post al, terwijl ik daarvoor heb aangeven welke ik op "true" wil hebben, met bovenstaande wordt het dan weer op false gezet. Klopt die beredenering?
Dit stuk:

<?php

for($i = 1 ; $i < count($rows) ; $i++)
        $_POST['id'][$i]['home'] = false;

?>

Gaat erom om een volledige array aan te maken voor elke checkbox. Zoals je inmiddels weet, worden alleen aangevinkte checkboxes naar de server gestuurd. Om ervoor te zorgen dat je ook een waarde hebt voor de niet aangevinkte, heeft Frank dit stuk (en de initialisatie erboven) voorgesteld, zodat je later in je query altijd voor elke checkbox een true of false waarde hebt.

Alleen zie ik nu dat er in de for loop iets mis gaat.

<?php
$rows=$result->num_rows;
for($i = 1 ; $i < count($rows) ; $i++) {
?>

$rows is het aantal rijen dat je ophaalt uit je database. Het is een getal. count($rows) gebruik je om het aantal element uit een array te tellen. Dat werkt dus niet op een getal. Die for loop (op regel 11 en 17) moet dus zijn:

<?php
for($i = 1; $i < $rows; $i++) {
?>

Dan krijg je compleet gevulde arrays in $_POST['id'] en dan kan je ook je update statement goed maken, want die gaat nu fout:

<?php
WHERE home='".$home[$i]."'");
?>

(kleurtjes kloppen even niet omdat ik maar een deel van de string copieer)
$home[$i] is in feite $_POST['id'][$i]. En dat is een array nu (met bovenstaande aanpassing) en dat wil je niet, je wil de waarde van het element 'home' in die array. Dus:

<?php
WHERE home='".$home[$i]['home']."'");
?>

Dat was boven al correct, alleen omdat die for loops verkeerd liepen werkte het niet.
Ik volg dit steeds vol verbazing.
Waarom alles zo moeilijk.

Als je nou in het formulier overal het id meegeeft dan weet je toch wat bij wat hoort.
Uit je dubbelpost: http://www.phphulp.nl/php/forum/topic/checkbox-waarden-in-mysqltabel/95525/#686307

<?php
while($fotos=$result->fetch_array(1) ){
echo '<input type="text" name="id['.$fotos['id'].']" value="'.$fotos['id'].'" />';
echo '<input type="text" name="title['.$fotos['id'].']" value="'.$fotos['title'].'" />';
echo '<input type="text" name="caption['.$fotos['id'].']" value="'.$fotos['caption'].'" />';
echo '<input type="checkbox" name="home['.$fotos['id'].']"'.($fotos['home'] ? ' checked="checked"' : '').' /> home';
echo '<input type="checkbox" name="fotoboek['.$fotos['id'].']"'.($fotos['fotoboek'] ? ' checked="checked"' : '').' /> fotoboek<br>';
}
?>

En dan:
<?php
foreach($_POST['id'] as $id)
{
$title = $_POST['title'][$id];
$caption = $_POST['caption'][$id];
$home = isset($_POST['home'][$id]);
$fotoboek = isset($_POST['fotoboek'][$id]);
// updaten
}
?>
Nice,

Ik vul in in het id veld:

1 OR 1=1

Dit wordt allemaal voorkomen door met een prepared statement te werken.

Reageren