Рекурсия в функции PHP

342
25 января 2017, 01:12

Есть такой код:

function getUser($full_name, $social_id) {
    global $mysqli;
    connectDB();
    $result = $mysqli->query("SELECT * FROM `users` WHERE `full_name` = '$full_name' AND `social_id` = '$social_id'");
    if (mysqli_num_rows($result) == 0) {
        if (setUser($full_name, $social_id)) {
            getUser($full_name, $social_id);
        }
    }
    closeDB();
    return $result->fetch_assoc();
}
function setUser($full_name, $social_id) {
    global $mysqli;
    connectDB();
    $mysqli->query("INSERT INTO `users` SET `full_name` = '$full_name', `social_id` = '$social_id'");
    $id = mysqli_insert_id($mysqli);
    closeDB();
    return $id;
}

Суть в следящем: Вызываться функция getUser, если такой user уже есть, то вернуть о нем информацию. Если нету, то задать его, и вернуть информацию визовом функции getUser. Почему-то идет зацикливание. В базе каждую секунду добавляться одинаковый user

Answer 1

Попробуйте возвращать значение getUser, завершая тем самым выполнение функции

if (setUser($full_name, $social_id)) {
            return(getUser($full_name, $social_id));
        }

У меня правда и без этого заработало, но я не знаю, как у вас реализованы connectDB и closeDB. При рекурсивном вызове closeDB не срабатывает, а после вызова срабатывает, когда соединение уже и так закрыто.

Answer 2

Попробуйте

 $id = $mysqli->insert_id;

вместо

 $id = mysqli_insert_id($mysqli);
Answer 3

Замените

if (mysqli_num_rows($result) == 0) {
    if (setUser($full_name, $social_id)) {
        getUser($full_name, $social_id);
    }
}

на

if($result->num_rows == 0){ // проверяем количество записей в результате
    if (setUser($full_name, $social_id)) {
        return getUser($full_name, $social_id); // Прерываем дальнейшее выполнение
    }
}
Answer 4

Функции правильные, проблема в максимальном значении типа int в БД. Заменил на bigint. Все работает

READ ALSO
Не правильно работает функция preg_match()

Не правильно работает функция preg_match()

Здравствуйте, задание: Написать функцию, которая выводит список файлов в заданной директории, которые содержат искомое словоДиректория...

430
Как вывести данные из базы EAV в таблицу?

Как вывести данные из базы EAV в таблицу?

Есть база EAV с таблицами: product - продукты (ключ: product_id); params - параметры продуктов (ключи: product_id, param_id); value - значения параметров продуктов (ключ:...

301
Дописывать строки в файл CSV php

Дописывать строки в файл CSV php

Этот код почему-то удаляет все данные из файла и записывает новые при каждом вызове saveRow()

472
Асоц массивы php

Асоц массивы php

Как через foreach вывести элементы массива ?

331