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.
fetch_array(1) houdt in dat het een associative array is. soms staat het er ook zo;
fetch_array(MYSQLI_ASSOC)

Het is inderdaad de bedoeling dat $fotos alles krijgt, maar op dit moment lijkt het erop dat hij er maar 1 pakt :(

Regel 81 is overigens;

<?php
in het form:
echo '<input type="text" name="title[]" value="'.$fotos['title'].'" />';

?>
Frank jouw voorbeeld is net als over Rotterdam van Amsterdam naar Utrecht rijden.

Erwin zijn voorbeeld is beter.
Ger, ja om de gegevens enkel op het scherm te krijgen wel maar de TS wil ook na een post UPDATEN. En dat is iets waar hij door niemand behalve door mij bij geholpen wordt tot nu toe. (dit in combinatie met name="title[]" inputs en checkboxen die alleen een postwaarde geven als ze aanstaan). En dat maakt het geheel best wel ingewikkeld voor iemand die er nog niet zo heel lang mee aan het stoeien is
>> En dat is iets waar hij door niemand behalve door mij bij geholpen wordt tot nu toe ..
Hoezo alleen door jou?
Ger van Steenderen op 25/07/2014 17:51:50

Je geeft het id mee in de naam van de input, als volgt:

<input type="text" name="title[<?php echo $row['id']; ?>]" value="<?php echo $row['title']; ?>>
Als je dit ook voor de andere inputs doet, kan je die als volgt uitlezen
<?php
foreach ($_POST['title'] as $id => $title) {
	$home = (in_array($id, $_POST['checkboxHome'])) ? : false;
	// je kan de anderen velden dan aanroepen met
	// $_POST['veldnaam'][$id]
}
?>



Frank Nietbelangrijk op 29/07/2014 13:09:30

En dat maakt het geheel best wel ingewikkeld voor iemand die er nog niet zo heel lang mee aan het stoeien is

Ik krijg inderdaad wel de indruk dat het lastig is. Zat gister al te denken of een option-box niet eenvoudiger is. 4 opties die je kan kiezen, offline, homepage, fotoboek, home en fotoboek.
Is dat ook eenvoudiger of lijkt het maar zo?

Je zou het eigenlijk moeten testen met echte gebruikers (is het objectieve antwoord), maar mijn inschatting is dat twee checkboxes hier toch het duidelijkst zijn:

[ ] Fotoalbum [ ] Homepage

Je hebt namelijk niet echt vier keuzen, maar slechts twee keuzen die logisch samenhangen.


+----+-----------------------+
| 00 | Offline               |
| 10 | Fotoalbum             |
| 01 | Homepage              |
| 11 | Fotoalbum en homepage |
+----+-----------------------+
Ben in middels al een stukje verder... met alle input van jullie heb ik alles samengevoegd maar ik ben er helaas nog niet helemaal.... Ik kon net updaten maar ik ben toen iets gaan aanpassen en nu kan ik opeens niet meer updaten, terwijl als ik de array uitprint, dan zie ik wel de juiste tekst in de juiste variabele...
vinkjes staat nu altijd aan, ookal is het in de DB op false. dit veranderd ook niet als ik de vinkjes uitzet of weer aan...

Als ik een vinkje UIT zet, dan zie ik ook dat hij in de POST goed meepakt, wat ik mis een ID bij de HOME (als ik die uitvink) dus hij ziet wel dat ik iets doe maar hij is en blijft aangevinkt.

Wat ik heb is. Weer volledige code omdat ik $fotos[$i] in de $_POST heb moeten aanpassen omdat $fotos niet bestond. Dat klopte ook omdat ik die array niet had (zat niveau lager) en daardoor kon ik alles via $_POST['title'] aanroepen.

<?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')
{
/*
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 = 1 ; $i < count($rows) ; $i++)
$_POST['id'][$i]['home'] = false;

/*
checkboxen worden alleen maar gepost als ze aanstaan.
Als ze allemaal uitstaan dan is er ook geen variabele $_POST['home'] en we moeten
dit dus eerst controleren.
*/
if(isset($_POST['home']))
{
// loop door alle elementen van $fotos
for($i = 1 ; $i < count($rows) ; $i++) {
// indien het id van de foto in de array $_POST['home'] voorkomt
if(in_array($_POST[$i], $_POST['home']))
$_POST['id'][$i]['home'] = 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)
// {
// $_POST[$i++]['title'] = $title; // de ++ achter $i++ zorgt er voor dat $i met 1 verhoogd wordt.
// }

echo '<pre>';
print_r($_POST);
echo '</pre>';

$id = $_POST['id'];
$title = $_POST['title'];
$caption = $_POST['caption'];
$home = $_POST['home'];
$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 id='$id[$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>

?>

kortom; vinkjes werken niet en ondanks dat mijn aangepaste tekst in de post zit, krijg ik het niet in de DB.
Dus na doe je eerst al deze moeite om de aangezette vinkjes in de POST array om te vormen:

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

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

Maar vervolgens gebruik je dat niet, want je kijkt weer gewoon naar $_POST['home']:

<?php
$home = $_POST['home'];  //moet dit niet $_POST['id'] zijn?
$result1=mysqli_query(
  $conn, 
  "UPDATE gallery 
   SET title='$title[$i]', 
       caption='$caption[$i]', 
       home='$home[$i],             
       fotoboek='$fotoboek[$i]' 
   WHERE id='$id[$i]'");       //en hier home='$home[$i]['home']'? 
?>

Overigens mist er ook een quotje bij home='$home[$i] (geen afsluitende quote).
Ik zou dan toch moeten verwachten dat er in mijn DB false of true moet veranderen?
Dat zie ik niet gebeuren...

Tevens heb ik vinkjes terwijl de value in de DB false is en dan zou ik geen vinkje moeten hebben of werkt dat toch even anders?

en hoe kan het dat de waarde in mijn post, niet in mijn db komt? bij een print_r zie ik het wel staan maar vervolgens wordt er niets gedaan daarmee

Reageren