Door
Bas van de Ven
op 19-01-2022 21:15
gewijzigd op 19-01-2022 21:20
2.077 views
In mijn programma zijn er ooien gedekt door rammen en deze vormen samen een koppel. Deze dekkingen zijn eerder ingelezen in mijn programma. Dus deze koppels bestaan al in de database.
Op enig moment krijgt de ooi een echo om te zien of ze drachtig is. Dit moment wordt gescand met een reader. De reader wordt uitgelezen in mijn programma en de drachtdatum en oornummer van het ooi wordt getoond per regel (record) op de internetpagina. Deze drachtlijst wordt gecontroleerd en daarna ingelezen in mijn programma. Tijdens de controle kan per regel de ooi nog worden gewijzigd m.b.v. een keuzelijst. Als een andere ooi is gekozen wil ik m.b.v. javascript automatisch de ram tonen die bij die nieuw gekozen ooi hoort.
Ik ben aan het testen met 3 (dracht)records. Als ik de ooi wijzig in het eerste record (uit de while loop) werkt de javascript prima. Bij het 2e en 3e record werkt de javascript niet. Bij die records/regels wijzigt er niets.
Hieronder staat mijn code. Wat doe ik fout?
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<title>Registratie</title>
</head>
<body>
<?php
Include "connect_db.php";
// Array tbv javascript om vader automatisch te tonen
$zoek_laatste_dekkingen = mysqli_query($db,"
SELECT v.mdrId, right(vdr.levensnummer,5) lev
FROM tblVolwas v
join (
SELECT v.mdrId, max(v.volwId) volwId
FROM tblVolwas v
left join tblHistorie hv on (hv.hisId = v.hisId)
left join tblDracht d on (v.volwId = d.volwId)
left join tblHistorie hd on (hd.hisId = d.hisId)
left join tblSchaap k on (k.volwId = v.volwId)
left join (
SELECT s.schaapId
FROM tblSchaap s
join tblStal st on (s.schaapId = st.schaapId)
join tblHistorie h on (st.stalId = h.stalId)
WHERE h.actId = 3
) ha on (k.schaapId = ha.schaapId)
WHERE (isnull(hv.hisId) or hv.skip = 0) and (isnull(hd.hisId) or hd.skip = 0) and isnull(ha.schaapId)
GROUP BY v.mdrId
) lv on (v.volwId = lv.volwId)
join tblSchaap vdr on (vdr.schaapId = v.vdrId)
") or die (mysqli_error($db));
while ( $zld = mysqli_fetch_assoc($zoek_laatste_dekkingen)) { $array_vader_uit_koppel[$zld['mdrId']] = $zld['lev']; }
// Einde Array tbv javascript om vader automatisch te tonen
?>
<script>
function toon_dracht() {
var moeder = document.getElementById("moeder"); var mr = moeder.value;
if(mr.length > 0) toon_vader_uit_koppel(mr);
}
var jArray_vdr = <?php echo json_encode($array_vader_uit_koppel); ?>;
function toon_vader_uit_koppel(m) {
if(jArray_vdr[m] != null)
{
document.getElementById('vader').style.display = "none";
document.getElementById('vader').value = null; // veld leegmaken indien gevuld
document.getElementById('result_vader').innerHTML = jArray_vdr[m];
}
else
{
document.getElementById('vader').style.display = "inline-block";
document.getElementById('result_vader').innerHTML = "";
}
}
</script>
<form action="phpHulp.php" method = "post">
<table border = 0>
<tr valign = bottom style = "font-size : 12px;">
<th>Moeder<hr></th>
<th>Vader<hr></th>
<th><hr></th>
</tr>
<?php
// Declaratie MOEDERDIEREN
$zoek_moederdieren = mysqli_query($db,"
SELECT st.schaapId, s.levensnummer, right(s.levensnummer,5) werknr
FROM tblSchaap s
join tblStal st on (st.schaapId = s.schaapId)
join tblVolwas v on (s.schaapId = v.mdrId)
WHERE st.lidId = 13 and v.vdrId is not null
ORDER BY right(s.levensnummer,5)
") or die (mysqli_error($db));
$index = 0;
while ($mdr = mysqli_fetch_assoc($zoek_moederdieren))
{
$mdrkey[$index] = $mdr['schaapId'];
$wnrOoi[$index] = $mdr['werknr'];
$index++;
}
unset($index);
// EINDE Declaratie MOEDERDIEREN
$velden = mysqli_query($db,"
SELECT rd.Id
FROM impAgrident rd
WHERE rd.lidId = 13 and rd.actId = 19 and isnull(verwerkt)
ORDER BY str_to_date(rd.datum,'%d/%m/%Y'), rd.Id
") or die (mysqli_error($db));
while ($vldn = mysqli_fetch_assoc($velden)) {
?>
<tr style = "font-size:14px;">
<td style = "font-size : 11px;">
<select id="moeder" onchange = "toon_dracht()" style= "width:65; font-size:12px;" name = <?php echo "kzlOoi_$Id"; ?> >
<option></option>
<?php $count = count($wnrOoi);
for ($i = 0; $i < $count; $i++){
$opties = array($mdrkey[$i]=>$wnrOoi[$i]);
foreach($opties as $key => $waarde)
{
if ((!isset($_POST['knpVervers_']) && $mdrId_rd == $key) || (isset($_POST["kzlOoi_$Id"]) && $_POST["kzlOoi_$Id"] == $key)){
echo '<option value="' . $key . '" selected>' . $waarde . '</option>';
} else {
echo '<option value="' . $key . '" >' . $waarde . '</option>';
}
}
}
?> </select>
</td>
<td>
<select style= "width:125; font-size:12px;" id="vader" name = <?php echo "kzlRam_$Id"; ?> >
<option></option>
<?php $count = count($lvnrRam);
for ($i = 0; $i < $count; $i++){
$opties= array($vdrkey[$i]=>$lvnrRam[$i]);
foreach ($opties as $key => $waarde)
{
if ((!isset($_POST['knpVervers_']) && $ram_db == $vdrRaak[$i]) || (isset($_POST["kzlRam_$Id"]) && $_POST["kzlRam_$Id"] == $key)){
echo '<option value="' . $key . '" selected>' . $waarde . '</option>';
} else {
echo '<option value="' . $key . '" >' . $waarde . '</option>';
}
}
} ?>
</select><p id="result_vader"></p>
</td>
</tr>
<?php } ?>
</table>
</form>
</body>
</html>
Waarom zou je de hele JavaScript constant opnieuw uitvoeren in je while-loop?
Ik denk eerder dat je jouw data (uit jArray_vdr ) die je aan je Javascript voert juist enkel in een while wilt vullen.
Als we het toch over D.R.Y hebben, dan kan je die twee foreaches ook meteen netjes verpakken in een eigen gemaakte PHP-functie. Nog een verbeterpuntje is dat je ook het ID nummer mee kan geven als extra array-element: $_POST['ram'][$id]
Dan kan je meteen mooie filters maken als je wilt.
Het enigste dat in een while loop zit is het aanroepen van de functie toon_dracht(). Zie regel 119 binnen while ($vldn = mysqli_fetch_assoc($velden))
De while loop ( $zld = mysqli_fetch_assoc($zoek_laatste_dekkingen)) op regel 36 wordt in dezelfde regel gesloten. Dus ik begrijp niet op welke loop je doelt.
Ik wil een lijst met koppels (ooi-ram) samenstellen die wordt gebruikt in de while loop while ($vldn = mysqli_fetch_assoc($velden)).
Op elke regel (als output van de while loop) kan de ooi worden gewijzigd. Zodra een ooi wijzigt wil ik op betreffende regel automatisch bijbehorende ram tonen. Dit o.b.v. de samengestelde lijst met koppels.
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<title>Registratie</title>
</head>
<body>
<?php
Include "connect_db.php";
function kzl_loop($ArrayKey, $ArrayName, $dbKey, $btnRefresh, $fldKey) {
$count = count($ArrayName);
for ($i = 0; $i < $count; $i++){
$opties = array($ArrayKey[$i]=>$ArrayName[$i]);
foreach($opties as $key => $waarde)
{
if ((!isset($btnRefresh) && $dbKey == $key) || (isset($fldKey) && $fldKey == $key)){
echo '<option value="' . $key . '" selected>' . $waarde . '</option>';
} else {
echo '<option value="' . $key . '" >' . $waarde . '</option>';
}
}
}
}
// Array tbv javascript om vader automatisch te tonen
$zoek_laatste_dekkingen = mysqli_query($db,"
SELECT v.mdrId, right(vdr.levensnummer,5) lev
FROM tblVolwas v
join (
SELECT v.mdrId, max(v.volwId) volwId
FROM tblVolwas v
left join tblHistorie hv on (hv.hisId = v.hisId)
left join tblDracht d on (v.volwId = d.volwId)
left join tblHistorie hd on (hd.hisId = d.hisId)
left join tblSchaap k on (k.volwId = v.volwId)
left join (
SELECT s.schaapId
FROM tblSchaap s
join tblStal st on (s.schaapId = st.schaapId)
join tblHistorie h on (st.stalId = h.stalId)
WHERE h.actId = 3
) ha on (k.schaapId = ha.schaapId)
WHERE (isnull(hv.hisId) or hv.skip = 0) and (isnull(hd.hisId) or hd.skip = 0) and isnull(ha.schaapId)
GROUP BY v.mdrId
) lv on (v.volwId = lv.volwId)
join tblSchaap vdr on (vdr.schaapId = v.vdrId)
") or die (mysqli_error($db));
while ( $zld = mysqli_fetch_assoc($zoek_laatste_dekkingen)) {
$array_vader_uit_koppel[$zld['mdrId']] = $zld['lev'];
}
// Einde Array tbv javascript om vader automatisch te tonen
?>
<script>
function toon_dracht() {
var moeder = document.getElementById("moeder"); var mr = moeder.value;
if(mr.length > 0) toon_vader_uit_koppel(mr);
}
var jArray_vdr = <?php echo json_encode($array_vader_uit_koppel); ?>;
function toon_vader_uit_koppel(m) {
//document.getElementById('result_vader').innerHTML = jArray_vdr[m];
if(jArray_vdr[m] != null)
{
document.getElementById('vader').style.display = "none";
document.getElementById('vader').value = null; // veld leegmaken indien gevuld
document.getElementById('result_vader').innerHTML = jArray_vdr[m];
}
else
{
//document.getElementById('vader').style.display = "block";
document.getElementById('vader').style.display = "inline-block";
document.getElementById('result_vader').innerHTML = "";
}
}
</script>
<form action="phpHulp.php" method = "post">
<table border = 0>
<tr valign = bottom style = "font-size : 12px;">
<th>Moeder<hr></th>
<th>Vader<hr></th>
<th><hr></th>
</tr>
<?php
// Declaratie MOEDERDIEREN
$zoek_moederdieren = mysqli_query($db,"
SELECT st.schaapId, s.levensnummer, right(s.levensnummer,5) werknr
FROM tblSchaap s
join tblStal st on (st.schaapId = s.schaapId)
join tblVolwas v on (s.schaapId = v.mdrId)
WHERE st.lidId = 13 and v.vdrId is not null
ORDER BY right(s.levensnummer,5)
") or die (mysqli_error($db));
$index = 0;
while ($mdr = mysqli_fetch_assoc($zoek_moederdieren))
{
$mdrkey[$index] = $mdr['schaapId'];
$wnrOoi[$index] = $mdr['werknr'];
$index++;
}
unset($index);
// EINDE Declaratie MOEDERDIEREN
$velden = mysqli_query($db,"
SELECT rd.Id
FROM impAgrident rd
WHERE rd.lidId = 13 and rd.actId = 19 and isnull(verwerkt)
ORDER BY str_to_date(rd.datum,'%d/%m/%Y'), rd.Id
") or die (mysqli_error($db));
while ($vldn = mysqli_fetch_assoc($velden)) {
$Id = $vldn['Id']; ?>
<tr style = "font-size:14px;">
<td style = "font-size : 11px;">
<select id="moeder" onchange = "toon_dracht()" style= "width:65; font-size:12px;" name = 'kzlOoi' >
<option></option>
<?php
kzl_loop($mdrkey, $wnrOoi, $mdrId_rd, $_POST['knpVervers'], $_POST['kzlOoi'][$Id]); ?>
</select>
</td>
<td>
<select style= "width:125; font-size:12px;" id="vader" name = 'kzlRam' >
<option></option>
<?php
kzl_loop($vdrkey, $lvnrRam, $ram_db, $_POST['knpVervers'], $_POST['kzlRam'][$Id]); ?>
</select><p id="result_vader"></p>
</td>
</tr>
<?php } ?>
</table>
</form>
</body>
</html>
[size=xsmall]Toevoeging op 22/01/2022 12:33:14:[/size]
Nu hoop ik nog dat er iemand is die antwoord kan geven op mijn vraag of kan vertellen waar ik een oplossing kan vinden. :)
Deze heb ik nl. nog niet gevonden.
[size=xsmall]Toevoeging op 22/01/2022 19:41:53:[/size]
Ik heb zelf een oplossing gevonden.
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<title>Registratie</title>
</head>
<body>
<?php
Include "connect_db.php";
function kzl_loop($ArrayKey, $ArrayName, $dbKey, $btnRefresh, $fldKey) {
$count = count($ArrayName);
for ($i = 0; $i < $count; $i++){
$opties = array($ArrayKey[$i]=>$ArrayName[$i]);
foreach($opties as $key => $waarde)
{
if ((!isset($btnRefresh) && $dbKey == $key) || (isset($fldKey) && $fldKey == $key)){
echo '<option value="' . $key . '" selected>' . $waarde . '</option>';
} else {
echo '<option value="' . $key . '" >' . $waarde . '</option>';
}
}
}
}
// Array tbv javascript om vader automatisch te tonen
$zoek_laatste_dekkingen = mysqli_query($db,"
SELECT v.mdrId, right(vdr.levensnummer,5) lev
FROM tblVolwas v
join (
SELECT v.mdrId, max(v.volwId) volwId
FROM tblVolwas v
left join tblHistorie hv on (hv.hisId = v.hisId)
left join tblDracht d on (v.volwId = d.volwId)
left join tblHistorie hd on (hd.hisId = d.hisId)
left join tblSchaap k on (k.volwId = v.volwId)
left join (
SELECT s.schaapId
FROM tblSchaap s
join tblStal st on (s.schaapId = st.schaapId)
join tblHistorie h on (st.stalId = h.stalId)
WHERE h.actId = 3
) ha on (k.schaapId = ha.schaapId)
WHERE (isnull(hv.hisId) or hv.skip = 0) and (isnull(hd.hisId) or hd.skip = 0) and isnull(ha.schaapId)
GROUP BY v.mdrId
) lv on (v.volwId = lv.volwId)
join tblSchaap vdr on (vdr.schaapId = v.vdrId)
") or die (mysqli_error($db));
while ( $zld = mysqli_fetch_assoc($zoek_laatste_dekkingen)) {
$array_vader_uit_koppel[$zld['mdrId']] = $zld['lev'];
}
// Einde Array tbv javascript om vader automatisch te tonen
?>
<script>
function toon_dracht(id) {
var ooi = 'moeder_' + id;
var moeder = document.getElementById(ooi); var mr = moeder.value;
if(mr.length > 0) toon_vader_uit_koppel(mr, id);
}
var jArray_vdr = <?php echo json_encode($array_vader_uit_koppel); ?>;
function toon_vader_uit_koppel(m, i) {
//document.getElementById('result_vader').innerHTML = jArray_vdr[m];
var ram = 'vader_' + i;
var resultVdr = 'result_vader_' + i;
if(jArray_vdr[m] != null)
{
document.getElementById(ram).style.display = "none";
document.getElementById(ram).value = null; // veld leegmaken indien gevuld
document.getElementById(resultVdr).innerHTML = jArray_vdr[m];
}
else
{
//document.getElementById(ram).style.display = "block";
document.getElementById(ram).style.display = "inline-block";
document.getElementById(resultVdr).innerHTML = "";
}
}
</script>
<form action="phpHulp.php" method = "post">
<table border = 0>
<tr valign = bottom style = "font-size : 12px;">
<th>Moeder<hr></th>
<th>Vader<hr></th>
<th><hr></th>
</tr>
<?php
// Declaratie MOEDERDIEREN
$zoek_moederdieren = mysqli_query($db,"
SELECT st.schaapId, s.levensnummer, right(s.levensnummer,5) werknr
FROM tblSchaap s
join tblStal st on (st.schaapId = s.schaapId)
join tblVolwas v on (s.schaapId = v.mdrId)
WHERE st.lidId = 13 and v.vdrId is not null
ORDER BY right(s.levensnummer,5)
") or die (mysqli_error($db));
$index = 0;
while ($mdr = mysqli_fetch_assoc($zoek_moederdieren))
{
$mdrkey[$index] = $mdr['schaapId'];
$wnrOoi[$index] = $mdr['werknr'];
$index++;
}
unset($index);
// EINDE Declaratie MOEDERDIEREN
?>
<tr><td>
<input type = "submit" name = "knpVervers" value = "Verversen">
</td></tr>
<?php
$velden = mysqli_query($db,"
SELECT rd.Id, moeder
FROM impAgrident rd
WHERE rd.lidId = 13 and rd.actId = 19 and isnull(verwerkt)
ORDER BY str_to_date(rd.datum,'%d/%m/%Y'), rd.Id
") or die (mysqli_error($db));
while ($vldn = mysqli_fetch_assoc($velden)) {
$Id = $vldn['Id']; ?>
<tr style = "font-size:14px;">
<td style = "font-size : 11px;">
<?php echo $Id; ?>
<select id= <?php echo "moeder_$Id"; ?> onchange = <?php echo "toon_dracht(".$Id.")"; ?> style= "width:65; font-size:12px;" name = 'kzlOoi' >
<option></option>
<?php
kzl_loop($mdrkey, $wnrOoi, $mdrId_rd, $_POST['knpVervers'], $_POST['kzlOoi'][$Id]); ?>
</select>
</td>
<td>
<select style= "width:125; font-size:12px;" id= <?php echo "vader_$Id"; ?> name = 'kzlRam' >
<option></option>
<?php
kzl_loop($vdrkey, $lvnrRam, $ram_db, $_POST['knpVervers'], $_POST['kzlRam'][$Id]); ?>
</select><p id= <?php echo "result_vader_$Id"; ?> ></p>
</td>
</tr>
<?php } ?>
</table>
</form>
</body>
</html>
Nu weet ik alleen niet hoe ik de waarde in $Id uit $_POST['kzlOoi'][$Id] kan halen. Maar ik kan weer vooruit met $_POST["kzlOoi_$Id"].
kzlOoi heeft te maken met mijn manier van programmeren, nl. de herkenbaarheid van mijn programmacode.
kzl staat voor keuzelijst (HTML element) kzlOoi is dus de naam van een keuzelijst met ooien.
txtAanvdm bijv. staat voor textveld aanvoerdatum.
chbKies bijv. is een checkbox. Is deze checkbox aangevinkt dan wil men het desbetreffende record op de pagina (na controle, zie 1e post in deze topic) inlezen in de database.
knpVervers bijv. staat voor knop (type submit) verversen van de pagina. Na het aanbrengen van wijzigingen klikt men op knpVervers en wordt elke regel op de pagina gevalideerd. Is een regel juist ingevuld dan is chbKies van die regel automatisch aangevinkt anders krijgt chbKies de status disabled.
$Id bevat het record_id van een record uit de database tabel. Elke regel op de pagina is een record en heeft zijn eigen unieke Id.
Na opslaan van de pagina worden diverse regels met steeds een ooi-nummer als waarde opgestuurd. Door $Id mee te geven weet ik welk ooi-nummer uit welke tabel-record komt.
Ik heb (dus) ook een knop 'opslaan' nl. knpSave. De php-code achter deze knop ziet er zo uit.
<?php
function getNameFromKey($key) {
$array = explode('_', $key);
return $array[0];
}
function getIdFromKey($key) {
$array = explode('_', $key);
return $array[1];
}
$array = array();
foreach($_POST as $key => $value) {
$array[getIdFromKey($key)][getNameFromKey($key)] = $value;
}
foreach($array as $recId => $id) { //$recId is het record_id uit de database tabel opgehaald uit de veldnaam
unset($fldRam);
unset($fldGrootte);
foreach($id as $key => $value) {
if ($key == 'chbKies') { $fldKies = $value; } //
if ($key == 'chbDel') { $fldDel = $value; } // elke regel op de pagina kan 'individueel' worden verwijderd. Is deze checkbox aangevinkt dan wil men de regel op de pagina verwijderen.
if ($key == 'txtDatum' && !empty($value)) { $dag = date_create($value); $valuedag = date_format($dag, 'Y-m-d');
$fldDag = $valuedag; }
if ($key == 'kzlOoi' && !empty($value)) { $fldOoi = $value; }
if ($key == 'kzlRam' && !empty($value)) { $fldRam = $value; }
if ($key == 'txtGrootte' && !empty($value)) { $fldGrootte = $value; }
}
// HIER DE CODE OM DE DATABASE BIJ TE WERKEN
}
?>
Met jouw voorstel $_POST['kzlOoi'][$Id] weet ik niet de waarde in $Id op te halen bij het versturen van de pagina. Deze waarde heb ik nodig binnen de code om de database bij te werken.