2016-05-18 2 views
0

J'ai une base de données SQL avec un mot-clé « catégorie » (un seul permis) et les mots clés « problèmes » (multiple virgule mots séparés). Je suis en train de faire un menu mot-clé déroulant-peuplant sélection automatique en sélectionnant tous les mots-clés de la « catégorie » et les colonnes des « problèmes », en tournant les deux tableaux retournés dans des chaînes séparées par des virgules avec imploser, puis en combinant les cordes et exploser la chaînes séparées par des virgules dans un tableau, tout en supprimant les entrées en double avec array_unique.PHP - En utilisant imploser, exploser et array_unique pour remplir automatiquement un menu déroulant à partir de deux colonnes SQL de mots-clés séparés par des virgules

Mais cela ne fonctionne pas. J'ai essayé plusieurs approches. Voici ma dernière. Il renvoie QUELQUES valeurs de la colonne mais pas toutes, et je ne peux pas comprendre pourquoi. Peut-être que array_unique ne fonctionne pas comme je le veux, ou que je mette la conversion en chaînes et que je rejoue dans un tableau? Existe-t-il un moyen plus simple de faire cela? J'ai cherché partout et ne peux pas trouver un bon exemple n'importe où.

Voici le code je travaille maintenant ...

<? 
$dropdownsql = "SELECT DISTINCT category FROM database"; 
$keywords = mysql_query($dropdownsql); 
while($row = mysql_fetch_array($keywords)) 
{ 
    echo "<option value=\"".$row['category']."\">".$row['category']."</option>\n "; 
} 
?> 

Bien que cela fonctionne pour les mots-clés de la catégorie d'un seul mot, il ne peut évidemment pas gérer plusieurs colonnes SQL ou des mots clés séparés par des virgules dans ces colonnes . Voici ma tentative de faire de la manière la plus simple:

<? 
$dropdownsql = "SELECT DISTINCT category FROM database"; 
$dropdownsql2 = "SELECT DISTINCT issues FROM database"; 

//run sql queries separately. Ideally they would be combined into one right? 
$rs = mysql_query($dropdownsql); 
$rs2 = mysql_query($dropdownsql2); 
$row = mysql_fetch_array($rs); 
$raw = mysql_fetch_array($rs2); 

//then implode the resulting arrays, placing commas & spaces so they'll match 
$rows = implode(", ", $row); 
$raws = implode(", ", $raw); 

//try to concatenate the strings of comma-separated keywords 
$keywordvaluesstring = $rows.$raws; 

//then explode the concatenated string back into array 
$keywordvalue = explode(", ",$keywordvaluesstring); 

//then keep only one copy of duplicated keywords 
$values = array_unique($keywordvalue, SORT_REGULAR); 

//and finally echo the keywords into a dropdown 
foreach($values as $value){ 
    echo "<option value=\"".$value."\">".$value."</option>\n "; 
} 
?> 

Que dois-je faire le mal !!!! ????

+0

Pourquoi ne récupérez-vous qu'une seule ligne de chacun des ensembles de résultats? –

+0

Parce que je ne savais pas que je faisais ça. Qu'est-ce qui me fait seulement aller chercher une seule rangée? $ row est juste un nom de variable, il ne devrait pas être spécifié qu'une seule ligne soit récupérée ... – teame

Répondre

1
<? 
$dropdownsql = "SELECT DISTINCT category FROM database"; 
$dropdownsql2 = "SELECT DISTINCT issues FROM database"; 

//run sql queries separately. Ideally they would be combined into one right? 
$rs = mysql_query($dropdownsql); 
$rs2 = mysql_query($dropdownsql2); 
$keywords = array(); 
while ($row = mysql_fetch_array($rs)) { 
    $keywords[] = $row[0]; 
} 
while($raw = mysql_fetch_array($rs2)) { 
    $keywords = array_merge($keywords, explode(', ', $raw[0])); 
} 

$values = array_unique($keywords, SORT_STRING); 

//and finally echo the keywords into a dropdown 
foreach($values as $value){ 
    echo "<option value=\"".$value."\">".$value."</option>\n "; 
} 
?> 
+0

Veuillez m'excuser, mais comment cela correspond-il au reste du code? Est-ce que je niche une autre fois pour $ raw = mysql_fetch_array ($ rs2) ;? Est-ce que le foreach serait alors nécessaire? – teame

+0

que voulez-vous dire par // quel que soit le traitement? – teame

+0

