Php DB auslesen Checkbox problem

10/02/2014 18:39 Warnuk3r#1
Sers, hier mal ein Bild:


Hier mein Code:

PHP Code:
<?php
$sql_select 
$db->query("SELECT * FROM mybb_ugann");
if(!(
mysqli_num_rows($sql_select) == 0)) {
    echo 
'<form method="post" action="ug_ann.php">';
    while (
$row mysqli_fetch_array$sql_selectMYSQL_ASSOC)) {
        
$id $row['ID'];
        
$icon $row['Icon'];
        
$msg $row['Message'];
        
$ugids $row['Usergroups'];
        
$show $row['ShowMessage'];
        echo 
'<input type="hidden" name="ann_id[]" value="'.$id.'" />';
        echo 
'<tr>';
        echo 
'<td class="trow1_ctm"><img src="'.$icon.'" /></td>';
        echo 
'<td class="trow1_ctm"><input type="text" value="'.$icon.'" name="ann_icon[]" /></td>';
        echo 
'<td class="trow1_ctm"><input type="text" value="'.$msg.'" name="ann_msg[]" style="width: 100%" /></td>';
        echo 
'<td class="trow1_ctm"><input type="text" value="'.$ugids.'" name="ann_grpids[]" style="width: 80px;" /></td>';
        if(
$show == 1) {
            echo 
'<td class="trow1_ctm" style="text-align: center;"><input type="checkbox" name="ann_show[]" checked /></td>';
        } else { echo 
'<td class="trow1_ctm" style="text-align: center;"><input type="checkbox" name="ann_show[]" /></td>'; }
        echo
'</tr>';
    }
    echo 
'<tr><td class="trow1" colspan="5"><input type="submit" value="Aktualisieren" name="ann_edit" /></td></tr>';
echo 
"</form>";

if(isset(
$_POST['ann_edit'])) {
    for(
$i 0$i $id$i++) {
        if(!(
$_POST['ann_icon'][$i] == "") AND !($_POST['ann_msg'][$i] == "") AND !($_POST['ann_grpids'][$i] == "")) {
            
$id_n $_POST['ann_id'][$i];
            
$icon_n $_POST['ann_icon'][$i];
            
$msg_n $_POST['ann_msg'][$i];
            
$grpids_n $_POST['ann_grpids'][$i];
            
$showmsg_n $_POST['ann_show'][$i];

            if(isset(
$showmsg_n)) { $doShow 1; } else { $doShow 0; }
echo 
$doShow;
            
$sql_update $db->query('UPDATE mybb_ugann SET Icon = "'.$icon_n.'", Message = "'.$msg_n.'", Usergroups = "'.$grpids_n.'", ShowMessage = "'.$doShow.'" WHERE ID = "'.$id_n.'"');
            if(
$sql_update) {
            } else { echo 
"geht nicht"; }
        }
    }
}

} else {
    echo 
'<tr>';
    echo 
'<td class="trow1" colspan="4" style="text-align: center;">Keine Ankündigungen vorhanden!</td>';
    echo 
'</tr>';
}
?>
Das ganze listet aus einer Tabelle alles aus, dann kann ich das direkt verändern und beim drücken des Buttons updaten. Alles funktioniert außer, dass wenn ich n häckchen bei einer Checkbox setze, dieses sich immer so weit nach oben wie möglich bewegt. Wenn das 1. also gechecked ist und ich z.b. beim letzten n Häckchen mache, update, dann hat das 1. und 2. dann n Häckchen... warum verflucht springt das Teil immer hoch?

Hoffe jemand kann mir ein Tipp geben, danke.

Lg

EDIT: Wenn ich ganz normal Inserte (daher hat die Tabelle ja auch die Inhalte) dann wird die Checkbox richtig angezeigt, der Fehler liegt hier also im Code... das Updated falsch aber sieht eigentlich genau so aus wie die anderen Inhalte der Spalten... wo schleicht sich da der Fehler rum oder bin ich grade echt zu blöd?
10/03/2014 14:52 Schlumpf9#2
Ich kann so weit auch keinen Fehler finden.
Das einzige wo ich mir nicht sicher bin sind folgende Zeilen:
PHP Code:
$showmsg_n $_POST['ann_show'][$i];

if(isset(
$showmsg_n)) { $doShow 1; } else { $doShow 0; } 
Undzwar bin ich mir nicht sicher ob man den Inhalt einer checkbox mit isset() überprüfen kann. Denn isset() liefert ja auch true, wenn z.B. eine Variable nur existiert, egal welcher Inhalt vorliegt.
Versuch mal if($showmsg_n) oder besser if($showmsg_n == true).

