Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 25.12.2019
Сообщений: 10

Почему $_GET берёт только последнее значение из строки?

27.05.2021, 12:59. Показов 1053. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вот такой код:

PHP
1
2
3
4
5
6
7
8
9
<?php
    require_once 'connect.php';
 
    $url = $_GET;
    var_dump($url);
    
    $select = mysqli_query($connect, "SELECT * FROM store_product WHERE category=$_GET[category]");
 
?>
И есть такой цикл вывода товара

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
 
                       while ($result = mysqli_fetch_assoc($select)) {
                           
                        ?>
                        <div class="catalog__item">
                            <a href="php/product.php?id=<?php echo $result['id'] ?>" class="item__link">
                                <img class="catalog__items-img" src="<?php echo $result['img'] ?>" alt="img">
                                <p class="popular__text"> <?php echo $result['title'] ?></p>
                            </a>
                            <p class="count">От <span class="count_big"><?php echo number_format($result['price'], 0, '', ' '); ?> ₽</span></p>
                            <a href="#" class="item__btn">В корзину</a>
                        </div>
                        <?php
 
                        }
?>
И как видим, выводится только последнее значение из url. Как сделать так, что бы можно было взять все значения, чтобы выводить товары из нескольких категорий сразу?
Миниатюры
Почему $_GET берёт только последнее значение из строки?  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2021, 12:59
Ответы с готовыми решениями:

Почему видит только последнее значение?
Задание: Определить функцию вычисление суммы цифр произвольного числа и ее помощью найти какой из членов генерированной последовательности...

Почему хранится только последнее значение массива в цикле
здравствуйте, не пойму, почему хранится только последнее значение массива в цикле, строки кода: CountReplacement = CountReplacement + 1 ...

Почему не работает цикл (выводится только последнее значение)?
Почему выводит последнее значение а не массив? $data_arr = array(); $result = mysql_query(&quot;SELECT * FROM `news` &quot;); ...

15
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
27.05.2021, 13:59
Цитата Сообщение от Snakklick Посмотреть сообщение
из нескольких категорий сразу
$_GET ассоциативный массив
QUERY_STRING category=1&category=2&category=3 перезаписывет значение $_GET['category'] несколько раз
но можно передавать массив $_GET['category'] ... category[]=1&category[]=2&category[]=3

Не по теме:

... чтобы не вытаскивать значения как-то так

PHP
1
2
3
4
5
6
7
8
9
10
11
12
preg_match_all('#(?:^|&)category=\K[^&]+#', $_SERVER['QUERY_STRING'], $M);
var_export($M);
/*
array (
  0 =>
  array (
    0 => '1',
    1 => '2',
    2 => '3',
  ),
)
*/


и в db-запросе вместо WHERE category=3 должно быть что-то другое,
типа WHERE category IN(1,2,3) ... подготовленные запросы с этим уже не вариант

...есть вариант сделать в QUERY_STRING category=1,2,3
но тогда нужно дополнительно проверять/фильтровать ... чтобы всталять как WHERE category IN($_GET[category])
типа как
PHP
1
if (!preg_match('#^(?:\d+,)*\d+$#', $_GET['category'])) $_GET['category'] = '0';
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
27.05.2021, 14:47
Цитата Сообщение от x_lab Посмотреть сообщение
WHERE category IN(1,2,3) ... подготовленные запросы с этим уже не вариант
Почему? Пишем подготовленный запрос:
SQL
1
SELECT * FROM store_product WHERE category IN(?,?,?)
И так же, как обычно, вызываем bind_param.
0
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
27.05.2021, 15:07
Цитата Сообщение от Para bellum Посмотреть сообщение
IN(?,?,?)
Так заранее не известно сколько вопросиков ...
+ mysqli_stmt_bind_param() надо передавать неизвестное колличество ссылок на переменные

... может я ошибаюсь ... но будет выглядеть так будто надо прикрутить динамически-добавляемые вопросики
затем динамически добавлять в строку типа 'ddddd' для mysqli_stmt_bind_param()
и вызывать её прикрутив какое-нибудь call_user_func_array()
... если так можно передать ссылки на переменные )) даже не проверял
0
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,897
27.05.2021, 15:28
x_lab, это все трудно сделать?
0
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
27.05.2021, 15:35
Цитата Сообщение от estic Посмотреть сообщение
все трудно
Всё отноительно ,) ... но относительно этого
Цитата Сообщение от x_lab Посмотреть сообщение
QUERY_STRING category=1,2,3
, без всяких подготовленных запросов, возможно да )
0
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,897
27.05.2021, 15:59
К предыдущему сообщению. Вместо call_user_func_array() сейчас можно использовать оператор ... для распаковки массива в список аргументов, хотя старая добрая call_user_func_array() лично мне как-то привычнее (и о совместимости забывать не стоит).

