2017-01-25 3 views
0

Ich habe zwei Tabellen, post_languages (Spalten: languageID, languageName) und post_to_languages (languageID, postID) und ein Auswahl-Formular.Mark mehr Optionen ausgewählt, Datenbank führt

Ich möchte ein oder mehrere Optionstags markieren, wie von LanguageID anhand der Ergebnisse aus der Datenbank ausgewählt. Ich möchte nicht nur die Sprachen anzeigen, sondern sie als ausgewählt aus einer Liste von Sprachen markieren, die von der Tabelle post_languages ​​bereitgestellt werden.

Was habe ich versucht, aber nur eine Sprache ausgewählt wird, $res gibt nur eine ID:

$stmt = $db->prepare('SELECT languageID FROM post_to_languages WHERE postID = :postID'); 
$stmt->execute(array(':postID'=>$postID)); 
$result = $stmt->fetch(PDO::FETCH_ASSOC); 
$stmt2 = $db->prepare('SELECT languageID, languageName FROM post_languages ORDER BY languageName'); 
$stmt2->execute(); 
echo '<select class="post-language form-control" name="postLangID[]" multiple="multiple" required>'; 
while($row2 = $stmt2->fetch()){ 
    foreach ($result as $res) { 
     if ($row2['languageID'] == $res) { 
      $selected = 'selected'; 
     } else { 
      $selected = ''; 
     }      
    } 
    echo '<option value="'.$row2['languageID'].'" '.$selected.'>'.$row2['languageName'].'</option>'; 
} 
echo '</select>'; 
+0

Können Sie Beispielwert für '$ postID' zeigen? –

+0

var_dump für $ postID: string (2) "41" –

Antwort

1

Der erste Grund ist $stmt Abfrage. Sie haben Filtration durch postID Feld. Der zweite Typ ist $res Variable Ich denke, es ist ein array. Bitte versuchen Sie es unter var_dump. ich denke, es aussehen könnte etw mag:

foreach ($result as $res) { 
     if ($row2['languageID'] == $res['languageID']) { 
      $selected = 'selected'; 
     } else { 
     $selected = ''; 
    }      
} 

Wenn $postID ist ein Array Sie auch diesen Code versuchen:

$place_holders = implode(',', array_fill(0, count($postID), '?')); 
$stmt = $db->prepare("SELECT languageID, languageName, IF(post_languages.languageID IN (SELECT post_to_languages.languageID FROM post_to_languages WHERE post_to_languages.postID IN ($place_holders)), 1, 0) as selected FROM post_languages ORDER BY languageName"); 
$stmt->execute($postID); 
echo '<select class="post-language form-control" name="postLangID[]" multiple="multiple" required>'; 
while ($row = $stmt->fetch()) { 
    if ($row["selected"]) { 
     echo '<option value="'.$row['languageID'].'" selected>'.$row['languageName'].'</option>'; 
    } else { 
     echo '<option value="'.$row['languageID'].'">'.$row['languageName'].'</option>'; 
    } 
} 
echo '</select>'; 
+0

var_dump für $ postID: string (2) "41", var_dump für $ res: string (1) "5" –

+0

Sie holen also nur eine Zeile von 'post_to_languages 'Tabelle, weil Sie Filterung durch' PostID' Feld in 'WHERE-Klausel' haben. Entfernen Sie es oder analysieren Sie es als Array mit mehr Werten, um ausgewählte Sprachen zu erhalten. –

+0

Ich habe verwendet $ langs = array(); \t \t while (($ result = $ stmt-> holen (PDO :: FETCH_ASSOC))) { \t \t \t \t \t langs $ [] = $ result; \t \t \t \t \t} \t \t \t \t \t beide Sprachen aus der Datenbank retun, aber Var_dump auf $ langs gibt diese: array (2) {[0] => Array (1) {[ "languageID "] => string (1)" 5 "} [1] => array (1) {[" "languageID"] => string (3) "106"}} und von hier weiß nicht genau wie bekomme nur die IDs, wenn ich foreach benutze, bekomme ich nur ein Array. –

Verwandte Themen