За последние 24 часа нас посетили 59857 программистов и 1779 роботов. Сейчас ищут 843 программиста ...

Вывод информации из БД

Тема в разделе "PHP для новичков", создана пользователем McLotos, 15 мар 2011.

  1. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Написал страницу, которая должна выводить из таблицы БД информацию о звонках вошедшего пользователя.
    PHP:
    1. echo $tcalls;
    2. $result = mysql_query("SELECT * FROM Calls,users WHERE id='$id' ORDER BY recipient");
    3. $myrow = mysql_fetch_array($result);
    4. do {printf("<tr>
    5.           <td>%s</td>
    6.           <td>%s</td>
    7.           <td>%s</td>
    8.           <td>%s</td>
    9.           <td>%s</td>
    10.           <td>%s</td>
    11.           <td>%s</td>
    12.           <td>%s</td>
    13.           <td>%s</td>
    14.           ",$myrow['phone_number'],$myrow['date_of_call'],$myrow['time_of_call'],$myrow['duration'],
    15. $myrow['cost'],$myrow['recipient'],$myrow['description'],$myrow['connection_type'],$myrow['volume'],
    16. $myrow['rouming']);
    17.     }
    18. while($myrow = mysql_fetch_array($result));
    19.           echo "</tr>
    20.           </table><br>";  
    Страница должна отобрать с БД строки, где в phone_number стоит номер телефона вошедшего пользователя, а она показывает ВСЮ таблицу Calls, только заменяет реальные номера пользователей, на номер вошедшего. Почему?
     
  2. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    в запросе только к одной таблице можно обращаться. p,s почитайте про SQL запросы статьи, можно 2 таблицы объединить.
     
  3. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    [​IMG]
    пошел бы сам почитал, прежде чем тут диагноз ставить.
     
  4. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Если я обращаюсь только к одной таблице Calls в таком случае вообще ничего не происходит. А как можно к примеру обратиться к БД без использования id, а допустим по номеру телефона пользователя, который указан у него в анкете таблицы users.
    "SELECT * FROM Calls WHERE phone_number='$phone_number' ORDER BY recipient" //это через сессию, номер берётся в сессии
    или к примеру так
    "SELECT * FROM Calls WHERE Calls.phone_number=users.phone_number ORDER BY recipient" //номер берётся в БД

    Но почему-то оба эти пособа не работают. Они либо ничего не выводят, либо пишут ошибку. А в том варианте, как сейчас. Выводится вся таблица!
     
  5. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    для того чтобы правильно ответить на твои вопросы сначала нужно привести структуру таблиц и назначение полей
     
  6. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    SELECT * FROM calls INNER JOIN users ON calls.recipient = users.id WHERE calls.phone_number='$phone_number'

    Как-то так наверное. Структуру таблиц напиши

    И еще - научитесь писать $result = mysql_query($sql_text) or die(mysql_error);

    чтобы хотя б ошибки видеть. И сам запрос в отдельную переменную пихать, чтобы можно было вывести на экран (записать в лог) и выполнить руками
     
  7. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Таблица Calls

    CREATE TABLE IF NOT EXISTS `Calls` (
    `phone_number` varchar(11) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, \\номер телефона
    `date_of_call` date DEFAULT NULL, \\дата звонка
    `time_of_call` time DEFAULT NULL, \\время звонка
    `duration` text, \\длительность
    `cost` float DEFAULT NULL, \\стоимость
    `recipient` varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, \\получатель вызова
    `type` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, \\тип
    `description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, \\описание
    `connection_type` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, \\тип соединения
    `volume` float DEFAULT NULL, \\объём
    `rouming` text CHARACTER SET utf8 COLLATE utf8_unicode_ci \\роуминг
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, \\id пользователя
    `business_unit` varchar(10) COLLATE utf8_unicode_ci NOT NULL, \\филиал
    `lastname` varchar(30) COLLATE utf8_unicode_ci NOT NULL, \\фамилия
    `firstname` varchar(30) COLLATE utf8_unicode_ci NOT NULL, \\имя
    `dostup` enum('0','1','2') COLLATE utf8_unicode_ci NOT NULL, \\уровень доступа
    `doa` date NOT NULL, \\дата получения номера
    `dod` date NOT NULL, \\дата сдачи номера
    `month_limit` int(11) NOT NULL, \\лимит на месяц
    `phone_number` varchar(11) COLLATE utf8_unicode_ci NOT NULL, \\номер телефона
    `login` varchar(15) COLLATE utf8_unicode_ci NOT NULL, \\логин
    `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL, \\пароль
    `linemanager` varchar(50) COLLATE utf8_unicode_ci NOT NULL, \\LineManager
    `Email` varchar(50) COLLATE utf8_unicode_ci NOT NULL, \\e-mail
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=23 ;
     
  8. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Твою задачу можно сформулировать так
    1) найти номер телефона вошедшего пользователя с кодом $id в таблице users
    2) найти все звонки , сделанные с этого номера
    PHP:
    1.  
    2. $query="select t.* from calls t left outer join users u on t.phone_number=u.phone_number and u.id='$id' ORDER BY t.recipient";
    3. $result=mysql_query($query);
    4. if($result)
    5. {
    6.       $o=array();
    7.       $o[]="<table>";
    8.       while($myrow = mysql_fetch_array($result))
    9.       {
    10.             $o[]="<tr>";
    11.             $o[]="<td>{$myrow['recipient']}</td>";
    12.             $o[]="<td>{$myrow['date_of_call']}</td>";
    13.             $o[]="<td>{$myrow['time_of_call']}</td>";
    14.             $o[]="<td>{$myrow['duration']}</td>";
    15.             $o[]="<td>{$myrow['cost']}</td>";
    16.             $o[]="<td>{$myrow['description']}</td>";
    17.             $o[]="<td>{$myrow['connection_type']}</td>";
    18.             $o[]="<td>{$myrow['volume']}</td>";
    19.             $o[]="<td>{$myrow['rouming']}</td>";
    20.             $o[]="</tr>";
    21.       }
    22.       $o[]="</table>";
    23.       echo implode('',$o);
    24. }
    25. else
    26. {
    27.      print mysql_error();
    28. }
    29.  
    Здесь я полагал что в поле recipient находится номер, на который звонил вошедший пользователь
    Также для ускорения работы тебе нужно создать индексы по полю phone_number для обоих таблиц
     
  9. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Спасибо, а вот что такое t и u?
    И кстати опять та же история, выводится полностью вся таблица, т.е. даже те строчки где стоят другие номера. Т.е. я захожу от имени любого пользователя, а мне выводятся одни и те же данные, только первая колонка (номер) пустая.
    У меня складывается впечатление, что скрипт вообще не видит мой номер в сессии, потому-что даже echo"$phone_number";
    ничего не выводит. Кто-нибудь помжет посмотреть код всей страницы и подсказать где я ошибся?
     
  10. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    1) t и u это алиасы таблиц - ну чтобы полностью не писать названия таблиц , а просто короткий алиас
    2) сказать трудно почему так происходит. Я то считал, что в $id хранится id вошедшего пользователя. Причины могут быть самые разные
    -Может ты сессию не стартуешь
    -может ты не сохраняешь id вошедшего пользователя

    выведи на экран сам запрос и сравни при входе под различным пользователем

    PHP:
    1.  
    2. $query="select t.* from calls t left outer join users u on t.phone_number=u.phone_number and u.id='$id' ORDER BY t.recipient";
    3. print $query;
    4.  
     
  11. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Это всё очень сложно объяснять на пальцах. Это нужно показывать.
     
  12. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    McLotos смотри
    1) ты привел код, где используешь переменную $id. По твоему запросу я делаю вывод, что это код вошедшего пользователя.
    Поэтому с моей точки зрения, составленный мной запрос должен выполнить поставленную задачу. Однако ты говоришь, что нет - запрос не дает то. что нужно. Вывод отсюда только такой - посыл неверный т.е. в $id находится не код вошедшего пользователя
    2) я не вижу какое значение ты присваиваешь переменной $id. Значит либо ты сам добиваешься того, чтобы в $id находился код вошедшего пользователя либо приводишь кусок кода где это происходит и тебе укажут где ошибка
     
  13. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    runner Логически всё правильно, но проблема остаётся открытой, $id это id юзера, который вошёл в систему, но по какой-то странной логике система не фильтрует таблицу Calls, она просто берёт и заменяет абсолютно все номера телефонов (около 45000 строк) на номер телефона вошедшего юзера. И выводит ему всю таблицу, потому что логически получается что все звонки в этой таблице принадлежат ему. А если заходит другой пользователь, система повторяет всю процедуру и снова выводит полностью всю таблицу, только уже дугому пользователю. В результате получается что заходят 2 разных пользователя, а получают одну у ту же таблицу, с той лишь разницей, что в исходящих стоит номер каждого из них.
     
  14. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    как бы я поступил в этой ситуации
    1) как и ты я бы логинился бы под разными логинами
    2) убедился бы что в $id именно id вошедшего пользователя. Если это не так - значит искал бы почему это не так
    3) Пусть у нас в $id именно id вошедшего пользователя. Тогда вывел бы на экран выполняемый запрос
    $query="select t.* from calls t left outer join users u on t.phone_number=u.phone_number and u.id='$id' ORDER BY t.recipient";
    и выполнил его в phpMyAdmin. Если все равно нет желанного результата, то тогда бы в начал смотреть в phpMyAdmin что за данные у меня в таблице calls
    4) можно заменить на всякий случай
    $query="select t.* from calls t left outer join users u on t.phone_number=u.phone_number and u.id='$id' ORDER BY t.recipient";
    на
    $query="select t.* from calls t left outer join users u on t.phone_number=u.phone_number where u.id='$id' ORDER BY t.recipient";
     
  15. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    ID определяется правильно, не определяется номер телефона вошедшего пользователя
     
  16. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Кстати последний предложенный запрос сработал так как нужно, а как теперь проверить правильно ли он выводит данные?
    Всё ли он выводит и действительно ли это звонки именно вошедшего пользователя
     
  17. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Попробуй запрос
    $query="select t.*,u.phone_number as user_phone_number from calls t left outer join users u on t.phone_number=u.phone_number where u.id='$id' ORDER BY t.recipient";

    в поле user_phone_number должен быть телефон вошедшего пользователя
     
  18. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    ничего не изменилось
     
  19. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Предыдущий мой пост был неверный

    В таблице calls поле phone_number - это телефон звонящего, а recipient - это телефон куда звонят правильно?
    Тогда согласно этому в моем запросе выполняется следующее
    выбрать все поля из таблицы class
    select t.* from calls t
    те записи, для которых телефон звонившего равен номеру телефона пользователя
    left outer join users u on t.phone_number=u.phone_number
    и где код пользователя равен коду звонившего where u.id='$id'

    Получается в полученных записях в поле phone_number будет номер звонившего, а поле recipient - телефон куда звонили. Когда я приводил код, я посчитал что номер телефона вошедшего пользователя не нужен и его пропустил
    PHP:
    1.  
    2. $query="select t.* from calls t left outer join users u on t.phone_number=u.phone_number where u.id='$id' ORDER BY t.recipient";
    3. $result=mysql_query($query);
    4. if($result)
    5. {                                    
    6.       $o=array();
    7.       $o[]="<table>";
    8.       $o[]="<tr>";        
    9.       $o[]="<td>Телефон звонившего</td>";
    10.       $o[]="<td>Звонили на телефон</td>";
    11.       $o[]="<td>Дата</td>";
    12.       $o[]="<td>Время</td>";
    13.       $o[]="<td>Продолжительность</td>";
    14.       $o[]="<td>Стоимость</td>";
    15.       $o[]="<td>Описание</td>";
    16.       $o[]="<td>Тип соединения</td>";
    17.       $o[]="<td>Сумма</td>";
    18.       $o[]="<td>Роуминг</td>";
    19.       $o[]="</tr>";
    20.       while($myrow = mysql_fetch_array($result))
    21.       {
    22.             $o[]="<tr>";                    
    23.             $o[]="<td>{$myrow['phone_number']}</td>";
    24.             $o[]="<td>{$myrow['recipient']}</td>";
    25.             $o[]="<td>{$myrow['date_of_call']}</td>";
    26.             $o[]="<td>{$myrow['time_of_call']}</td>";
    27.             $o[]="<td>{$myrow['duration']}</td>";
    28.             $o[]="<td>{$myrow['cost']}</td>";
    29.             $o[]="<td>{$myrow['description']}</td>";
    30.             $o[]="<td>{$myrow['connection_type']}</td>";
    31.             $o[]="<td>{$myrow['volume']}</td>";
    32.             $o[]="<td>{$myrow['rouming']}</td>";
    33.             $o[]="</tr>";
    34.       }
    35.       $o[]="</table>";
    36.       echo implode('',$o);
    37. }
    38. else
    39. {
    40.     print mysql_error();
    41. }
    42.  
     
  20. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    А как проверить все ли звонки пользователя выводятся и все ли звонки принадлежат именно ему?
     
  21. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    можно проверить в phpMyAdmin
    1) находишь телефон вошедшего пользователя в таблице users по его коду
    2) даешь поиск для таблицы calls phone_number=найденный телефон
     
  22. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Спасибо! Супер! Всё работает почти так как нужно! Сейчас только подправллю некоторые моменты.