Написал страницу, которая должна выводить из таблицы БД информацию о звонках вошедшего пользователя. PHP: echo $tcalls; $result = mysql_query("SELECT * FROM Calls,users WHERE id='$id' ORDER BY recipient"); $myrow = mysql_fetch_array($result); do {printf("<tr> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> ",$myrow['phone_number'],$myrow['date_of_call'],$myrow['time_of_call'],$myrow['duration'], $myrow['cost'],$myrow['recipient'],$myrow['description'],$myrow['connection_type'],$myrow['volume'], $myrow['rouming']); } while($myrow = mysql_fetch_array($result)); echo "</tr> </table><br>"; Страница должна отобрать с БД строки, где в phone_number стоит номер телефона вошедшего пользователя, а она показывает ВСЮ таблицу Calls, только заменяет реальные номера пользователей, на номер вошедшего. Почему?
в запросе только к одной таблице можно обращаться. p,s почитайте про SQL запросы статьи, можно 2 таблицы объединить.
Если я обращаюсь только к одной таблице 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" //номер берётся в БД Но почему-то оба эти пособа не работают. Они либо ничего не выводят, либо пишут ошибку. А в том варианте, как сейчас. Выводится вся таблица!
для того чтобы правильно ответить на твои вопросы сначала нужно привести структуру таблиц и назначение полей
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); чтобы хотя б ошибки видеть. И сам запрос в отдельную переменную пихать, чтобы можно было вывести на экран (записать в лог) и выполнить руками
Таблица 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 ;
Твою задачу можно сформулировать так 1) найти номер телефона вошедшего пользователя с кодом $id в таблице users 2) найти все звонки , сделанные с этого номера PHP: $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"; $result=mysql_query($query); if($result) { $o=array(); $o[]="<table>"; while($myrow = mysql_fetch_array($result)) { $o[]="<tr>"; $o[]="<td>{$myrow['recipient']}</td>"; $o[]="<td>{$myrow['date_of_call']}</td>"; $o[]="<td>{$myrow['time_of_call']}</td>"; $o[]="<td>{$myrow['duration']}</td>"; $o[]="<td>{$myrow['cost']}</td>"; $o[]="<td>{$myrow['description']}</td>"; $o[]="<td>{$myrow['connection_type']}</td>"; $o[]="<td>{$myrow['volume']}</td>"; $o[]="<td>{$myrow['rouming']}</td>"; $o[]="</tr>"; } $o[]="</table>"; echo implode('',$o); } else { print mysql_error(); } Здесь я полагал что в поле recipient находится номер, на который звонил вошедший пользователь Также для ускорения работы тебе нужно создать индексы по полю phone_number для обоих таблиц
Спасибо, а вот что такое t и u? И кстати опять та же история, выводится полностью вся таблица, т.е. даже те строчки где стоят другие номера. Т.е. я захожу от имени любого пользователя, а мне выводятся одни и те же данные, только первая колонка (номер) пустая. У меня складывается впечатление, что скрипт вообще не видит мой номер в сессии, потому-что даже echo"$phone_number"; ничего не выводит. Кто-нибудь помжет посмотреть код всей страницы и подсказать где я ошибся?
1) t и u это алиасы таблиц - ну чтобы полностью не писать названия таблиц , а просто короткий алиас 2) сказать трудно почему так происходит. Я то считал, что в $id хранится id вошедшего пользователя. Причины могут быть самые разные -Может ты сессию не стартуешь -может ты не сохраняешь id вошедшего пользователя выведи на экран сам запрос и сравни при входе под различным пользователем PHP: $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"; print $query;
McLotos смотри 1) ты привел код, где используешь переменную $id. По твоему запросу я делаю вывод, что это код вошедшего пользователя. Поэтому с моей точки зрения, составленный мной запрос должен выполнить поставленную задачу. Однако ты говоришь, что нет - запрос не дает то. что нужно. Вывод отсюда только такой - посыл неверный т.е. в $id находится не код вошедшего пользователя 2) я не вижу какое значение ты присваиваешь переменной $id. Значит либо ты сам добиваешься того, чтобы в $id находился код вошедшего пользователя либо приводишь кусок кода где это происходит и тебе укажут где ошибка
runner Логически всё правильно, но проблема остаётся открытой, $id это id юзера, который вошёл в систему, но по какой-то странной логике система не фильтрует таблицу Calls, она просто берёт и заменяет абсолютно все номера телефонов (около 45000 строк) на номер телефона вошедшего юзера. И выводит ему всю таблицу, потому что логически получается что все звонки в этой таблице принадлежат ему. А если заходит другой пользователь, система повторяет всю процедуру и снова выводит полностью всю таблицу, только уже дугому пользователю. В результате получается что заходят 2 разных пользователя, а получают одну у ту же таблицу, с той лишь разницей, что в исходящих стоит номер каждого из них.
как бы я поступил в этой ситуации 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";
Кстати последний предложенный запрос сработал так как нужно, а как теперь проверить правильно ли он выводит данные? Всё ли он выводит и действительно ли это звонки именно вошедшего пользователя
Попробуй запрос $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 должен быть телефон вошедшего пользователя
Предыдущий мой пост был неверный В таблице 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: $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"; $result=mysql_query($query); if($result) { $o=array(); $o[]="<table>"; $o[]="<tr>"; $o[]="<td>Телефон звонившего</td>"; $o[]="<td>Звонили на телефон</td>"; $o[]="<td>Дата</td>"; $o[]="<td>Время</td>"; $o[]="<td>Продолжительность</td>"; $o[]="<td>Стоимость</td>"; $o[]="<td>Описание</td>"; $o[]="<td>Тип соединения</td>"; $o[]="<td>Сумма</td>"; $o[]="<td>Роуминг</td>"; $o[]="</tr>"; while($myrow = mysql_fetch_array($result)) { $o[]="<tr>"; $o[]="<td>{$myrow['phone_number']}</td>"; $o[]="<td>{$myrow['recipient']}</td>"; $o[]="<td>{$myrow['date_of_call']}</td>"; $o[]="<td>{$myrow['time_of_call']}</td>"; $o[]="<td>{$myrow['duration']}</td>"; $o[]="<td>{$myrow['cost']}</td>"; $o[]="<td>{$myrow['description']}</td>"; $o[]="<td>{$myrow['connection_type']}</td>"; $o[]="<td>{$myrow['volume']}</td>"; $o[]="<td>{$myrow['rouming']}</td>"; $o[]="</tr>"; } $o[]="</table>"; echo implode('',$o); } else { print mysql_error(); }
можно проверить в phpMyAdmin 1) находишь телефон вошедшего пользователя в таблице users по его коду 2) даешь поиск для таблицы calls phone_number=найденный телефон