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.
@Erwin, ik heb de code aangepast met jouw toevoegingen. Ik krijg de juiste waardes nu in mn variable/arrays maar ik kan nog geen teksten aanpassen en de vinkjes blijven ook staan. Snap niet wat er mis gaat. Ik krijg ook geen SQL-error

<?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 < $rows ; $i++)
$_POST['home'][$i] = false;

if(isset($_POST['home']))
{
// loop door alle elementen van $fotos
for($i = 1 ; $i < $rows ; $i++) {
// indien het id van de foto in de array $_POST['home'] voorkomt
if(in_array($_POST['id'], $_POST['home']))
$_POST['home'][$i] = true;
}
}

$i = 0;
foreach($_POST['title'] as $title)
{
$_POST[$i++]['title'] = $title; // de ++ achter $i++ zorgt er voor dat $i met 1 verhoogd wordt.
}

$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]");
if(mysql_errno()) {
echo "MySQL error ".mysql_errno().": "
.mysql_error()."\n<br>When executing <br>\n$result1\n<br>";
}
}
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>
?>

@SanThe, dat is stukke makkelijker ziet dat eruit. ga het eens doornemen of ik eruit kom en ff kijken hoe dat werkt. Blijf wel ff volhouden met code van Frank/Erwin maar puur even qua kennis pak ik jouwe er ook even bij
bedankt voor je input!

ben benieuwd of jullie zien wat "er allemaal" fout gaat :)

Leerzame code voor me....

[size=xsmall]Toevoeging op 30/07/2014 18:43:35:[/size]

- SanThe - op 30/07/2014 12:08:46

<?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
}
?>

Heb deze iets moeten aanpassen omdat hij bij het laatste record bleef "hangen".
heb er nu dit van gemaakt en ik krijg dan geen error. het werkt nogsteeds niet maar dat ligt vermoedelijk aan iets anders.

