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

Форум MySQL

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

 

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

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

тема: Выборка данных из базы.
 
 автор: Sin   (03.11.2004 в 18:34)   письмо автору
 
 

Ну вот опять возникли трудности. Что не напишу все время баги получаются.
Вообщем дело такое. такой вот скрипт который выводит данные из скрипта отказывается работать.
sql_connect();//подключение к базе(работает проверено)
$sql_query="SELECT * FROM meseges  LIMIT 0 , 15";
sql_execute();//Выполнение запроса(работает проверено)
$res=$sql_res;
while ($row = mysql_fetch_array($res)) {
    $sql_quary="select * from users where id_user = '".$row['id_user']."'";
    sql_execute();
    $name= mysql_fetch_array($sql_quary);//вот тут и происходит петрушка
    echo .$row['post_subject']."<br>";
    echo $name['name_user']
}
sql_close();

Ни как не хочет производить второй запрос $sql_quary="select * from users where id_user = '".$row['id_user']."'"; Вообщем я хотел сделать так. Выводть сообщения из таблицы meseges, а зная id_user найти по ниму имя из таблицы users. Вот так может я что то не правильно делаю?

   
 
 автор: elenaki   (03.11.2004 в 20:14)   письмо автору
 
   для: Sin   (03.11.2004 в 18:34)
 

$sql_quary="select * from users where id_user = '".$row['id_user']."'";

кажется, тут многовато кавычек. а если вот так:

$sql_quary="select * from users where id_user = ".$row['id_user'];

   
 
 автор: Hidden Demon   (03.11.2004 в 20:37)   письмо автору
 
   для: elenaki   (03.11.2004 в 20:14)
 

$sql_qu??? a ???ry
<?php
$sql_quary 
"SELECT * FROM users WHERE id_user = '".$row['id_user']."';";
?>

   
 
 автор: glsv (Дизайнер)   (03.11.2004 в 21:02)   письмо автору
 
   для: Sin   (03.11.2004 в 18:34)
 

А почему Вы в эту строку подставляете текстовую переменную $sql_quary?


<?
$name
mysql_fetch_array($sql_quary);//вот тут и происходит петрушка 
?>

   
 
 автор: Sin   (03.11.2004 в 21:09)   письмо автору
 
   для: glsv (Дизайнер)   (03.11.2004 в 21:02)
 

Точно!!!!!!! Нуна sql_res писать. Савсем голова не работает. Пасиба большое всем!!! :0)

   
 
 автор: glsv (Дизайнер)   (03.11.2004 в 21:14)   письмо автору
 
   для: Sin   (03.11.2004 в 18:34)
 

Вы хотите для вывести сообщения и авторов для каждого сообщения?
В принципе это можно сделать за один запрос:
Не знаю структуру Ваших таблиц, но вот аналогичный запрос для нашего форума:

themes - таблица с темами
authors - таблица авторов
Обе таблицы связаны по идентификатору автора - id_author

<?
$query
="SELECT themes.name As nametheme,  authors.name As name FROM themes, authors WHERE  themes.id_author = authors.id_author LIMIT 0, 15";
$res=mysql_query($query);
if(
$res)
{
  while (
$row mysql_fetch_array($res))
  { 
    echo 
$row['nametheme']."  ".$row['name']."<br>";
  }
}
?>

   
 
 автор: Sin   (03.11.2004 в 22:18)   письмо автору
 
   для: glsv (Дизайнер)   (03.11.2004 в 21:14)
 

Агу!!! Все получилось!!! Теперья знаю новый способ запросов. Спасибо Дизайнеру. И скрипт упрастился намного. Вот класс :)

   
 
 автор: chip   (16.11.2004 в 07:50)   письмо автору
 
   для: Sin   (03.11.2004 в 22:18)
 

Как осуществляется запрос если есть несколько полей которые могу быть не заполнены ? Т.е. некоторые поля ввода пользователь не ввел.
Можно конечно от заполненных полей формировать конкретный запрос на выборку, а можно ли выполнить такой запрос где все поля будут необязательными , т.е. ввел только квартиру или только телефон ... ?

<input type="text" NAME="fam" value="фамилия"><br>
<input type="text" NAME="i" value="Имя"><br>
<input type="text" NAME="o" value="Отчество"><br>
<input type="text" NAME="ul" value="Улица"><br>
<input type="text" NAME="dom" value="Дом"><br>
<input type="text" NAME="kvartira" value="Квартира"><br>
<input type="text" NAME="tel" value="Телефон"><br>

И еще вот вопрос в базе таблица сделана так:

# Структура таблицы 'tel'
CREATE TABLE 'tel' (
  'Id' int(6) unsigned NOT NULL auto_increment,
  'fam' text NOT NULL,
  'i' text NOT NULL,
  'o' text NOT NULL,
  'ul' tinyint(3) NOT NULL default '0',
  'dom' text NOT NULL,
  'kvartira' smallint(3) NOT NULL default '0',
  'tel' int(6) NOT NULL default '0',
  PRIMARY KEY  ('Id')
) TYPE=MyISAM AUTO_INCREMENT=92479 ;


