У меня есть раскрывающееся меню, которое заполняется данными, полученными из базы данных. это выглядит так:

Как я могу разделить такие опции, как GPOS RETAIL|INVENTORY STANDARD, на отдельные опции GPOS RETAIL и INVENTORY STANDARD. Кроме того, как я могу удалить повторяющиеся варианты? У меня уже есть DISTINCT в моем запросе, но я предполагаю, что конвейер | влияет на это.
Я пробовал ff, но, похоже, я не мог понять логику, которая мне нужна, чтобы делать то, что мне нужно.
PHP:
$qry = "SELECT DISTINCT c.c_id, c.client_name, a.product
FROM client_list c
INNER JOIN activities a
ON c.client_name = a.client
WHERE c.c_id = '".$_POST['client']."' AND a.product IS NOT NULL
ORDER BY c.c_id";
$res = mysql_query($qry);
if (mysql_num_rows($res) > 0) {
echo '<option value = "">SELECT SOFTWARE / HARDWARE</option>';
while($row = mysql_fetch_array($res)) {
echo '<option value = "'.$row[2].'">'.$row[2].'</option>';
}
}
else {
echo '<option value = "">No Record</option>';
}
Одно из того, что я пробовал:
if (isset($_POST['client'])) {
$qry = "SELECT DISTINCT c.c_id, c.client_name, a.software_hardware
FROM client_list c
INNER JOIN activities a
ON c.client_name = a.client
WHERE a.software_hardware IS NOT NULL AND c.c_id = '".$_POST['client']."'
ORDER BY a.`software_hardware`";
$res = mysql_query($qry);
if (mysql_num_rows($res) > 0) {
echo '<option value = "">SELECT SOFTWARE / HARDWARE</option>';
while($row = mysql_fetch_array($res)) {
$list = "";
$arr = explode("|", $row[2]);
if (!empty($arr)){
for($i = 0; $i<=$ctr; $i++) {
$list .= "<option value='$arr[$i]'>$arr[$i]</option>";
}
}
echo $list;
// echo '<option value = "'.$row[2].'">'.$row[2].'</option>';
}
}
else {
echo '<option value = "">No Record</option>';
}
}
Я не знаю куда идти отсюда
@Marcel, спасибо за то, что я знаю об устаревшей проблеме, просто компания, в которой я работаю, все еще использует ее: / Я понял, что использовал Explode после того, как опубликовал, но в том, что я сделал до сих пор, все еще чего-то не хватает (см. Правка)
Посмотрите ответ @Fenix Lam. Ваш цикл for обращается к неправильной переменной. Вместо $ctr используйте $arr. Я не знаю, что сказать компаниям, которые используют устаревшие сегодня методы.






for($i = 0; $i<=$ctr; $i++) {
...
}
должно быть
for($i = 0, $length = count($arr); $i < $length; $i++) {
это все
Это должен быть принятый ответ, потому что Феникс увидел, что цикл for обращается к неправильной переменной.
@marcel, я только что попробовал, и он не отображает параметры
Правда. Вы должны узнать длину массива: for ($i = 0, $length = count($arr); $i < $length; $i++ ) {}. В вашем коде переменная $ctr не определена.
Вы можете использовать explode и foreach в PHP. Вам нужна дополнительная проверка, чтобы у вас не было пустых строк. Это примерно так:
if (mysql_num_rows($res) > 0) {
echo '<option value = "">SELECT SOFTWARE / HARDWARE</option>';
while($row = mysql_fetch_array($res)) {
$names = explode("|",$row[2]);
foreach ( $names as $name ) {
if ( $name != "" ) {
echo '<option value = "'.$name.'">'.$name.'</option>';
}
}
}
}
Я добавил разнесение, которое создает массив из строки имени с символом "|" разделители. После этого вы просматриваете каждый элемент массива, и если он не пустой, вы добавляете его как вариант. Пожалуйста, я не изменил ссылку на строки на «$ name».
Привет! Я понял, используя взорваться поздно. Я обновил свой код, но чего-то по-прежнему не хватает. Я попробую, спасибо! \
это сработало! благодарю вас! дополнительный вопрос, как я могу удалить повторяющиеся части GPOS?
Это зависит от того, как вы хотите это сделать. Лично я бы как-то изменил таблицу или SQL-запрос, чтобы он работал нормально, но я слепой. В PHP вы можете сохранить все уже напечатанные строки в массив и проверить с помощью in_array ($ Need, $ haystack), если он уже был напечатан, и воздержаться от печати, если это было.
substr ($ имя, 5, strlen ($ имя))
Вы можете использовать следующее решение:
$items = [];
//get all items from database and explode the concat values.
while($row = mysql_fetch_array($res)) {
$items = array_merge($items, explode('|', $row[2]));
}
//get only the distinct items.
$items = array_unique($items);
//remove the emtpy items.
$items = array_filter($items);
//initialize the list.
$list = '<option value = "">SELECT SOFTWARE / HARDWARE</option>';
//create the list of unique items.
foreach ($items as $item) {
$list .= '<option value = "'.$item.'">'.$item.'</option>';
}
Объяснение:
array_unique. Каналы (|) удаляются с помощью функции explode в цикле while.array_filter (без обратного вызова).Прежде всего, небольшой намек на то, что вам больше не следует использовать функции mysql_ *. Я знаю, что вы сказали, что ваша компания использует устаревшую версию php. Но ... вы знаете, что вы работаете дважды, и они будут платить намного больше денег за разработку и так далее.
Ваш цикл for - это проблема. Вы можете решить уникальные значения там, а переменная $ctr, которую вы используете в своем цикле for, никогда не определялась.
$arr = $arr = explode("|", $row[2]);
$arr = array_unique($arr);
for ($i = 0, $length = count($arr); $i < $length; $i++) {
...
}
Функция array_unique отсортирует повторяющиеся значения в вашем массиве. После этого цикл for перебирает уникальные значения вашего массива.
В конце концов, вы должны подумать о нормализации структуры вашей базы данных. Не рекомендуется сохранять значения типа «значение1 | значение2 | значение3». Подумайте о структуре «один ко многим» или «многие ко многим». Это сделает жизнь намного проще.
Прежде всего: НЕ ИСПОЛЬЗУЙТЕ больше функции mysql_ *! Они объявлены устаревшими в PHP5.6 и удалены в PHP7. Вместо этого используйте функции PDO или mysqli_ *. В конце концов, ваш синтаксис SQL ужасно открыт для внедрения sql. Вы должны рассматривать подготовленные заявления из соображений безопасности. Чтобы ответить на ваш вопрос: PHP взорвать решит вашу проблему и специально рассмотрит ваш цикл foor. Произошла ошибка.