PHP скрипт останавливается сразу после простого возврата - PullRequest
3 голосов
/ 28 января 2012

Здравствуйте, коллеги-программисты,

Я сделал функцию, которая ищет базу данных, если логин уже существует, а затем возвращает либо true, либо false, вот тело этой функции:

public static function loginExiste($login)
{
    $cnx = new GestionBD("localhost", "fnak", "root", "");

    $login = mysql_real_escape_string($login);

    $ret = $cnx->execRequete("SELECT COUNT(*) FROM clients WHERE Client_Login = '".$login."'");

    $col = mysql_fetch_array($ret);
    echo 2;
    if ($col[0] > 0)
    {
        echo 3;
        return true;
    }
    else
    {
        echo 4;
        return false;
    }
}

и вот как я вызываю эту функцию:

echo 1;
if (!ExecRequete::loginExiste($_POST['login']))
{
    echo 5;
    /*
    echo '<center><p style="color:red;">
                Erreur: Login existe déjà
            </p></center>';
    exit();
    */
}
echo 6;

Теперь, как вы можете видеть, у меня разбросано несколько эхо-операторов, чтобы увидеть, как выполняется выполнение. Результат, который я получаю каждый раз, таков:

если логин существует: 123 если его не существует: 124

Из результата я вижу, что скрипт останавливает выполнение сразу после оператора return. Обычно это должно быть так:

1236 или 12456

Хуже всего то, что это случилось со мной во время экзамена, что очень расстроило меня, потому что это не имеет никакого смысла. Отладка потеряла мне так много времени, что я не смог закончить другие легкие детали ..

Кто-нибудь может понять, почему здесь происходит такое странное поведение?

1 Ответ

2 голосов
/ 01 февраля 2012

Наконец-то! Я получил, где ошибка была ^^

после перезапуска функции с нуля (как при использовании , если ($ login == "a") возвращает true; ) Я обнаружил, что проблема была в деструкторе моего класса GestionBD, который обрабатывает соединение с mysql. Потому что весь код в функции работал, кроме как в самом конце оператора return.

Что убедило меня, что это был деструктор, так это то, что я положил $ cnx = null; перед моим echo 2; и выполнение остановилось до эха. Затем я прокомментировал деструктор, и все заработало как нужно. но мне было интересно, что не так в моем деструкторе ...

Вот как это выглядело:

function __destruct()
{
    @mysql_close($this->$connexion);
}

Теперь, если кто-то знаком с ООП в PHP, он сразу же обнаружит ошибку ... переменная connexion является переменной-членом в классе. Поэтому, когда мы ссылаемся на него с указателем $ this, нам нужно было поместить его без $ (ааа, я тебя ненавижу $, я либо забываю тебя, либо кладу, когда тебе не нужно: /)

правильный деструктор это:

function __destruct()
{
    @mysql_close($this->connexion);
}

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

Спасибо всем за ваши ответы и помощь, это очень ценится :), и совет для всех в том, что если вы получаете какое-то странное поведение или сообщения об ошибках при простом , верните true; проверьте все свои локальные объекты деструкторы .. они могут быть виновны, а также ИСПОЛЬЗОВАТЬ PDO не использовать @ с функциями mysql при отладке, поскольку это подавляет любую ошибку вывода;)

...