PDO не работает, если я перезапущу функцию внутри себя - PullRequest
2 голосов
/ 30 июня 2019

Я пытаюсь создать систему, в которой мой сайт генерирует уникальный код (текущая дата + 5 случайных символов), и этот код переносится в таблицу в моей базе данных.

Прежде чем функция generateNumber () сможет вставить уникальный код в базу данных, она должна проверить, существует ли код в базе данных.

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

function generateNumber()
{
    global $conn;

    $rand = strtoupper(substr(uniqid(sha1(time())),0,5));
    $result = date("Ydm") . $rand;

    $SQL = $conn->query("SELECT code FROM test WHERE code='$result'");
    $c = $SQL->fetch(PDO::FETCH_ASSOC);

    if ($c['code'] > 0) { // test if $result is already in the database
        generateNumber();
    } else {
        $sql2 = "INSERT INTO test (code) VALUES (?)";
        $stmt2 = $conn->prepare($sql2);
        $stmt2->execute([$result]);
        return $result;
    }
}

try {
    $conn = new PDO("sqlite:db"/*, $username, $password*/);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo generateNumber();
}

catch(PDOException $e) {
    echo "Error:" . $e->getMessage();
}

$conn = null;
?>

Вконсоль, но я подозреваю, что проблема в этой части кода:

if ($c['code'] > 0) { // test if $result is already in the database
    generateNumber();
} 

Есть идеи, как лучше написать эту функцию?

1 Ответ

2 голосов
/ 30 июня 2019

Решение:

if ($c['code'] > 0) { // test if $result is already in the database
// if the code exists in db the function return nothing 
// because you are missing a return :
    return generateNumber();

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...