Добавлено через 2 минуты
По-моему, самое страшное в теме - это category[]=1&category[]=2&category[]=3 Если вы действительно так делаете, то явно делаете что-то не то.

Добавлено через 5 минут
Snakklick, фильтры делаются при помощи Post-Redirect-Get. Можно как угодно экспериментировать с форматом адреса (использовать адрес с category=1,2,3 и т.п.). Вплоть до того, чтобы сохранить "фильтрующий запрос" под определенным идентификатором и выводить результат, например, по адресу /filter/1[?p=2 и т.д.]. Или можно прямо на клиенте формировать адрес запроса при помощи JS.
0
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
27.05.2021, 17:00
Цитата Сообщение от estic Посмотреть сообщение
самое страшное в теме
оно как-бы самое для форм нативное
... типа нескольких input type="checkbox"
или select multiple="multiple"
... где name="category[]"

Как-бы пользователь хотя-бы изначально должен выбрать подмножества
, хотя, после его можно и слать куда-нибудь с QUERY_STRING попроще
... если не вмешивать javascript

Не по теме:

Насколько понял кроме категорий TC , судя по прошлым темам, делает что-то как
то что реализовано например где https://www.dns-shop.ru/catalo... =msi-palit
там javascript добавляет через дефис эти ?brand=msi-palit

Насчёт подготовленными-ли запросами или по старинке фильтрация/валидация не знаю
... подсовывание ?brand=msi-palit-gelentwagen ничего не выявило :)

0
0 / 0 / 0
Регистрация: 25.12.2019
Сообщений: 10
27.05.2021, 18:30  [ТС]
Спасибо за ответ, пока что делаю немного по другому и пока что получается
0
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,897
27.05.2021, 23:34
Цитата Сообщение от x_lab Посмотреть сообщение
оно как-бы самое для форм нативное
Нет.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
27.05.2021, 23:45
Цитата Сообщение от estic Посмотреть сообщение
Если вы действительно так делаете, то явно делаете что-то не то.
очень даже то
0
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,897
27.05.2021, 23:49
Цитата Сообщение от Jewbacabra Посмотреть сообщение
очень даже то
Ладно, продолжайте в том же духе
0
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
28.05.2021, 08:19
Цитата Сообщение от estic Посмотреть сообщение
Нет.
Если делать так-же для тех кто выключил javascript то мне кажется оченнь даже Да
Например по мотивам следующего топика ТС )
Цитата Сообщение от Snakklick Посмотреть сообщение
Как изменить цикл foreach
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
//header('Content-type: text/plain; charset=utf-8');
//$_GET = ['cat'=>['1','2','3'], 'man'=>['2']];
// $_GET = ['cat'=>'1,2,3', 'man'=>'2'];
 
# script data
$cats = array(
    '1'=> array('chk'=>0, 'nm'=>'ASUS',  'htm_id'=>'check-asus'),
    '2'=> array('chk'=>0, 'nm'=>'GIGABYTE','htm_id'=>'check-gig'),
    '3'=> array('chk'=>0, 'nm'=>'MSI',   'htm_id'=>'check-msi'),
    '4'=> array('chk'=>0, 'nm'=>'PALIT', 'htm_id'=>'check-palit')
    );
$mans = array(
    '1'=> array('chk'=>0, 'nm'=>'NVIDIA','htm_id'=>'check-nvidia'),
    '2'=> array('chk'=>0, 'nm'=>'AMD',   'htm_id'=>'check-amd')
    );
function show_chkbxs(&$arr, $iname){
    foreach($arr AS $k=>$v) echo
'               <input type="checkbox" name="',$iname,'[]" id="',$v['htm_id'],
                '" value="',$k, ($v['chk']?'" checked="checked"':'"'), '>
                <label for="',$v['htm_id'],'">',$v['nm'],'</label>
';
}
class ReqArrGet{
    private $fields = array();# для заполнения $where
    public  $where = '';
    public function addParams(&$arr, $get, $field){
        if(!isset($_GET[$get])) return;
        if (is_array($_GET[$get])) // javascript выключен
            $vals =& $_GET[$get];
        else // javascript включен или ссылка изменена
            $vals = explode(',', $_GET[$get]);
        foreach(array_keys($arr) AS $k)
            if (in_array($k, $vals)) {
                $arr[$k]['chk']=1;
                $this->fields[$field][] = $k;
            }
        $this->fields[$field] = array_unique($this->fields[$field]);
    }
    public function genWhere(){
        foreach($this->fields AS $k=>$v) {
            if ($this->where) $this->where .= ' AND';
            if (count($v)>1) $this->where .=" `$k` IN(". implode(',',$this->fields[$k]) .')';
            else $this->where .=  " `$k` = {$v[0]}";
        }
    }
    public function clean(){
        $this->fields = array();
        $this->where = '';
    }
}
 
