Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
25 / 25 / 4
Регистрация: 21.10.2012
Сообщений: 391
1

Возврат значений запроса

08.02.2013, 23:14. Показов 4686. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Предположим есть некий скрипт, который выводит данные из базы на страницу. Количество данных - неизвестно. Мы составляем запрос вида:
PHP
1
mysql_query("SELECT * FROM `table`");
А после надо вернуть результат запроса. Логично вернуть через mysql_fetch_assoc. Но путешествуя по просторам интернета и в частности этого форума, наткнулся на некий "обычай" выводить результат запроса таким образом:
PHP
1
while ($row=mysql_fetch_assoc($query)){///}
Так чем же отличается и чем лучше данный способ от обычного:
PHP
1
$row=mysql_fetch_assoc($query);
А также вопрос, что делать если неизвестно, сколько значений вернет запрос. Первый код, насколько я понимаю абсолютно бесполезен если в бд всего 1 значение. Проверять количество значений через mysql_num_rows? Но будет ли это корректно и правильно. А также не усложнит ли это код?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2013, 23:14
Ответы с готовыми решениями:

Возврат нескольких значений из метода не знаем сколько таких значений
Здравствуйте! Собственно вопрос: как возвращать <несколько> значений из метода если заранее...

Возврат запроса из ADOQuery
В ADOQuery имеется динамически изменяемый запрос(посредством фильтра) на выборку из MS SQL и...

Возврат части кода из стороннего файла при компиляции запроса
Всем здравствуйте знатоки oracle. Сам я не вилики знаток sql и оракла в частности но волей случая...

Возврат значений
Вот эти скрипты почему - то не работают. В чем может быть дело? <?php $a = 1; function...

5
142 / 142 / 27
Регистрация: 19.12.2011
Сообщений: 250
08.02.2013, 23:55 2
Цитата Сообщение от M1lleniuM Посмотреть сообщение
вопрос, что делать если неизвестно, сколько значений вернет запрос.
данный код вернет все записи, которые попали в запрос
PHP
1
2
3
4
5
while ($row=mysql_fetch_assoc($query)){
    // в $row на каждой итерации цикла while помещается одна строка
    // выборки по запросу, пока не закончатся выбранные строки
    // и $row не окажется равен false
}
Цитата Сообщение от M1lleniuM Посмотреть сообщение
Первый код, насколько я понимаю абсолютно бесполезен если в бд всего 1 значение
и одну запись данный код вернет тоже
PHP
1
2
3
4
5
while ($row=mysql_fetch_assoc($query)){
    // будет пройдена одна итерация цикла while
    // после которой $row станет равен false
    // и цикл закончится вернув одну строку
}
Часто для облегчения однообразных действий делают банальную функцию которая делает запрос, извлекает данные и возвращает их в массиве. Например:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function getSelect ($query) 
{
    // Делаем запрос
    $result = mysql_query ($query) or die (mysql_error());
 
    $return = array();
    while( $row = mysql_fetch_assoc( $result ) ) {
        // помещаем каждую строку в массив
        $return[] = $row;
    }
    if (!empty($return)) {
        // если массив не пустой, отдаем его
        return $return;
    } else {
        // если массив пустой, отдаем false
        return false;
    }
        
}
2
25 / 25 / 4
Регистрация: 21.10.2012
Сообщений: 391
09.02.2013, 02:10  [ТС] 3
Шикарнейшее объяснение! Спасибо!!!

Добавлено через 3 минуты
Цитата Сообщение от Andruhin Посмотреть сообщение
Часто для облегчения однообразных действий делают банальную функцию которая делает запрос, извлекает данные и возвращает их в массиве.
Только насчет вот этого вопрос. Зачем такое усложнение? Ведь на выходе получится двумерный массив, т.к. mysql_fetch_assoc вернет ассоциативный массив. И мы при этом помещаем снова в массив
0
142 / 142 / 27
Регистрация: 19.12.2011
Сообщений: 250
09.02.2013, 07:53 4
Цитата Сообщение от M1lleniuM Посмотреть сообщение
Зачем такое усложнение? Ведь на выходе получится двумерный массив
Естественно Если не ложить каждый массив со строкой в отдельный элемент результирующего массива, то данные будут перезатирать друг друга каждую итерацию цикла, и на выходе из while в массиве останется последняя вошедшая в него строка. Можно конечно делать все необходимые действия над данными прям в while, но тогда практичность использования функции приведенной выше сводится к 1 конкретному случаю, на который будет написана обработка в ней.
0
25 / 25 / 4
Регистрация: 21.10.2012
Сообщений: 391
10.02.2013, 00:23  [ТС] 5
Цитата Сообщение от Andruhin Посмотреть сообщение
данные будут перезатирать друг друга каждую итерацию цикла
Хм Странно. Почему перезатирать, если создается автомассив. Т.е. каждую итерацию цикла while в автомассив будет добавлятся элемент с новым ключом, и, по идее, не должно затираться
0
142 / 142 / 27
Регистрация: 19.12.2011
Сообщений: 250
10.02.2013, 21:28 6
Цитата Сообщение от M1lleniuM Посмотреть сообщение
Хм Странно. Почему перезатирать, если создается автомассив.
На живом примере будет нагляднее.
Допустим у нас есть табличка:
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM item_desc;
+----+------------------------------------------+
| id | item_description                         |
+----+------------------------------------------+
|  2 | Хорошо показывает                        |
|  5 | Читает много форматов                    |
|  9 | не известный товар                       |
+----+------------------------------------------+
3 ROWS IN SET (0.00 sec)


Я накидал тестовый скрипт:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php 
$dbh = mysqli_connect("localhost","root","") or die(mysqli_error($dbh));
mysqli_select_db($dbh, "test") or die(mysqli_error($dbh));
mysqli_query($dbh, "SET NAMES 'utf8'");
 
$query = "SELECT * FROM `item_desc`";
$rezult = mysqli_query($dbh, $query);
 
$step = 0;
 
echo date ("Y-m-d H:i:s ") . "Начало первого теста, без результирующего массива \$return \n";
 
while ($row = mysqli_fetch_assoc($rezult)) {
    $step += 1;
    
    echo date ("Y-m-d H:i:s ") . "Шаг " . $step . "\n";
    echo date ("Y-m-d H:i:s ") . "\$row = ";
    var_dump($row);
    echo "\n";
}
echo "\n\n";
echo date ("Y-m-d H:i:s ") . "Извлечение закончено. Проверяем что в массиве \$row\n";
echo date ("Y-m-d H:i:s ") . "\$row = ";
var_dump($row);
 
$step = 0;
$rezult = mysqli_query($dbh, $query);
echo "\n\n";
echo date ("Y-m-d H:i:s ") . "Начало второго теста, с результирующим массивом \$return \n";
 
$return = array();
 
while ($row = mysqli_fetch_assoc($rezult)) {
    $step += 1;
 
    echo date ("Y-m-d H:i:s ") . "Шаг " . $step . "\n";;
    $return[] = $row;
}
echo "\n\n";
echo date ("Y-m-d H:i:s ") . "Извлечение закончено. Проверяем что в массиве \$row\n";
echo date ("Y-m-d H:i:s ") . "\$row = ";
var_dump($row);
 
echo date ("Y-m-d H:i:s ") . "Извлечение закончено. Проверяем что в массиве \$return\n";
echo date ("Y-m-d H:i:s ") . "\$return = ";
var_dump($return);


Вот его вывод:
Кликните здесь для просмотра всего текста
Код
2013-02-10 23:20:18 Начало первого теста, без результирующего массива $return 
2013-02-10 23:20:18 Шаг 1
2013-02-10 23:20:18 $row = array(2) {
  ["id"]=>
  string(1) "2"
  ["item_description"]=>
  string(33) "Хорошо показывает"
}

2013-02-10 23:20:18 Шаг 2
2013-02-10 23:20:18 $row = array(2) {
  ["id"]=>
  string(1) "5"
  ["item_description"]=>
  string(40) "Читает много форматов"
}

2013-02-10 23:20:18 Шаг 3
2013-02-10 23:20:18 $row = array(2) {
  ["id"]=>
  string(1) "9"
  ["item_description"]=>
  string(34) "не известный товар"
}



2013-02-10 23:20:18 Извлечение закончено. Проверяем что в массиве $row
2013-02-10 23:20:18 $row = NULL


2013-02-10 23:20:18 Начало второго теста, с результирующим массивом $return 
2013-02-10 23:20:18 Шаг 1
2013-02-10 23:20:18 Шаг 2
2013-02-10 23:20:18 Шаг 3


2013-02-10 23:20:18 Извлечение закончено. Проверяем что в массиве $row
2013-02-10 23:20:18 $row = NULL
2013-02-10 23:20:18 Извлечение закончено. Проверяем что в массиве $return
2013-02-10 23:20:18 $return = array(3) {
  [0]=>
  array(2) {
    ["id"]=>
    string(1) "2"
    ["item_description"]=>
    string(33) "Хорошо показывает"
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(1) "5"
    ["item_description"]=>
    string(40) "Читает много форматов"
  }
  [2]=>
  array(2) {
    ["id"]=>
    string(1) "9"
    ["item_description"]=>
    string(34) "не известный товар"
  }
}


Я думаю результаты говорят сами за себя.
0
10.02.2013, 21:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2013, 21:28
Помогаю со студенческими работами здесь

Функция и возврат значений
Тут задание дали: Вычислить Z=(S1+S2)/(K1*K2), где S1 и K1 - сумма и количество положительных...

Возврат значений float
Как вернуть значения переменных которые были инициализированы в другой функции и которые можно...

Возврат значений из формы
Есть форма, у нее есть поле - другая форма. Как вернуть значение из numericUpDown второй формы в...

Возврат нескольких значений в функции
Всем привет. До этого никогда не задавался этим вопросом но сейчас нужно стало. Не пойму никак как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru