Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не корректно подсчитывается количество записей в базе данных
 
 автор: franko   (06.04.2011 в 17:08)   письмо автору
 
 

добрый день!
выводим список учебных заведений.
а сверху указываем города, в которых есть эти учебные заведения + кол-во учебных заведений в этих городах.
счетчик не верно считает.
<?php   
$sql 
mysql_query("SELECT * FROM towns WHERE id_region='$id_region' ORDER by title"); 


if(!
$sql)  
{echo 
"<br>В данном разделе пока нет информации";}  
else   
{  
  if(
mysql_num_rows($sql) > 0)   
  { 
  
// ниже узнаем сколько записей в таблице universities в которых  id_town одинаковое
  
$res mysql_query("SELECT  COUNT(*) FROM universities WHERE id_town='$id_town'");
  
$row mysql_fetch_row($res);
  
$total $row[0]; // всего записей

  

    
echo "<table width='100%' border='0' cellspacing='0' cellpadding='0'>";   
    
$i 0;   
    while (
$row mysql_fetch_array($sql))    
    {    
      
$i++;   
      if(
$i == 1) echo "<tr>";   
echo 
"<td><table width='100px' border='0' cellspacing='0' cellpadding='0' >  
<tr>  
<td nowrap><a href='post_towns.php?id_town=
$row[id_town]'>$row[title]</a>&nbsp;($row[0])</td>  
</tr>  
</table></td>"
;  
//Указываем количество столбцов на странице  
if($i == 3)   
{   
echo 
"</tr>";   
$i 0;   
}   
}   
echo 
"</table>";   
}}  
?>

  Ответить  
 
 автор: deimand   (06.04.2011 в 17:13)   письмо автору
 
   для: franko   (06.04.2011 в 17:08)
 

$total куда пропала?
$row уже переопределена в цикле.

<td nowrap><a href='post_towns.php?id_town=$row[id_town]'>$row[title]</a>&nbsp;($total)</td>

  Ответить  
 
 автор: cheops   (06.04.2011 в 17:56)   письмо автору
 
   для: franko   (06.04.2011 в 17:08)
 

1. А откуда берется значение $id_town (оно корректное)?
2. Поставьте проверку - не выводится никакой ошибки?
<?php
  
...
  
$query "SELECT  COUNT(*) FROM universities WHERE id_town='$id_town'";
  
$res mysql_query($query); 
  if(!
$res) exit("Ошибка - ".$query);
  
$row mysql_fetch_row($res); 
  
$total $row[0]; // всего записей
  
...
?>

PS Да, и в самом деле, у вас действительно переменная $total далее не используется, а следующий цикл затирает все что в $row.

  Ответить  
 
 автор: franko   (06.04.2011 в 18:17)   письмо автору
 
   для: cheops   (06.04.2011 в 17:56)
 

1. Вот структура используемых таблиц

universities (id_university, title, ID_town, ID_region, ID_state)
towns ( ID_town, title, id_region)

2. Ошибок нет.

3. поставил $total во всех значениях теперь нули

  Ответить  
 
 автор: cheops   (06.04.2011 в 18:25)   письмо автору
 
   для: franko   (06.04.2011 в 18:17)
 

Выведите запросы при помощи echo, как они выглядят?
echo "SELECT  COUNT(*) FROM universities WHERE id_town='$id_town'";

Если их выполнять в phpMyAdmin или в командной строке они тоже 0 возвращают?

  Ответить  
 
 автор: franko   (06.04.2011 в 18:33)   письмо автору
 
   для: cheops   (06.04.2011 в 18:25)
 

последнее не понял как сделать. можете еще раз пояснить?
echo $total - тут ноль.

  Ответить  
 
 автор: cheops   (06.04.2011 в 19:02)   письмо автору
 
   для: franko   (06.04.2011 в 18:33)
 

А прямо рядом с вызовом mysql_query() выведите
<?php
  
...
  echo 
"SELECT  COUNT(*) FROM universities WHERE id_town='$id_town'<br>";
  
$res mysql_query("SELECT  COUNT(*) FROM universities WHERE id_town='$id_town'");
  ...
?>

  Ответить  
 
 автор: franko   (06.04.2011 в 19:03)   письмо автору
 
   для: cheops   (06.04.2011 в 19:02)
 

на выходе:

SELECT COUNT(*) FROM universities WHERE id_town=''

  Ответить  
 
 автор: cheops   (06.04.2011 в 19:44)   письмо автору
 
   для: franko   (06.04.2011 в 19:03)
 

Значит переменная $id_town пустая, нужно выяснить почему так.

  Ответить  
 
 автор: franko   (06.04.2011 в 20:37)   письмо автору
 
   для: cheops   (06.04.2011 в 19:02)
 

id_town не пустая.

видно запрос SELECT COUNT(*) FROM universities WHERE id_town='$id_town' не верен

  Ответить  
 
 автор: cheops   (06.04.2011 в 21:35)   письмо автору
 
   для: franko   (06.04.2011 в 20:37)
 

Значит переменная $id_town где-то обнуляется, иначе бы значение было в одиночных скобках поля id_town
SELECT COUNT(*) FROM universities WHERE id_town=''
Откуда она поступает в скрипт и как формируется?

  Ответить  
 
 автор: franko   (07.04.2011 в 07:50)   письмо автору
 
   для: cheops   (06.04.2011 в 21:35)
 

структура таблиц
universities (id_university, title, ID_town, ID_region, ID_state)
towns ( ID_town, title, id_region)


вначале вывожу города одного региона
$sql = mysql_query("SELECT * FROM towns WHERE id_region='$id_region' ORDER by title"); 

у этого города известно ID_town

далее просто надо посчитать сколько одинаковых городов в таблице universities
$res = mysql_query("SELECT  COUNT(*) FROM universities WHERE id_town='$id_town'");


вот откуда берется id_town

  Ответить  
 
 автор: cheops   (07.04.2011 в 09:00)   письмо автору
 
   для: franko   (07.04.2011 в 07:50)
 

Имеется в виду не MySQL-поле id_town, с ним все в порядке, а PHP-переменная $id_town, которая подставляется в MySQL-запрос. Она оказывается пустой - из-за этого запрос работает неправильно.

  Ответить  
 
 автор: franko   (07.04.2011 в 09:42)   письмо автору
 
   для: cheops   (07.04.2011 в 09:00)
 

тогда что можно занести в $id_town чтобы запрос верно работал?

  Ответить  
 
 автор: cheops   (07.04.2011 в 09:49)   письмо автору
 
   для: franko   (07.04.2011 в 09:42)
 

Если я правильно понял, задумка была извлечь города из запроса
<?php
...
$sql mysql_query("SELECT * FROM towns WHERE id_region='$id_region' ORDER by title"); 
...
?>
Вы его выполняете, однако, данных из него не извлекаете: для этого запроса нет ни одного вызова функции mysql_fetch_array(), или какой-то другой функции, извлекающей данные из результирующей таблицы. Вы просто проверяете выполнен ли запрос и если выполнен, то начинаете извлекать ВУЗы. Обработайте его так (у вас получится два вложенных while-цикла), чтобы получить массив $towns и тогда вы сможете заполнить переменную $id_town
<?php
  
...
  while(
$towns mysql_fetch_array($sql))
  {
    ...
    
$id_town $towns['id_town'];
    ...
  }
  ...
?>

  Ответить  
 
 автор: franko   (07.04.2011 в 10:05)   письмо автору
 
   для: cheops   (07.04.2011 в 09:49)
 

если взглянуть на http://vuz.11klassniki.ru/post_regions.php?id_region=1 то города у меня извлекаются.
в скобках - (кол-во вузов) -по нулям

  Ответить  
 
 автор: cheops   (07.04.2011 в 10:21)   письмо автору
 
   для: franko   (07.04.2011 в 10:05)
 

Если не сложно прикрепите полный вариант скрипта в виде файла или опишите подробнее, как формируете переменную $id_town.

  Ответить  
 
 автор: franko   (07.04.2011 в 10:26)   письмо автору
3.6 Кб
 
   для: cheops   (07.04.2011 в 10:21)
 

прикладываю

  Ответить  
 
 автор: cheops   (07.04.2011 в 11:23)   письмо автору
 
   для: franko   (07.04.2011 в 10:26)
 

Понятно, вы запрос вынесли за пределы цикла, возьмите вот этот блок
<?php   
$sql 
mysql_query("SELECT * FROM towns WHERE id_region='$id_region' ORDER by title"); 
if(!
$sql)  
{echo 
"<br>В данном разделе пока нет информации";}  
else   
{  
  if(
mysql_num_rows($sql) > 0)   
  { 
  
$res mysql_query("SELECT  COUNT(*) FROM universities WHERE id_town='$id_town'");
  if(!
$res) exit("Ошибка - ".$query); 
  
$row mysql_fetch_row($res);  
  
$total $row[0]; // всего записей
  
  
    
echo "<table width='100%' border='0' cellspacing='0' cellpadding='0'>";   
    
$i 0;   
    while (
$row mysql_fetch_array($sql))    
    {    
      
$i++;   
      if(
$i == 1) echo "<tr>";   
echo 
"<td><table width='100px' border='0' cellspacing='0' cellpadding='0' >  
<tr>  
<td nowrap><a href='post_towns.php?id_town=
$row[id_town]'>$row[title]</a>&nbsp;($total)</td>  
</tr>  
</table></td>"
;  
//Указываем количество столбцов на странице  
if($i == 3)   
{   
echo 
"</tr>";   
$i 0;   
}   
}   
echo 
"</table>";   
}}  
?>
и замените его следующим
<?php   
  $query 
