2016-04-18 22 views
2

So weiß ich, was das Skript macht und ich denke, ich verstehe, warum es 3 Mal angezeigt wird, aber ich bin mir nicht sicher, wie es zu beheben ist! HierPHP liefert verdreifachte Ergebnisse

ist das Skript, wie es steht:

$flagquery = "SELECT incident_flag FROM incident_attributes WHERE incident=2157"; 
$flagresult = mysqli_query($conn, $flagquery); 
if (mysqli_num_rows($flagresult) > 0) { 
while($firow = mysqli_fetch_array($flagresult)){ 

    foreach ($items as $flagrow) { 
    $id = $flagrow['id']; 
    $name = htmlspecialchars($flagrow['name'], ENT_QUOTES); 

    $form .= " <div class='form-group'> 
        <label class='col-sm-2 control-label'>$name</label> 
        <div id='name-input-wrapper' class='col-sm-8 controls'> 
        <input type='checkbox' value='$id' name='flags[]' "; 
    if ($firow["incident_flag"] == $id) $form .= 'checked'; 

    $form .= "> 
        </div> 
       </div>"; 
    } 
} 
} 
echo $form; 

Hier ist das zugehörige Array

Array 
(
[1] (Array 
    (
     [id] => 1 
     [name] => Bag 
     [flag] => 0 
    ) 

[2] => Array 
    (
     [id] => 2 
     [name] => Screen 
     [flag] => 0 
    ) 

[3] => Array 
    (
     [id] => 3 
     [name] => HD 
     [flag] => 0 
    ) 

) 

Hier ist die mysql DB incident_attributes

id incident incident_flag 
1 2157 1 
2 2157 2 
3 2157 3 

Das ganze Ziel des Skripts soll das Kästchen markieren. Irgendwelche anderen Ansätze dazu?

Antwort

2

Sie echo 3 Kontrollkästchen für jede Zeile das Ergebnis (3), so dass Sie 9 Kontrollkästchen statt 3. Sie haben die beiden foreach, invertieren und verschachtelte foreach zu checked Auswertung zu begrenzen.

Da das Abfrageergebnis die verschachtelte foreach werden, müssen Sie Zeilen vor der Ausführung Schleifen holen:

$firows = mysqli_fetch_all($flagresult, MYSQLI_ASSOC); 

foreach($items as $flagrow) 
{ 
    $id = $flagrow['id']; 
    $name = htmlspecialchars($flagrow['name'], ENT_QUOTES); 

    $form .= " <div class='form-group'> 
        <label class='col-sm-2 control-label'>$name</label> 
        <div id='name-input-wrapper' class='col-sm-8 controls'> 
        <input type='checkbox' value='$id' name='flags[]' "; 
    foreach($firows as $firow) 
    { 
     if($firow["incident_flag"] == $id) $form .= 'checked'; 
    } 

    $form .= "> 
        </div> 
       </div>"; 
} 

Als Alternative (ohne verschachtelte foreach):

$firows = mysqli_fetch_all($flagresult, MYSQLI_ASSOC); 
$flags = array_column($firows, 'incident_flag'); // $flags now is [ 1,2,3 ] 

foreach($items as $flagrow) 
{ 
    (...) 
    $form .= " <div class='form-group'> ... " 
    if(in_array($id, $flags)) $form .= 'checked'; 
    (...) 
} 
+0

Dieses wunderschön gearbeitet! Danke! – sensualstares

Verwandte Themen