$REQ = new \ReqArrGet();
$REQ->addParams($cats, 'cat','category');
$REQ->addParams($mans, 'man','manufacturer');
$REQ->genWhere();
 
?>
<script>
function formVideoCards(f){
 return true;
 return false;
}
</script>
    <form onsubmit="formVideoCards()">
        <div class="cat-checkbox">
            <p>Категории</p>
            <?php show_chkbxs($cats, 'cat') ?>
        </div>
        <div class="man-checkbox">
            <p>Производитель чипсета</p>
                <?php show_chkbxs($mans, 'man') ?>
        </div>
        <button type="submit" name="">Применить</button>
    </form>
 
<?php
echo '<pre>query = ', var_export(' select * from `store_product` '
    .($REQ->where? 'WHERE'.$REQ->where: ''), 1), "</pre>\n";

Не по теме:

в ООП я не очень ,) просто пусть как-бы например класс такой


Как-бы можно редирект ещё прикрутить ... для красоты
,) если не нравится в адресной строке ?cat[]=1&cat[]=3&man[]=1&man[]=2

Но как-бы не обязательно всё в GET ... можно и в COOKIE... хотя ссылками делиться станет затруднительнее )
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
28.05.2021, 10:12
Цитата Сообщение от x_lab Посмотреть сообщение
для тех кто выключил javascript
Это не серьезно. В 2021 никто не должен поддерживать версии UI без js, это смешно
0
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,897
28.05.2021, 12:45
Цитата Сообщение от x_lab Посмотреть сообщение
Если делать так-же для тех кто выключил javascript то мне кажется оченнь даже Да
Я выше писал, как делается без JS. Даже если используются прямые GET-запросы с формы, "самое для форм нативное" - тот вариант, который использовал автор в соседней теме (category1=...&category2=...). Одинаковые имена обычно используют только у радиокнопок. Естественно, я понимаю, о чем вы пишете: клиенты обычно передают параметры с одинаковыми именами (кроме тех же не отмеченных радиокнопок и чекбоксов) и параметры с [] в именах удобны в формах за счет "статичности определения" и удобны при их обработке на PHP. Но не нужно путать удобство и широкую поддержку с "нативностью"
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
28.05.2021, 13:21
Цитата Сообщение от estic Посмотреть сообщение
клиенты обычно передают параметры с одинаковыми именами (кроме тех же не отмеченных радиокнопок и чекбоксов) и параметры с [] в именах удобны в формах за счет "статичности определения" и удобны при их обработке на PHP. Но не нужно путать удобство и широкую поддержку с "нативностью"
Так получается что и куки не "нативны", но тем не менее используются и поддерживаюься практически везде. И если есть удобный широко поддерживаемый способ передачи массива, то почему бы им не пользоваться?
Если не нравится одинаковое имя, то ведь никто не запрещает явно указывать индекс category[0]=1&category[1]=2&category[2]=3. И выглядит лучше, чем без скобок (имхо), и потом работать с ним удобнее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.05.2021, 13:21
Помогаю со студенческими работами здесь

Почему выводит только последнее число?
Задание: Была проведена олимпиада по информатике и нужно вывести на экран фамилии и количество баллов тех участников которые набрали...

Перекрестный запрос берет только одно значение вместо всех с выбором по дате
Здравствуйте, уважаемые специалисты. Делаю в БД на аксессе 2013 перекрестный запрос из таблиц 1)Сотрудники(ТабНомер - ключевое,...

Почему в файл выводит только последнее время?
import javax.swing.*; import java.awt.event.*; import java.io.File; import java.io.FileWriter; import java.io.IOException; ...

Добавляет только последнее значение
есть скрипт &lt;?php // SEOMoz Access / Secret define('SEOMOZ_ACCESS_ID','mozscape-423d5002dc'); ...

Считает только последнее значение
Здравствуйте! Хочу сделать расчет без циклов( и так их слишком много в коде), сделал вот так, но считает только последнее значение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru