PHP Возврат массива в функции

Я новичок в PHP MySqli, и это мой первый проект. Я пытаюсь вернуть значение из функции, поместив его в массив.

function riddor_dates($type,$id,$id1,$datatable,$date_from,$date_to){
    global $connection;
    $sql = "SELECT ".$id."  FROM ".$datatable." WHERE ".$id1." BETWEEN '".$date_from."' AND '".$date_to."' AND ".$id." = '".$type."'";

    if ($result = mysqli_query($connection,$sql)) {
        $count = 0;
        while ($row = mysqli_fetch_array($result)) {
            $count = ++ $count; 
        }
        echo "<br>".$type.": " .  $count;
        $counter[$type] = $count;
        return $counter;      
    }

    $type = 'RIDDOR - Major Injury';
    riddor_dates($type,$id,$id1,$datatable,$date_from,$date_to);
    var_dump($counter);

Функция работает до такой степени, что будет печатать результат, который обычно представляет собой различные числа для массива. Однако мне нужно использовать return в таблице в другом месте, но var-dump просто возвращает NULL.

Вы забыли присвоить возвращаемое значение переменной так же, как $counter = riddor_dates(...)

B001ᛦ 09.01.2019 12:45

Вы также, кажется, пропустили завершающий } в определении функции.

RiggsFolly 09.01.2019 12:48

Подсчет можно произвести одним запросом SELECT count().

u_mulder 09.01.2019 12:48

Или с помощью mysql_num_rows, если вам нужны и сами данные

dWinder 09.01.2019 12:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
93
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваш код должен быть таким, как указано ниже. Вместо подсчета в php вы можете подсчитать его в запросе.

function riddor_dates($type,$id,$id1,$datatable,$date_from,$date_to){
    global $connection; global $counter;
    $sql = "SELECT COUNT(".$id.") as cnt FROM ".$datatable." WHERE ".$id1." BETWEEN '".$date_from."' AND '".$date_to."' AND ".$id." = '".$type."'";
    $count = 0;
    if ($result = mysqli_query($connection,$sql)) {
       if ($row = mysqli_fetch_assoc($result)) {
            $count = $row['cnt']; 
        }  
    }
    $counter[$type] = $count;
}
$type = 'RIDDOR - Major Injury';
riddor_dates($type,$id,$id1,$datatable,$date_from,$date_to);
var_dump($counter);

Я думаю, вы можете предположить, что $counter уже имел значение до этого вызова (функция просто назначает тип в массиве)

dWinder 09.01.2019 12:57

В этом случае обратите внимание, что вы переопределяете $counter при каждом вызове функции

dWinder 09.01.2019 13:06
Ответ принят как подходящий

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

Вариант 1 - использовать глобальную переменную

function riddor_dates($type,$id,$id1,$datatable,$date_from,$date_to){
    global $connection;
    global $counter;
    $sql = "SELECT ".$id."  FROM ".$datatable." WHERE ".$id1." BETWEEN '".$date_from."' AND '".$date_to."' AND ".$id." = '".$type."'";

    if ($result = mysqli_query($connection,$sql)) {
        $count = mysqli_num_rows($result);
        echo "<br>".$type.": " .  $count;
        $counter[$type] = $count;     
    }
}

$type = 'RIDDOR - Major Injury';
riddor_dates($type,$id,$id1,$datatable,$date_from,$date_to);
var_dump($counter);

Вариант 2 - использовать возвращаемое значение

function riddor_dates($type,$id,$id1,$datatable,$date_from,$date_to){
    global $connection;
    $sql = "SELECT ".$id."  FROM ".$datatable." WHERE ".$id1." BETWEEN '".$date_from."' AND '".$date_to."' AND ".$id." = '".$type."'";

    if ($result = mysqli_query($connection,$sql)) {
        $count = mysqli_num_rows($result);
        echo "<br>".$type.": " .  $count;
        return $count;     
    }
}

$type = 'RIDDOR - Major Injury';
$counter[$type] = riddor_dates($type,$id,$id1,$datatable,$date_from,$date_to);
var_dump($counter);

Я настоятельно рекомендую второй вариант избегать использования глобальных ...

Спасибо за ваш ответ, и это имеет смысл в моей голове - хотя я пробовал оба варианта, но он просто останавливает отображение страницы. Мне нужно будет попробовать дома позже, чтобы попытаться найти ошибку, которая приводит к сбою. Так как могу попробовать только на сайте LIVE.

JohnM 09.01.2019 13:20

Добро пожаловать - сообщите мне, если у вас возникнут проблемы

dWinder 09.01.2019 13:21
использовать глобальную переменную Нет ... руки прочь! ;)
B001ᛦ 09.01.2019 13:33

Я должен согласиться - я предпочитаю второй вариант, но похоже, что исходный код OP ведет себя как счетчик глобальный ...

dWinder 09.01.2019 13:35
исходный код ведет себя как счетчик глобальный ... IMHO в этом случае OP имел бы значение, и они бы не задали вопрос ... :)
B001ᛦ 09.01.2019 13:44

Не уверен - если он не добавил global, то ему также было интересно, почему var_dump($counter); пуст ... потому что функция создает новое имя переменной $counter и возвращает ее без переменной, улавливающей возвращаемое значение функции

dWinder 09.01.2019 14:13

Привет, Дэвид, мне удалось установить MySQL на моем рабочем компьютере с БД. Ошибка заключалась в отсутствии символа «i» в $ count = mysq (i) _num_rows ($ result); по обоим вариантам. Теперь он отлично работает именно так, как я хотел. Это похоже на очень длинный путь к моим результатам. Я новичок в PhP / MySQL, и это первый проект с нуля. По сути, это был единственный из моих знаний способ вызвать массив из базы данных, а затем подсчитать все различные элементы в нем для последующего вывода в таблицу. Еще раз спасибо, очень признателен :-)

JohnM 09.01.2019 14:59

@DavidWinder спасибо и отметили как выполненное. Это вызвало у меня часы или головную боль :-)

JohnM 09.01.2019 15:26

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

function riddor_dates($type,$id,$id1,$datatable,$date_from,$date_to){
global $connection;
$sql = "SELECT ".$id."  FROM ".$datatable." WHERE ".$id1." BETWEEN '".$date_from."' AND '".$date_to."' AND ".$id." = '".$type."'";
$result = mysqli_query($connection,$sql)

return mysqli_num_rows($result);
}

$type = 'RIDDOR - Major Injury';
$counter = riddor_dates($type,$id,$id1,$datatable,$date_from,$date_to);
var_dump($counter);

большое спасибо за помощь. Я использовал «Вариант 2 - использовать возвращаемое значение» выше Дэвида Виндера, который отлично работает для того, что я хотел. Кажется, это действительно долгий путь, но с моими текущими знаниями он делает то, что мне нужно, пока я не узнаю больше. Еще раз спасибо за ваш вклад :-)

JohnM 09.01.2019 15:23

Другие вопросы по теме