Grüße
10/03/2014 18:09 NotEnoughForYou#3
Quote:
Originally Posted by Schlumpf9 View Post
Ich kann so weit auch keinen Fehler finden.
Das einzige wo ich mir nicht sicher bin sind folgende Zeilen:
PHP Code:
$showmsg_n $_POST['ann_show'][$i];

if(isset(
$showmsg_n)) { $doShow 1; } else { $doShow 0; } 
Undzwar bin ich mir nicht sicher ob man den Inhalt einer checkbox mit isset() überprüfen kann. Denn isset() liefert ja auch true, wenn z.B. eine Variable nur existiert, egal welcher Inhalt vorliegt.
Versuch mal if($showmsg_n) oder besser if($showmsg_n == true).

Grüße
Eine Checkbox wird nicht gesetzt wenn sie nicht aktiviert wurde, dh. der POST Wert existiert dann nicht. Daher funktioniert isset in dem Kontext.
10/03/2014 19:43 _robox#4
PHP Code:
$showmsg_n $_POST['ann_show'][$i];

if(isset(
$showmsg_n)) { $doShow 1; } else { $doShow 0; } 
in diesen Fall ist die herangehend weise falsch denn er prüft ja das $showmsg_n schon
vorhanden ist was ja der Fall ist.

er muss schon direkt $_POST['ann_show'][$i] prüfen.

PHP Code:
if(isset($_POST['ann_show'][$i])) { $doShow 1; } else { $doShow 0; } 
10/03/2014 20:31 Schlumpf9#5
Quote:
Originally Posted by _robox View Post
PHP Code:
$showmsg_n $_POST['ann_show'][$i];

if(isset(
$showmsg_n)) { $doShow 1; } else { $doShow 0; } 
in diesen Fall ist die herangehend weise falsch denn er prüft ja das $showmsg_n schon
vorhanden ist was ja der Fall ist.

er muss schon direkt $_POST['ann_show'][$i] prüfen.

