За последние 24 часа нас посетили 32857 программистов и 1820 роботов. Сейчас ищет 851 программист ...

Подсчитать количество строк в таблице с определенным параметром

Тема в разделе "PHP для новичков", создана пользователем smartCreate, 29 дек 2016.

  1. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Добрый день! Я не так давно окунулся в PHP по этому каждый день включая комп приходиться учить что-то новое. Сейчас столкнулся с задачей подсчитать количество строк в таблице которые содержат в себе определенный параметр.

    Расскажу немного подробнее - делаю сейчас вывод комментариев пользователей, оставленных к товарам на интернет-магазине. Осталась мелочь, но не могу с ней не как справиться. На странице с товаром есть 2 вариант обратной связи - "Оставить отзыв" и "Задать вопрос", выглядит вот так:
    view.jpg

    Хочу сделать чтобы что бы рядом с надписью "Оставить отзыв" на вкладке в скобках отображалось количество отзывов, например вот так: "Оставить отзыв (3)", та же история и с "Задать вопрос".

    Теперь о функциональности - все отзывы, со всех товаров заносятся в одну таблицу, таблица имеет вот такую структуру:
    БД.jpg
    Как видите у каждой строки есть "параметр" - key_c, с определенным значением, это значение берется из ссылки на товар, например есть ссылка .../product/imy_tovara_2, я с помощью js определяю её последний параметр (хвост), который будет равен imy_tovara_2, и это значение заносится в таблицу вместе с самим отзывом.

    Далее если я нахожусь на странице ../product/imy_tovara_2, мне нужно узнать количество строк с параметром "imy_tovara_2" в таблице и результат вставить в html разметку.

    как я понимаю алгоритм должен быть таким:
    1) Определить с помощью php последний параметр ссылки, как я это делал с помощью js;
    2) Найти в таблице строки в которых содержаться соответствующие параметры;
    3) Подсчитать их количество;
    4) Вставить результат в разметку.

    Но в силу недостатка опыта я не как переписать этот алгоритм в php код.

    Очень прошу помощи, потому как я маленько в тупике, даже не знаю что гуглить. Заранее благодарен.
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    SELECT * FROM `table` WHERE `key_c`= '$key_c'
    А вообще, лучше обращаться по id.
     
  3. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    @SamyRed, не совсем понял Вас, с помощью, SELECT * FROM `table` WHERE `key_c`= '$key_c' я просто обращусь строке которая в столбце key_c содержит значение '$key_c', как это мне поможет посчитать количество всех строк с таким значением '$key_c'?
     
  4. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Функция mysqli_num_rows возвращает количество возвращаемых функцией mysqli_query строк. Если надо PDO - увы, не знаю.
     
  5. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Код (Text):
    1. SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara';
    2. //- Можно сгруппировать по наименованию юзера, если одинаковый товар имеет место быть
    3. SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara' group by name;
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    очень плохой совет. а с учётом твоего SELECT * , просто капец какой плохой.

    не надо затребовать все данные с сервера чтобы узнать количество строк, удовлетворяющих условию. для этого есть функция MySQL COUNT()
    --- Добавлено ---
    @lastdays правильно подсказывает!
     
  7. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Да, что-то не подумал)
     
  8. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    @SamyRed, @lastdays, @artoodetoo спасибо за отзывчивость и искренне извините за безграмотность, как я и говорил, совсем недавно стал изучать php и многие вещи для меня это темный лес. Я не совсем понимаю как я могу применить написанное Вами, по этому задам очень глупый вопрос, Вы уж простите.

    HTML:
    1. <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (Вот сюда мне нужно вставить количество строк с параметром $key_c)</a></li>
    Могу ли я это сделать вот так:

    HTML:
    1. <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo (SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara')?>)</a></li>
    Я заранее догадываюсь что не могу. Но нечего более разумного родить не получается((
     
  9. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    А что если попробовать и запустить скрипт?
     
    artoodetoo нравится это.
  10. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Попробовал уже))

    получил ошибку:
    Код (Text):
    1. Parse error: syntax error, unexpected 'count' (T_STRING) in /home/users2/r/ru-marketroll/domains/ru-marketroll.myjino.ru/application/views/pages/product/index.php on line 158
    не понимаю что ему не нравиться в 'count'
     
  11. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Действительно, что же ему не нравится в COUNT :)

    Попробуй так:
    PHP:
    1. <?php $col = mysqli_fetch_assoc(mysqli_query(SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara'));?>
    2. <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1]?>)</a></li>
     
  12. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Увы(

    сделал так:

    PHP:
    1. <?php $col = mysqli_fetch_assoc(mysqli_query(SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara'));?>
    2. <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1]?>)</a></li>
    Ошибка:
    Код (Text):
    1. Parse error: syntax error, unexpected 'count' (T_STRING) in /home/users2/r/ru-marketroll/domains/ru-marketroll.myjino.ru/application/views/pages/product/index.php on line 190
     
  13. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ошибочка.
    PHP:
    1. <?php $col = mysqli_fetch_assoc(mysqli_query("SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara'"));?>
    2. <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1];?>)</a></li>
    Кавычки забыл.
     
  14. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Не везет мне что-то сегодня(

    сейчас страница загрузилась, но прямо в html, появились 2 ошибки:
    upload_2016-12-29_20-34-31.png
     
  15. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    В функцию mysqli_query нужно передать первым параметром объект подключения к БД ($db). Если у тебя ещё такого нет - добавть в самое начало файла:
    PHP:
    1. $db = mysqli_connect ('Имя хоста', 'юзер', 'пароль', 'База данных');
     
  16. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Вот сейчас наконец-то стал понимать что происходит) Наверное в начале нужно было добавить что я работаю на фреймворке Godignaiter, там подключение к БД происходит один раз для всех файлов в конфигурационном файле database.php

    Может Вы знаете, как объединить ваш скрипт с Godignaiter?
     
  17. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Я же не знаю какое там подключение. Никогда не слышал о таком фреймворке. Покажите этот файл database.php (Можно без пароля :D)
     
  18. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Конечно, кому как не мне знать, что всего знать невозможно))

    вот весь файл:

    PHP:
    1. <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    2. /*
    3. | -------------------------------------------------------------------
    4. | DATABASE CONNECTIVITY SETTINGS
    5. | -------------------------------------------------------------------
    6. | This file will contain the settings needed to access your database.
    7. |
    8. | For complete instructions please consult the 'Database Connection'
    9. | page of the User Guide.
    10. |
    11. | -------------------------------------------------------------------
    12. | EXPLANATION OF VARIABLES
    13. | -------------------------------------------------------------------
    14. |
    15. |    ['hostname'] The hostname of your database server.
    16. |    ['username'] The username used to connect to the database
    17. |    ['password'] The password used to connect to the database
    18. |    ['database'] The name of the database you want to connect to
    19. |    ['dbdriver'] The database type. ie: mysql.  Currently supported:
    20.                 mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
    21. |    ['dbprefix'] You can add an optional prefix, which will be added
    22. |                to the table name when using the  Active Record class
    23. |    ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
    24. |    ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
    25. |    ['cache_on'] TRUE/FALSE - Enables/disables query caching
    26. |    ['cachedir'] The path to the folder where cache files should be stored
    27. |    ['char_set'] The character set used in communicating with the database
    28. |    ['dbcollat'] The character collation used in communicating with the database
    29. |                NOTE: For MySQL and MySQLi databases, this setting is only used
    30. |                 as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7
    31. |                (and in table creation queries made with DB Forge).
    32. |                 There is an incompatibility in PHP with mysql_real_escape_string() which
    33. |                 can make your site vulnerable to SQL injection if you are using a
    34. |                 multi-byte character set and are running versions lower than these.
    35. |                 Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
    36. |    ['swap_pre'] A default table prefix that should be swapped with the dbprefix
    37. |    ['autoinit'] Whether or not to automatically initialize the database.
    38. |    ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
    39. |                            - good for ensuring strict SQL while developing
    40. |
    41. | The $active_group variable lets you choose which connection group to
    42. | make active.  By default there is only one group (the 'default' group).
    43. |
    44. | The $active_record variables lets you determine whether or not to load
    45. | the active record class
    46. */
    47.  
    48. $active_group = 'default';
    49. $active_record = TRUE;
    50.  
    51. $db['default']['hostname'] = 'mysql.ru-marketroll.myjino.ru';
    52. $db['default']['username'] = '046440826_fantan';
    53. $db['default']['password'] = '**********';
    54. $db['default']['database'] = 'ru-marketroll_fantan';
    55. $db['default']['dbdriver'] = 'mysql';
    56. $db['default']['dbprefix'] = '';
    57. $db['default']['pconnect'] = TRUE;
    58. $db['default']['db_debug'] = TRUE;
    59. $db['default']['cache_on'] = FALSE;
    60. $db['default']['cachedir'] = '';
    61. $db['default']['char_set'] = 'utf8';
    62. $db['default']['dbcollat'] = 'utf8_general_ci';
    63. $db['default']['swap_pre'] = '';
    64. $db['default']['autoinit'] = TRUE;
    65. $db['default']['stricton'] = FALSE;
    66.  
    67.  
    68. /* End of file database.php */
    69. /* Location: ./application/config/database.php */
     
  19. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Так тут нет самой функции подключения. Здесь только данные. Сама функция находится в каком-то другом файле.
     
  20. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Понял, буду искать тогда) Как только найду сразу же отпишусь) Спасибо большое за помощь
     
  21. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Нашёл. Попробуйте так:
    PHP:
    1. <?php
    2. $this->load->database();
    3. $col = $this->db->query("SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara'");
    4. $col = $col->row_array();?>
    5. <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1];?>)</a></li>
    Возможно, будет работать без первой строки.
     
  22. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4

    В этот раз почти получилось))

    Сделал так:

    PHP:
    1. <?php
    2. $this->load->database();
    3. $col = $this->db->query("SELECT count(1) FROM `comments` WHERE `key_c`='imy_tovara'");
    4. $col = $col->row_array();?>
    5. <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1];?>)</a></li>
    В месте где должна появиться цифра соответствующая количеству отзывов, появилось вот это:
    upload_2016-12-29_21-15-16.png
     
  23. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    А если без первой строки? ($this->...)
     
  24. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Проверил, тоже самое(
     
  25. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Если совсем не будет получаться, можно сделать такой себе костыль:
    PHP:
    1. <?php
    2. $db=mysqli_connect('Имя хоста','юзер','пароль','База данных');
    3. $col = mysqli_fetch_assoc(mysqli_query($db, "SELECT count(1) FROM `comments` WHERE `key_c`='imy_tovara'"));
    4. ?>
    5. <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1];?>)</a></li>
    Но это совсем плохо, хоть и будет работать