<?php
while($_POST['id'] <= $rows) {
// bla....
?>
Komt toch op hetzelfde neer??

EDIT: ohnee, ik doe nu gewoon opnieuw een loop zonder dat iets met de ID koppel.

EDIT2:
Dit is de error die ik krijg als ik jouw code met foreach overneem;
<?php
Notice: Uninitialized string offset: 31 in /Users/davegreebe/Development/ClassicNails-Studio/public_html/phphulp.php on line 64
?>
Het zijn in totaal 31 records dus het lijkt erop dat hij de laatste niet mee neemt... is dat logisch?
Wat staat er dan op regel 64?

De methode van San The heb ik je overigens 5 dagen geleden al voorgesteld, en mijn vorige voorbeeld is nagenoeg hetzelfde principe.

Dave Greebe op 30/07/2014 18:30:00
Blijf wel ff volhouden met code van Frank/Erwin

Even voor de goede orde: het is niet 'mijn' code alszijnde dat ik voorstel dit te gebruiken. Ik probeer er alleen fouten uit te halen.

Verder lijkt het me verstandiger dat je een aanpak gebruikt en niet twee dingen door elkaar gaat gebruiken, daar wordt het voor jezelf niet overzichtelijker op, maar ook het topic wordt een rotzooitje en uiteindelijk kan niemand je meer helpen. Welke aanpak je kiest moet je helemaal zelf weten, maar kies er 1 en ga daarmee verder.
Dave Greebe op 30/07/2014 18:30:00

<?php
while($_POST['id'] <= $rows) {
// bla....
?>
Komt toch op hetzelfde neer??

Nee. De POST heeft verder niets meer met $rows te maken.

Dave Greebe op 30/07/2014 18:30:00

<?php
Notice: Uninitialized string offset: 31 in /Users/davegreebe/Development/ClassicNails-Studio/public_html/phphulp.php on line 64
?>

Heb je wel ook het formulier overgenomen?
Erwin H op 30/07/2014 19:46:38

[quote="Dave Greebe op 30/07/2014 18:30:00"]Blijf wel ff volhouden met code van Frank/Erwin

Even voor de goede orde: het is niet 'mijn' code alszijnde dat ik voorstel dit te gebruiken. Ik probeer er alleen fouten uit te halen.
[/quote]
Bij wijze van spreken....

Verder lijkt het me verstandiger dat je een aanpak gebruikt en niet twee dingen door elkaar gaat gebruiken, daar wordt het voor jezelf niet overzichtelijker op, maar ook het topic wordt een rotzooitje en uiteindelijk kan niemand je meer helpen. Welke aanpak je kiest moet je helemaal zelf weten, maar kies er 1 en ga daarmee verder.


In dat geval ga ik door op de code die jij als voorbeeld had die ik heb uitgebouwd. De code die ik dus net volledige postte.
Die werkt nog niet goed en wil deze maken...

Hoe kan het dat ik geen fouten terugkrijg, wel mn array wordt gevuld met "nieuwe" tekst uit de input-velden maar ze niet worden gezet in de database, en dat de checkboxen gechecked blijven ivm bij false-waarde in de DB uitgevinkt. Dat zou volgens mij wel de bedoeling zijn...
Ik vind niet dat ie dat helemaal zelf moet weten, zoals het nu is opgezet is veel te omslachtig en het geheel is zo lek als een vuurkorf.
Bv om het id te gaan vergelijken met de 'index' van het aantal rijen, dit werkt nu maar zal in de toekomst met aan de zekerheid grenzende waarschijnlijkheid faliekant mis gaan.
Daarnaast wordt er absoluut niet gedaan tegen SQL-injectie, zoals ik in eerdere reactie al heb aangeven kan ik vrij simpel de gehele tabel om zeep helpen.

Dan zie ik ook dat gestart wordt met mysql in OO style, maar bij de update wordt de procedural style gebruikt, ik denk niet dat dit mogelijk is (maar ik kan het mis hebben).
Ger. helder.. Ik ben een beginner maar wil wel alles op goede manier leren. jouw advies is om dat van SanThe gebruiken?
ik weet niet wat goed is of slecht. kom net om de hoek kijken in PHP-wereld dus jullie advies neem ik van harte!...

[size=xsmall]Toevoeging op 31/07/2014 08:16:19:[/size]

EUREKA!!..
mijn script is werkend

<?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 < $rows ; $i++)
$_POST['home'][$i] = false;

if(isset($_POST['home']))
{
// loop door alle elementen van $fotos
for($i = 1 ; $i < $rows ; $i++) {
// indien het id van de foto in de array $_POST['home'] voorkomt
if(in_array($_POST['id'], $_POST['home']))
$_POST['home'][$i] = true;
}
}
// echo '<pre>';
// print_r($_POST);
// echo '</pre>';

foreach($_POST['id'] as $id) {
$title = $_POST['title'][$id];
$caption = $_POST['caption'][$id];
$home = isset($_POST['home'][$id]);
$fotoboek = isset($_POST['fotoboek'][$id]);
$result1=mysqli_query($conn,"UPDATE gallery SET title='$title', caption='$caption', home='$home', fotoboek='$fotoboek' WHERE id='$id'");
}
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['.$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>';
}

<input type="submit" value="Verzenden" />
</form>
?>

Ik kan alles updaten en ook de checkboxen werken zoals het moet. In de database zie ik bij de checkbox een 1 of hij is leeg (NULL ?)
Dit zou eigenlijk volgens mij TRUE of FALSE moeten zijn.
Heb ik toch nog ergens een foutje?

Verder ben ik overigens erg benieuwd op welke plekken ik SQL-injection moet voorkomen? Dit om inderdaad te voorkomen dat alles omzeep wordt geholpen.

Kunnen jullie hier nog advies in geven?
Overal waar je invoer van gebruikers in de query hebt staan.

In PHP is true/false geen tekst maar een boolean. Mysql heeft geen boolean datatype en zo te zien is het in jouw tabel een (var)char.
Je moet dat zelf dus in php doen.

$home = (isset($_POST['home'][$id])) ? 'true' : 'false';
Regels 11 t/m 25 kunnen volgens mij gewoon weg.

Reageren