"SELECT * FROM towns 
            WHERE id_region='
$id_region'
            ORDER by title"
;
  
$sql mysql_query($query); 
  if(!
$sql) exit("<br>Ошибка обращения к базе данных - ".mysql_error());
  if(!
mysql_num_rows($sql))
  {
    echo 
"<br>В данном разделе пока нет информации";
  }
  else
  { 
    echo 
"<table width='100%' border='0' cellspacing='0' cellpadding='0'>";   
    
$i 0;   
    while (
$row mysql_fetch_array($sql))    
    {    
      
$query "SELECT COUNT(*) FROM universities 
                WHERE id_town='
$row[id_town]'";
      
$res mysql_query();
      if(!
$res) exit("<br>Ошибка обращения к базе данных - ".mysql_error());
      
$total mysql_result($res0);

      
$i++;   
      if(
$i == 1) echo "<tr>";   
      echo 
"<td><table width='100px' border='0' cellspacing='0' cellpadding='0' >  
            <tr>  
            <td nowrap><a href='post_towns.php?id_town=
$row[id_town]'>$row[title]</a>&nbsp;($total)</td>  
            </tr>  
            </table></td>"
;  
      
//Указываем количество столбцов на странице  
      
if($i == 3)   
      {   
        echo 
"</tr>";   
        
$i 0;   
      }   
    }   
    echo 
"</table>";
  }
?>

  Ответить  
 
 автор: franko   (07.04.2011 в 11:52)   письмо автору
 
   для: cheops   (07.04.2011 в 11:23)
 

ошибку дает
Warning: Wrong parameter count for mysql_query() in .. on line 74

Ошибка обращения к базе данных -


74 строка - $res = mysql_query();

  Ответить  
 
 автор: cheops   (07.04.2011 в 12:32)   письмо автору
 
   для: franko   (07.04.2011 в 11:52)
 

Забыл $query, возьмите вот этот вариант
<?php    
  $query 
"SELECT * FROM towns  
            WHERE id_region='
$id_region
            ORDER by title"

  
$sql mysql_query($query);  
  if(!
$sql) exit("<br>Ошибка обращения к базе данных - ".mysql_error()); 
  if(!
mysql_num_rows($sql)) 
  { 
    echo 
"<br>В данном разделе пока нет информации"
  } 
  else 
  {  
    echo 
"<table width='100%' border='0' cellspacing='0' cellpadding='0'>";    
    
$i 0;    
    while (
$row mysql_fetch_array($sql))     
    {     
      
$query "SELECT COUNT(*) FROM universities  
                WHERE id_town='
$row[id_town]'"
      
$res mysql_query($query); 
      if(!
$res) exit("<br>Ошибка обращения к базе данных - ".mysql_error()); 
      
$total mysql_result($res0); 

      
$i++;    
      if(
$i == 1) echo "<tr>";    
      echo 
"<td><table width='100px' border='0' cellspacing='0' cellpadding='0' >   
            <tr>   
            <td nowrap><a href='post_towns.php?id_town=
$row[id_town]'>$row[title]</a>&nbsp;($total)</td>   
            </tr>   
            </table></td>"
;   
      
//Указываем количество столбцов на странице   
      
if($i == 3)    
      {    
        echo 
"</tr>";    
        
$i 0;    
      }    
    }    
    echo 
"</table>"
  } 
?>

  Ответить  
 
 автор: franko   (07.04.2011 в 12:35)   письмо автору
 
   для: cheops   (07.04.2011 в 12:32)
 

Работает как часы. спасибо!

  Ответить  
 
 автор: franko   (07.04.2011 в 13:20)   письмо автору
 
   для: franko   (07.04.2011 в 12:35)
 

к примеру, как реализовать следующее:

ссылка которая содержит город с кол-вом учебных заведений
 <td nowrap><a href='post_towns.php?id_town=$row[id_town]'>$row[title]</a>&nbsp;($total)</td>   

будет вести не на post_towns.php а возвращаться на эту же страницу, но теперь город по которому кликнули выделяется и выводится список учебных заведений в этом городе.
вот как здесьhttp://www.edu.ru/abitur/act.5/rgn.25000000/index.php

  Ответить  
 
 автор: cheops   (07.04.2011 в 13:49)   письмо автору
 
   для: franko   (07.04.2011 в 13:20)
 

Сравнивайте переменную $_GET['id_town'] с $row['id_town'], если они совпадают - выделяйте ссылку, а при выборе университета ориентируйтесь на id_town, а не на id_region (для этого удобно WHERE-условие формировать отдельно от запроса тоже при помощи оператора if).

PS Под новые вопросы лучше заводить новые темы (эта уже слишком длинная).

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования