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

Форум MySQL

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

 

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

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

тема: выборка данных из базы данных
 
 автор: Bvz   (11.11.2008 в 15:22)   письмо автору
 
 

Вопрос к старожилам я совсем запутался, выбирая данные из таблиц при ренении одинаковых задач не всегда работают одни и те же функции и запросы.
Очень хочу разобраться когда выполнять те или иные запросы и функции, подскажите, желательно на простых примерах.

а задачи в общем такие:
1. посчитать сколько строк в таблице
2. выбрать один столбец и одну строку столбца и опубликовать ее
3. выбрать несколько столбцов и несколько строк и опубликовать их
4. выбрать несколько столбцов в одной строке столбца и опубликовать их
5. выбрать один столбец и несколько строк и опубликовать их

очень хочется разобраться в этом

  Ответить  
 
 автор: Николай2357   (11.11.2008 в 17:16)   письмо автору
 
   для: Bvz   (11.11.2008 в 15:22)
 

Самый простой способ сочинить простенький запрос, это произвести нужное действие в phpMyAdmyn и скопировать запрос от туда. Подробности PHP функций для работы с БД можно найти здесь

Для начала вот:
<?php 
$db 
mysql_connect("localhost","test","test")or die ('Безобразие 1:' mysql_error());
mysql_select_db("test",$db)or die ('Безобразие 2:' mysql_error());
@
mysql_query("SET NAMES 'utf8'");

$query mysql_query("SELECT COUNT(*) AS num FROM  `test` ")or die ('Безобразие 3:' mysql_error());
echo 
"Количество столбцов в таблице:".mysql_result($query,0,'num')."<br>";

$query mysql_query("SELECT * FROM  `test` LIMIT 1")or die ('Безобразие 4:' mysql_error());
for(
$i=0$i mysql_num_fields($query); $i++)
$str[] = mysql_result($query,0,$i);
echo 
"Выборка всех полей 1 строки:<br>".implode(" | ",$str)."<br>";

$query mysql_query("SELECT `".mysql_field_name($query0)."`FROM  `test` ")or die ('Безобразие 5:' mysql_error());
for(
$i=0$i mysql_num_rows($query); $i++)
$slb[] = mysql_result($query,$i,0);
echo 
"Выборка 1-х полей 1-го солбца:<br>".implode("<br>",$slb)."";

?>

и так далее...
CREATE TABLE `test` (
  `pole1` varchar(100) default NULL,
  `pole2` varchar(100) default NULL,
  `pole3` varchar(100) default NULL,
  `pole4` varchar(100) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Дамп данных таблицы `test`
-- 

INSERT INTO `test` VALUES ('Поле1 столбец1', 'Поле2 столбец1', 'Поле3 столбец1', 'Поле4 столбец1');
INSERT INTO `test` VALUES ('Поле1 столбец2', 'Поле2 столбец2', 'Поле3 столбец2', 'Поле4 столбец2');
INSERT INTO `test` VALUES ('Поле1 столбец3', 'Поле2 столбец3', 'Поле3 столбец3', 'Поле4 столбец3');
INSERT INTO `test` VALUES ('Поле1 столбец4', 'Поле2 столбец4', 'Поле3 столбец4', 'Поле4 столбец4');

  Ответить  
 
 автор: Trianon   (11.11.2008 в 17:34)   письмо автору
 
   для: Николай2357   (11.11.2008 в 17:16)
 

1. Применение mysql_result() в ситуациях 3,4,5 (т.е. при выборке любого результата, отличного от одного единственного значения) представляется мне а) неоптимальным и б) недостаточно прозрачным (плохо читаемым).
Т.е. для них имеет смысл использовать
$row = mysql_fetch_assoc($res) ;

2. Функция mysql_query() принимает запрос, а возвращает результат, вернее его дескриптор.
Писать $query = mysql_query() - свинство еще то.
Кто-то скажет, ерунда, косметика это. Но эта ерунда мешает видеть смысл.

3. Опубликовать результат, в общем случае, подразумевает применение htmlspecialchars()


PS. Это не отменяет полезности ответа в целом. Я вот не добрался....

  Ответить  
 
 автор: Николай2357   (11.11.2008 в 18:30)   письмо автору
 
   для: Trianon   (11.11.2008 в 17:34)
 

Ну вот, я опять извлекаю пользу из чужих постов. Снизу вверх:

>Опубликовать результат, в общем случае, подразумевает применение htmlspecialchars()
хотелось начать оправдания типа: это же для примера и т.п. Не буду, Вы правы, надо внимательней.

>Писать $query = mysql_query() - свинство еще то.
Упс... А как же тогда? Я вообще других вариантов не видел...

>Т.е. для них имеет смысл использовать
>$row = mysql_fetch_assoc($res) ;
и тут матушка лень подвела. Как говорится, тупо скопировал предыдущий.

  Ответить  
 
 автор: Николай2357   (11.11.2008 в 18:39)   письмо автору
 
   для: Николай2357   (11.11.2008 в 18:30)
 

>Писать $query = mysql_query() - свинство еще то.
дошло... учту, раз свинство... :)))

  Ответить  
 
 автор: Bvz   (16.11.2008 в 20:32)   письмо автору
 
   для: Николай2357   (11.11.2008 в 18:39)
 

спасибо! буду разбираться
а для чего в
@mysql_query("SET NAMES 'utf8'"); 

добавляется @

  Ответить  
 
 автор: ddhvvn   (16.11.2008 в 20:39)   письмо автору
 
   для: Bvz   (16.11.2008 в 20:32)
 

подавление вывода ошибок

  Ответить  
 
 автор: Bvz   (16.11.2008 в 20:46)   письмо автору
 
   для: ddhvvn   (16.11.2008 в 20:39)
 

это я знаю, я очень часто замечаю в запросах в этих функциях их добавляют, почему?

  Ответить  
 
 автор: cheops   (17.11.2008 в 11:27)   письмо автору
 
   для: Bvz   (16.11.2008 в 20:46)
 

Если не будет связи с сервером базы данных или ещё по каким-то причинам не сможет выполнить запрос - функция выведет в окно браузера предупреждение на английском языке, что может нарушать дизайн и создавать впечатление непрофессионализма. Если вы подавляете вывод таких предупреждений, вы имеете возможность вывести свой текст в рамках вашего дизайна.

  Ответить  
 
 автор: Bvz   (17.11.2008 в 12:35)   письмо автору
 
   для: cheops   (17.11.2008 в 11:27)
 

а почему только в первом примере используется @

  Ответить  
 
 автор: cheops   (17.11.2008 в 13:31)   письмо автору
 
   для: Bvz   (17.11.2008 в 12:35)
 

Дальше ошибки обрабатываются, дело ещё в том, что SET NAMES появился недавно и в тех версиях MySQL где он не поддерживается - его ошибочное выполнение нужно просто игнорировать, поэтому зачастую и ставят @ перед этим запросом.

  Ответить  
 
 автор: Bvz   (17.11.2008 в 13:27)   письмо автору
 
   для: cheops   (17.11.2008 в 11:27)
 

а что делает?
@mysql_query("SET NAMES 'utf8'"); 

  Ответить  
 
 автор: cheops   (17.11.2008 в 13:41)   письмо автору
 
   для: Bvz   (17.11.2008 в 13:27)
 

Он сообщает, что вы собираетесь общаться с MySQL-сервером в кодировке utf8, поэтому даже если таблицы имеют другую кодировку, например, cp1251, сервер вам будет возвращаться данные в utf8, а ваши данные перед помещением в таблицу перекодировать из utf8. Если не сообщать кодировку, то сервер будет считать, что вы собираетесь общаться с ним в кодировке latin1 (для русского текста это никак не подходит).

  Ответить  
 
 автор: Bvz   (17.11.2008 в 13:48)   письмо автору
 
   для: cheops   (17.11.2008 в 13:41)
 

а вообще оно надо? ))

  Ответить  
 
 автор: cheops   (17.11.2008 в 13:52)   письмо автору
 
   для: Bvz   (17.11.2008 в 13:48)
 

Если собираетесь с русским текстом работать - обязательно. Если только с английским - не обязательно.

  Ответить  
 
 автор: Bvz   (17.11.2008 в 14:04)   письмо автору
 
   для: cheops   (17.11.2008 в 13:52)
 

а почему тогда utf8?

  Ответить  
 
 автор: cheops   (17.11.2008 в 14:09)   письмо автору
 
   для: Bvz   (17.11.2008 в 14:04)
 

Да собственно не обязательно utf8, можете cp1251 выбрать (очень популярная кодировка) или koi8-r или даже cp866 (последняя впрочем не характерна для Интернет). Главное, чтобы кодировка поддерживала русский язык.

  Ответить  
 
 автор: Bvz   (17.11.2008 в 14:29)   письмо автору
 
   для: Николай2357   (11.11.2008 в 17:16)
 

ясно по порядку, первая часть кода
<?php  
$db 
mysql_connect("localhost","test","test")or die ('Безобразие 1:' mysql_error()); 
mysql_select_db("test",$db)or die ('Безобразие 2:' mysql_error()); 
@
mysql_query("SET NAMES 'utf8'");

mysql_connect - соединяет с сервером при неудаче выдает номер ошибки
mysql_select_db - выбирает БД при неудаче выдает номер ошибки
@mysql_query("SET NAMES 'utf8'"); сообщает серверу в какой кодировке будет работать,
т.е. все будет выглядеть примерно так:

<?php  
$id_con 
mysql_connect("localhost","root","")or die ('Невозможно соединиться с сервером:' mysql_error()); 
mysql_select_db("sb",$id_con )or die ('Невозможно выбрать базу данных:' mysql_error()); 
@
mysql_query("SET NAMES 'cp1251'");

я правильно понял или что-то еще можно улучшить и я пойду далее ))

  Ответить  
 
 автор: Николай2357   (22.11.2008 в 05:09)   письмо автору
 
   для: Bvz   (17.11.2008 в 14:29)
 

Ой, прошу прощения, давно не заглядывал, а тут дискуссия...
Я сам не слишком силен в этих вопросах, от того и интерес.
Мне кажется, что
<? 
or die ('Невозможно соединиться с сервером:' mysql_error());  
mysq

лучше выводить в логи, а не на экран, от того у меня и "безобразие", чтоб не забыть. А вот тут
<?
("localhost","root","");
Нужно всё таки парль поставить. Иначе с такими настройками беды не избежать....

  Ответить  
 
 автор: Bvz   (22.11.2008 в 10:02)   письмо автору
 
   для: Николай2357   (22.11.2008 в 05:09)
 

ну про пароль понятно, это для локалки привер, а как в логи выводить?
и еще что такое num и что с ним потом можно делать?

  Ответить  
 
 автор: Николай2357   (23.11.2008 в 11:56)   письмо автору
 
   для: Bvz   (22.11.2008 в 10:02)
 

Что бы ошибки вывести в лог, нужно в .htaccess написать примерно так:
php_flag display_startup_errors Off
php_flag display_errors Off
php_flag log_errors On
php_value error_log log/error.log
ну и сам файл должен быть. error.log
А num это псевдоним. Можно по другому назвать. Это для того, что бы вывести значение.

  Ответить  
 
 автор: Bvz   (23.11.2008 в 13:01)   письмо автору
 
   для: Николай2357   (23.11.2008 в 11:56)
 

я имею ввиду в дальнейшем коде им можно как-то пользоваться? псевдонимом

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

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