вторая так:

# Структура таблицы 'ul'
CREATE TABLE 'ul' (
  'ALF_NOM' int(6) unsigned NOT NULL default '0',
  'KOD' tinyint(4) unsigned NOT NULL default '0',
  'NAME' text NOT NULL,
  PRIMARY KEY  ('ALF_NOM')
) TYPE=MyISAM;

В таблице tel "i" и "o" хранят только одну букву их же лучше сделать char?
И что лучше индексировать
В таблице tel фамилии в алфавитном порядке id=1 фамилия на А id=92479 фамилия на Я. Изначально в базе не было колонки id я ее сам добавил пока сам не знаю зачем :) нужана ли она???
таблица tel и ul будут связаны так:
в таблице ul колонка код= в таблице tel колонки ul

   
 
 автор: cheops   (16.11.2004 в 11:00)   письмо автору
 
   для: chip   (16.11.2004 в 07:50)
 

Хм... так и осуществляйте
INSERT INTO tel VALUES (NULL,'$fam','$i','$o',$ul,'$dom',$kvartira,'$tel')

Те, переменные которые окажутся пустыми просто подставят в выражение пустые строки. Только числовые значения следует проверить, чтобы избежать ошибки при формировании SQL-запроса:
<?php
  
if(empty($ul)) $ul 0;
  if(empty(
$kvartira)) $kvartira 0;
?>

>В таблице tel "i" и "o" хранят только одну букву их же лучше сделать char?
Можно. Здорово в месте и скорости съэкономите (особенно учитывая размер таблицы).
>Изначально в базе не было колонки id я ее сам добавил пока сам не знаю зачем :)
Я думаю пригодится - это же уникальный номер - в номере телефона всегда можно ошибится и набрать его два раза, а этот нет.
>И что лучше индексировать
tel - особенно если соритровать и искать по этому полю собираетесь
>в таблице ul колонка код= в таблице tel колонки ul
Так у них же тип вроде различается - вообще при связке лучше если бы типы совпадали и каждый из концов был проиндексирован.

   
 
 автор: ship   (16.11.2004 в 12:46)
 
   для: cheops   (16.11.2004 в 11:00)
 

в таблице ul колонка код= в таблице tel колонки ul
Так у них же тип вроде различается - вообще при связке лучше если бы типы совпадали

Я подправил и сделал оба TINYINT(4)
Я имел ввиду запрос на поиск.
Что не получается сделать в phpmyadmin делаю вот такой запрос :

SELECT tel. * , ul. * 
FROM tel, ul
WHERE tel.ul = ul.KOD AND fam = 'Иванов' LIMIT 0 , 30 

Все нормально работает а вот вывести таблицу не получается


<html>
<body>
<table  border="1" cellpadding="2" cellspacing="0" bordercolordark="white" bordercolorlight="gray" align="center" width=100% >
<?php
include "powercounter21/admin/config.php";
//Соединяемся с сервером базы данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
//Выбираем базу данных
$db1 = @mysql_select_db($dbname,$dbcnx);
$spisok mysql_query("SELECT tel. * , ul. *
         FROM tel, ul ;"
);
if(
$spisok)
{
// Так как запрос возращает несколько строк, применяем цикл

$spisok mysql_query("SELECT tel. * , ul. *
         FROM tel, ul
          WHERE tel.ul = ul.KOD
         AND fam = 'Иванов' LIMIT 0 , 30 ;"
);

 while   (
$baza mysql_fetch_array ($spisok ))
 {
echo
"<tr><td>".$baza['fam']."</td><td>".$baza['i']."</td><td>".$baza['o']."</td></tr> ";
         }
}
         else
         {
         echo 
"<p><b>Ошибка: ".mysql_error()."</b></p>" ;
         exit();
         }

?>
</table>
</body>
</html>