Oui, vous utiliseriez une boucle while pour $ raw. J'ai mis "quel que soit le traitement" en pensant que vous sauriez quoi faire une fois que vous avez réalisé que vous deviez obtenir toutes les lignes. Si vous avez besoin d'aide avec le reste du code, laissez-nous savoir ce que vous avez raccroché. –

0

Essayez de remplacer cette

//then implode the resulting arrays, placing commas & spaces so they'll match 
$rows = implode(", ", $row); 
$raws = implode(", ", $raw); 

//try to concatenate the strings of comma-separated keywords 
$keywordvaluesstring = $rows.$raws; 

Avec cette

$keywordvalue = array_merge($rows, $raws); 
+0

Le problème est que les lignes $ ne seront pas des valeurs séparées par des virgules, mais $ RAWs est des mots-clés par des virgules seperated, donc je dois adresse de décapage par la suite de la virgule en les ajoutant dans les premiers afin que les deux tableaux correspondent – teame

+0

Je suis en train de former une chaîne séparée par des virgules, car sinon je dois traiter avec des tableaux multidimensionnels lorsque je tente de faire exploser les mots-clés de « questions » (qui faisait frire mon cerveau en retournant « tableau de tableau de tableau » dans le menu déroulant) – teame

+0

utilisation mysql_fetch_row au lieu de mysql_fetch_array. mysql_fetch_array renvoie un hachage hybride/tableau indexé.Ou vous pouvez faire ceci $ keywordvaluesstring = $ rows ['category']. ','. $ raws ['issues']; – KSimpson

0

Je crois que c'est ce que vous voulez.

<? 
$dropdownsql = "SELECT DISTINCT category FROM database"; 
$dropdownsql2 = "SELECT DISTINCT issues FROM database"; 

$allvalues = array(); 
while ($row = mysql_fetch_row($rs)) { 
    array_push($allvalues, $row[0]); 
} 

while ($row = mysql_fetch_row($rs2)) { 
    $keywords = explode(',', $row[0]); 
    foreach($keywords as $word) { 
     array_push($allvalues, $word); 
    } 
} 

//then keep only one copy of duplicated keywords 
$values = array_unique($allvalues, SORT_REGULAR); 

//and finally echo the keywords into a dropdown 
foreach($values as $value){ 
    echo "<option value=\"".$value."\">".$value."</option>\n "; 
} 
?> 
+0

J'ai essayé de mettre en œuvre vos suggestions de différentes façons ... mais ça ne marche toujours pas. Est-ce que cette adresse indique que la colonne issue contient des mots-clés séparés par des virgules? – teame

+0

Oooh! Eh bien, maintenant cela fonctionne (il manquait les variables $ rs et $ rs2 ... mais il ne semble pas qu'il divise les mots-clés séparés par des virgules dans la colonne "problèmes" ... quoi faire? – teame

+0

Où est le bon endroit pour faire exploser en \t while ($ row = mysql_fetch_row ($ rs2)) { array_push ($ allvalues, $ row [0]); } – teame

0

POUR LES AUTRES QUI FONT FACE CE MEME PROBLEME, VOICI LE CODE DE TRAVAIL FINAL: DANS LA BASE DE DONNÉES, « catégorie » EST UN MOT-CLÉ UNIQUE ET « EMISSION » ET « RELATEDISSUES » sont-VIRGULE Seperated KEYWORDS. Merci à Ksimpson

<form method="GET" action="#"> 
<select name="keywords"> 
<OPTION selected><? echo $keyword1; ?></OPTION> 
<? 

//define the query (the database connection is accomplished elsewhere btw) 
$dropdownsql2 = "SELECT DISTINCT category FROM database"; 
$dropdownsql = "SELECT DISTINCT issue, relatedissues FROM database"; 

//runthequery 
$rs = mysql_query($dropdownsql); 
$rs2 = mysql_query($dropdownsql2); 

//create an array to hold the keywords 
$allvalues = array();  


//take the values from category and append to the array 
while ($row = mysql_fetch_row($rs2)) { 
    array_push($allvalues, $row[0]); 
} 


//loop again -- explode creates an array of arrays so we handle in the loop 
while ($row = mysql_fetch_array($rs)) { 

//for each comma separated string, explode it and append the results 
    foreach($row as $str) { 
    $exploded = explode(', ', $str); 
    array_push($allvalues, $exploded[0]);  
     } 
} 

//then keep only one copy of duplicated keywords 
$values = array_unique($allvalues, SORT_REGULAR); 

//and finally echo the keywords into a dropdown 
foreach($values as $value){ 
    echo "<option value=\"".$value."\">".$value."</option>\n "; 
} 
?>