PHP Code:
if(isset($_POST['ann_show'][$i])) { $doShow 1; } else { $doShow 0; } 
Das meinte ich eig. auch mit meinen Post, da isset() ja auch prüft, ob eine Variable schon gesetzt wurde, weshalb das dann trotzdem true liefert, auch wenn vom POST nichts kommt. :)
10/03/2014 21:50 _robox#6
PHP Code:
if(!($_POST['ann_icon'][$i] == "") AND !($_POST['ann_msg'][$i] == "") AND !($_POST['ann_grpids'][$i] == "")) { 
außerdem ist die if Überprüfung totaler misst ich Zweifel das sie sauber funktioniert keine isset oder empty Überprüfung Fehler in den Vergleich Operatoren
AND, OR, XOR benützt Mann so eigentlich nicht mehr auch wenn sie weiterhin gültig sind.

Hier mal ein Beispielmit mit isset
PHP Code:
if(isset($_POST['ann_icon'][$i]) && $_POST['ann_icon'][$i] != ''){
$icon_n $_POST['ann_icon'][$i];
}
// und so weider 
für bessere Lesbarkeit und zu Fehler Minimierung Solde Mann alle
$_POST Element eine eigne if Überprüfung verwandten.
10/04/2014 03:03 Warnuk3r#7
Hatte kein Bock einen sauberen Code etc. zu machen war einfach echt Faul letztens.

Ich habe das ganze mal Lokal bei mir ausprobiert. Zuerst schön nur einen einzelnen Datensatz updaten, funktioniert. Dann habe ich das ganze noch einmal sauber (lesen / updaten einzeln in seperaten Dateien) rekonstruiert und das Problem ist immer noch vorhanden. Habe alles Mögliche versucht und am Ende den Checkboxen feste Namen zugeordnet (am Ende immer eine Nummerierung generiert ann_showmsg_ + id) und damit klappt es.

Würde trotzdem gerne wissen, wie man das mit Arrays hin bekommt.

Hat denn jemand das ganze auch mal ausprobiert, oder könnte dies für mich bitte tun? Mir platzt langsam der Kopf von lauter Checkboxen.... was mache ich da nur falsch?

Hier mal mein verbesserter Code:

Falls ihr noch generelle Tipps habt oder sonst was zu meckern habt bitte her damit. Und das mit den Checkbox-Arrays wäre auch noch interessant zu wissen.
10/04/2014 11:42 _robox#8
Die HTML Ausgabe gehört an den Schluss nicht an den Anfang erst müssen alle php relevanten Sachen abgearbeitet sein.


wie ich gerate sehe ist die zweite for schleife überflüssig für deinen Zweck reicht die erste aus
außerdem musst sie anders gestalten so wird sie nie sauber durchlaufen.

PHP Code:
  for ($i 0$i count($_POST['ann_id']); $i++) {
        
 } 


noch ein kleiner Tip
ich würde die if Überprüfung so schreiben das nur eine Bedingung erfüllt sein muss
PHP Code:
if(!isset($_POST['ann_id'][$i]) || $_POST['ann_id'][$i] == '') {
            
$error true; break;
        } 
So habe dein Code mal bearbeitet wie ich in schreiben würde und alle Fehler die ich erkannt habe korrigiert.
habe den Code nicht getestet wenn ich jetzt nicht noch ein Fehler eingeschlichen hat Solde er so ohne Probleme Durchlaufen.
10/04/2014 18:47 Warnuk3r#9
Quote:
Originally Posted by _robox View Post
Die HTML Ausgabe gehört an den Schluss nicht an den Anfang erst müssen alle php relevanten Sachen abgearbeitet sein.
Könntest du all deine Aussagen auch mal begründen? Warum? Wenn ich das Zeug ins Forum wieder einbaue dann ist die Reihenfolge so oder so anders und lässt sich kaum ändern, von daher ist es dann eh egal.

Quote:
Originally Posted by _robox View Post
wie ich gerate sehe ist die zweite for schleife überflüssig für deinen Zweck reicht die erste aus
außerdem musst sie anders gestalten so wird sie nie sauber durchlaufen.
Als ich das ganze ins Forum eingebaut habe, musste ich die erste Schleife eh ändern. Somit hat sich das Problem dann erledigt gehabt. Wie sollte ich das denn aber machen mit nur einer Schleife, wenn ich alle Felder einzeln überprüfe und nicht so wie vorhin alle gleichzeitig? Ich will ja erst am Ende das Update durchführen (evtl. mit Multiple Statements da lese ich mich noch ein), aber nicht direkt eins nach dem anderen und wenn eins nicht geht wirds übersprungen. Einfach aus dem Grund, weil ich kaum Platz für die Fehlermeldungen habe. Da darf höchstens eine kommen, daher möchte ich das so handhaben.

Quote:
Originally Posted by _robox View Post
noch ein kleiner Tip
ich würde die if Überprüfung so schreiben das nur eine Bedingung erfüllt sein muss
PHP Code:
if(!isset($_POST['ann_id'][$i]) || $_POST['ann_id'][$i] == '') {
            
$error true; break;
        } 
Das stimmt, danke.
10/04/2014 19:30 _robox#10
ein Script wird immer von Zeile 0 an bis zur letzten Zeile abgearbeitet

deswegen ist es ratsam erst alle INSERT , UPDATE und sonstigen Daten die für die Ausgabe benötigt werden vor der Ausgabe abzuarbeiten.

deswegen reicht es in deinen Fall auch nur eine for schleife indem du der reihe nach erst dein Überprüfung machst.
und danach weiden aufgaben abarbeiten lassen kannst.
außer dem wenn du mit zwei schleifen arbeitest braust du mehr Ressourcen
und die zweite schleifen laut erst an wenn die erste abgeschlossen ist da durch kann es fortkommen
das die zweite schleife gar nicht anlauft wenn in den letzten schleifen Durchlauf der ersten schleifen ein Fehler gab oder die zweite schleife lauft komplett durch trotz Fehler in der ersten schleife wenn der letzte Durchlauf in ersten schleife true ergibt.



an stelle von break mit denn du ja die schleife verlast benützt du einfach
continue dabei überspringst du den aktuellen schleifen Durchlauf.

das du keine platz für Fehlermeldungen hast glaube ich nicht den da gibt es mehrerer Lösungen
entweder alle in einen block über, unter, rechts , links oder Pop-up Container und oder einzeln
über, unter, rechts , links des Eingabe Element.
was für dich in frage kommt musst du selber entscheiden.
du darfst dann eben nicht die Fehlermeldungen innerhalb der schleife mit echo ausgeben
musst das anders regeln dazu eignet sie sowohl ein array oder auch ein string.
Beispiel mit einen array

PHP Code:
$errorMsg = array();
    
// Durchgaenge zum Ueberpruefe
    
for ($i 0$i count($array); $i++) {

       
        
// Ueberpruefe ann_id
        
if (!isset($array['id'][$i]) || $array['id'][$i] == '') {
        
$errorMsg[] = 'deine gewünschte Fehlermeldung ';
        continue;
        }
 
// und so weider
}//ende der for schleife
// ausgabe in block
 
if (isset($errorMsg) && is_array($errorMsg) && count($errorMsg) > 0) {
echo 
'<div style="display: inline !IMPORTANT;" id="flash_message" class="error">';
echo 
implode("<br />"$errorMsg);
echo 
'</div>';