Где я тут скосячил?
Вот время выборки показанное программой SQLyog (бесплатная и весит меньше метра и не русская %( )
[13:38:41][ 113 ms] SELECT tel. * , ul. *
FROM tel, ul
WHERE tel.ul = ul.KOD
А поиск шел где то секунд 20 или эти 20 секунд шло на отображения???
как ни как (92478 row(s) returned) немало да и дома у меня не сервак.

   
 
 автор: ship   (16.11.2004 в 13:36)
 
   для: ship   (16.11.2004 в 12:46)
 

<?php
include "powercounter21/admin/config.php";
//Соединяемся с сервером базы данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
//Выбираем базу данных
$db1 = @mysql_select_db($dbname,$dbcnx);


         
$spisok mysql_query("SELECT tel. * , ul. *
         FROM tel, ul
          WHERE tel.ul = ul.KOD
         AND fam = 'Иванов' LIMIT 0 , 30 ;"
);

// Так как запрос возращает несколько строк, применяем цикл
while   ($baza mysql_fetch_array ($spisok ))
 {
echo
"<tr><td>".$baza['fam']."</td><td>".$baza['i']."</td><td>".$baza['o']."</td></tr> ";
         }
?>

Так работает ! Где то в условии ошибка ... была

   
 
 автор: chip   (16.11.2004 в 13:51)   письмо автору
 
   для: ship   (16.11.2004 в 13:36)
 

SELECT tel. * , ul. *
FROM tel, ul
WHERE tel.ul = ul.KOD
AND fam = 'Иванов' LIMIT 0 , 30 ;"
А как в этот запрос добавить ИМЯ ФАМИЛИЮ и ...
чтоб параметры поиска были не обязательные?
Если так:
SELECT tel. * , ul. *
FROM tel, ul
WHERE tel.ul = ul.KOD
AND (fam = '$fam' AND i='i') LIMIT 0 , 30 ;"
То он найдет по имени и фамилии но если поле будет не заполненное скажем с именем он не чего не покажет ???
Можно ли такой поис осуществлять средствами MySQL или придется всетаки писать множество запросов и выбирать их в PHP switch???

   
 
 автор: glsv (Дизайнер)   (16.11.2004 в 22:16)   письмо автору
 
   для: chip   (16.11.2004 в 13:51)
 

Необязательные условия не получатся…
Если условие не будет задано, то будет искаться пустое значение. А ведь нужно не это

>Можно ли такой поис осуществлять средствами MySQL или придется всетаки писать множество запросов и выбирать их в PHP switch???

Придется либо писать множество запросов, либо формировать запрос динамически. Если переменная задана, то добавляем условие, если не задана, то не добавляем.

   
 
 автор: chip   (18.11.2004 в 03:49)   письмо автору
 
   для: glsv (Дизайнер)   (16.11.2004 в 22:16)
 

Решил как это сделать ( стоя за станком :) )
Только вопрос в MySQL можно создать такую же конструкцию с IF ? т.е. объеденять запрос средствами MySQL ?

<?php
include "powercounter21/admin/config.php";
//Соединяемся с сервером базы данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
//Выбираем базу данных
$db1 = @mysql_select_db($dbname,$dbcnx);
$sql_all='SELECT tel. * , ul. *
         FROM tel, ul
          WHERE tel.ul = ul.KOD '
;
$sql2="AND (fam = '$fam' )";
$sql3="AND ( i = '$i' )";
$sql4="AND ( o = '$o' )";
$sql_end=' LIMIT 0 , 30 ;';
if (
$fam<>'')
{
$sql_all=$sql_all.$sql2 ;}
if (
$i<>'')
{
$sql_all=$sql_all.$sql3 ;}
if (
$o<>'')
{
$sql_all=$sql_all.$sql4 ;}
$sql_all$sql_all.$sql_end;
$spisok mysql_query("$sql_all");
// Так как запрос возращает несколько строк, применяем цикл
while   ($baza mysql_fetch_array ($spisok ))
 {
echo
"<tr><td>".$baza['fam']."</td><td>".$baza['i']."</td><td>".$baza['o']."</td><td>".$baza['tel']."</td></tr> ";
         }
?>
 

   
 
 автор: cheops   (18.11.2004 в 11:48)   письмо автору
 
   для: chip   (18.11.2004 в 03:49)
 

Объединять запросы в MySQL можно (http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=611&page=1), но это объединение достаточно специфическое...
Вы всё правильно сделали - эту задачу следует решать именно средствами PHP.

   
 
 автор: cheops   (16.11.2004 в 22:20)   письмо автору
 
   для: chip   (16.11.2004 в 13:51)
 

Вот чего не понимаю - если имя и фамилия не обязательны, тогда можно их просто не включать в запрос и вывалятся все и с этими именами и фамилией и без них
SELECT tel. * , ul. * 
FROM tel, ul 
WHERE tel.ul = ul.KOD 
 LIMIT 0 , 30

   
 
 автор: chip   (18.11.2004 в 03:54)   письмо автору
 
   для: cheops   (16.11.2004 в 22:20)
 

Ну если не обязательны это не значит что их не могут вводить!
Это значит что их могут ввести а могут и нет.
Т.Е. оставили поле не заполненным и поиск будет проходить только по заполненным полям.

(Вот этот пример Можно ОТРЕДАКТИРОВАТЬ и поместить в учебничек PHP , мне кажется такое часто требуется)

   
 
 автор: cheops   (18.11.2004 в 11:45)   письмо автору
 
   для: chip   (18.11.2004 в 03:54)
 

Такие задачи лучше решать средствами PHP - динамически формируя SQL-запрос, всё-таки SQL для этого не предназначен...

>(Вот этот пример Можно ОТРЕДАКТИРОВАТЬ и поместить в учебничек PHP , мне
>кажется такое часто требуется)

За время работы форума меня такая же мысль посещала очень часто :)))

   
Rambler's Top100
вверх

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