Добрый день! Я не так давно окунулся в PHP по этому каждый день включая комп приходиться учить что-то новое. Сейчас столкнулся с задачей подсчитать количество строк в таблице которые содержат в себе определенный параметр. Расскажу немного подробнее - делаю сейчас вывод комментариев пользователей, оставленных к товарам на интернет-магазине. Осталась мелочь, но не могу с ней не как справиться. На странице с товаром есть 2 вариант обратной связи - "Оставить отзыв" и "Задать вопрос", выглядит вот так: Хочу сделать чтобы что бы рядом с надписью "Оставить отзыв" на вкладке в скобках отображалось количество отзывов, например вот так: "Оставить отзыв (3)", та же история и с "Задать вопрос". Теперь о функциональности - все отзывы, со всех товаров заносятся в одну таблицу, таблица имеет вот такую структуру: Как видите у каждой строки есть "параметр" - 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 код. Очень прошу помощи, потому как я маленько в тупике, даже не знаю что гуглить. Заранее благодарен.
@SamyRed, не совсем понял Вас, с помощью, SELECT * FROM `table` WHERE `key_c`= '$key_c' я просто обращусь строке которая в столбце key_c содержит значение '$key_c', как это мне поможет посчитать количество всех строк с таким значением '$key_c'?
Функция mysqli_num_rows возвращает количество возвращаемых функцией mysqli_query строк. Если надо PDO - увы, не знаю.
Код (Text): SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara'; //- Можно сгруппировать по наименованию юзера, если одинаковый товар имеет место быть SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara' group by name;
очень плохой совет. а с учётом твоего SELECT * , просто капец какой плохой. не надо затребовать все данные с сервера чтобы узнать количество строк, удовлетворяющих условию. для этого есть функция MySQL COUNT() --- Добавлено --- @lastdays правильно подсказывает!
@SamyRed, @lastdays, @artoodetoo спасибо за отзывчивость и искренне извините за безграмотность, как я и говорил, совсем недавно стал изучать php и многие вещи для меня это темный лес. Я не совсем понимаю как я могу применить написанное Вами, по этому задам очень глупый вопрос, Вы уж простите. HTML: <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (Вот сюда мне нужно вставить количество строк с параметром $key_c)</a></li> Могу ли я это сделать вот так: HTML: <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo (SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara')?>)</a></li> Я заранее догадываюсь что не могу. Но нечего более разумного родить не получается((
Попробовал уже)) получил ошибку: Код (Text): 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'
Действительно, что же ему не нравится в COUNT Попробуй так: PHP: <?php $col = mysqli_fetch_assoc(mysqli_query(SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara'));?> <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1]?>)</a></li>
Увы( сделал так: PHP: <?php $col = mysqli_fetch_assoc(mysqli_query(SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara'));?> <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1]?>)</a></li> Ошибка: Код (Text): 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
Ошибочка. PHP: <?php $col = mysqli_fetch_assoc(mysqli_query("SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara'"));?> <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1];?>)</a></li> Кавычки забыл.
В функцию mysqli_query нужно передать первым параметром объект подключения к БД ($db). Если у тебя ещё такого нет - добавть в самое начало файла: PHP: $db = mysqli_connect ('Имя хоста', 'юзер', 'пароль', 'База данных');
Вот сейчас наконец-то стал понимать что происходит) Наверное в начале нужно было добавить что я работаю на фреймворке Godignaiter, там подключение к БД происходит один раз для всех файлов в конфигурационном файле database.php Может Вы знаете, как объединить ваш скрипт с Godignaiter?
Я же не знаю какое там подключение. Никогда не слышал о таком фреймворке. Покажите этот файл database.php (Можно без пароля )
Конечно, кому как не мне знать, что всего знать невозможно)) вот весь файл: PHP: <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /* | ------------------------------------------------------------------- | DATABASE CONNECTIVITY SETTINGS | ------------------------------------------------------------------- | This file will contain the settings needed to access your database. | | For complete instructions please consult the 'Database Connection' | page of the User Guide. | | ------------------------------------------------------------------- | EXPLANATION OF VARIABLES | ------------------------------------------------------------------- | | ['hostname'] The hostname of your database server. | ['username'] The username used to connect to the database | ['password'] The password used to connect to the database | ['database'] The name of the database you want to connect to | ['dbdriver'] The database type. ie: mysql. Currently supported: mysql, mysqli, postgre, odbc, mssql, sqlite, oci8 | ['dbprefix'] You can add an optional prefix, which will be added | to the table name when using the Active Record class | ['pconnect'] TRUE/FALSE - Whether to use a persistent connection | ['db_debug'] TRUE/FALSE - Whether database errors should be displayed. | ['cache_on'] TRUE/FALSE - Enables/disables query caching | ['cachedir'] The path to the folder where cache files should be stored | ['char_set'] The character set used in communicating with the database | ['dbcollat'] The character collation used in communicating with the database | NOTE: For MySQL and MySQLi databases, this setting is only used | as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7 | (and in table creation queries made with DB Forge). | There is an incompatibility in PHP with mysql_real_escape_string() which | can make your site vulnerable to SQL injection if you are using a | multi-byte character set and are running versions lower than these. | Sites using Latin-1 or UTF-8 database character set and collation are unaffected. | ['swap_pre'] A default table prefix that should be swapped with the dbprefix | ['autoinit'] Whether or not to automatically initialize the database. | ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections | - good for ensuring strict SQL while developing | | The $active_group variable lets you choose which connection group to | make active. By default there is only one group (the 'default' group). | | The $active_record variables lets you determine whether or not to load | the active record class */ $active_group = 'default'; $active_record = TRUE; $db['default']['hostname'] = 'mysql.ru-marketroll.myjino.ru'; $db['default']['username'] = '046440826_fantan'; $db['default']['password'] = '**********'; $db['default']['database'] = 'ru-marketroll_fantan'; $db['default']['dbdriver'] = 'mysql'; $db['default']['dbprefix'] = ''; $db['default']['pconnect'] = TRUE; $db['default']['db_debug'] = TRUE; $db['default']['cache_on'] = FALSE; $db['default']['cachedir'] = ''; $db['default']['char_set'] = 'utf8'; $db['default']['dbcollat'] = 'utf8_general_ci'; $db['default']['swap_pre'] = ''; $db['default']['autoinit'] = TRUE; $db['default']['stricton'] = FALSE; /* End of file database.php */ /* Location: ./application/config/database.php */
Так тут нет самой функции подключения. Здесь только данные. Сама функция находится в каком-то другом файле.
Нашёл. Попробуйте так: PHP: <?php $this->load->database(); $col = $this->db->query("SELECT count(1) FROM `table` WHERE `key_c`='imy_tovara'"); $col = $col->row_array();?> <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1];?>)</a></li> Возможно, будет работать без первой строки.
В этот раз почти получилось)) Сделал так: PHP: <?php $this->load->database(); $col = $this->db->query("SELECT count(1) FROM `comments` WHERE `key_c`='imy_tovara'"); $col = $col->row_array();?> <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1];?>)</a></li> В месте где должна появиться цифра соответствующая количеству отзывов, появилось вот это:
Если совсем не будет получаться, можно сделать такой себе костыль: PHP: <?php $db=mysqli_connect('Имя хоста','юзер','пароль','База данных'); $col = mysqli_fetch_assoc(mysqli_query($db, "SELECT count(1) FROM `comments` WHERE `key_c`='imy_tovara'")); ?> <li class="active"><a data-toggle="tab" href="#panel1_3">Отзывы о товаре (<?php echo $col[1];?>)</a></li> Но это совсем плохо, хоть и будет работать