PHP MySQL сравнение всегда верно независимо от операндов и оператора - PullRequest
1 голос
/ 16 января 2012

Для справки, я читаю документацию по логическим сравнениям в PHP, но я не понимаю, как мой код связан с этим контекстом.Я думал, что у меня была проблема с подключением к MySQL, но оказалось, что все в порядке, и я могу делать запросы без проблем.Таким образом, MySQL на самом деле не имеет отношения к этому сообщению.

Я использую это, чтобы сообщать об ошибках в объекте, который пытался подключиться при создании.Обратите внимание, что я пытался ==, ===,! = И! == только чтобы получить ту же проблему.Я даже пытался привести аргумент к bool и boolean.

Комментарии в следующих блоках кода имеют отношение.

private function assert($test){ // Tried renaming in case PHP was funny about it.
    if ($test === FALSE){ // Tried ==, ===, !== and != and casting $test.
        if ($this->use_exception){
            throw new mysql_exception();
        }else{
            die("MySQL ".mysql_errno()." - ".mysql_error());
        }
    }
}

Подключение типично.

$this->con = mysql_connect($host, $un, $pw, false, $ssl ? MYSQL_CLIENT_SSL : 0);

// I get 'yay'
echo mysql_ping($this->con) ? "yay" : "nay";

// This disagrees. Tried no cast, and a cast to bool.
$this->assert((boolean)($this->con != FALSE));

mysql_ping ()говорит, что все в порядке, но assert () останавливает нажатия, несмотря ни на что.

Я перепробовал каждую комбинацию оператора и приведения, даже переименовывая функцию из паранойи в столкновение с именем.Почему assert () видит только true?

РЕДАКТИРОВАТЬ:

Чтобы прояснить мою проблему, рассмотрим альтернативную реализацию с предложением Eugen's is_resource.Проблема в том, что я просто понятия не имею, почему происходит следующее.

private function assert($test){
    $test = $test ? true : false;
    if ($test === FALSE){
        echo "$test === false<br />";
    }
    if ($test == FALSE){
        echo "$test == false<br />";
    }
    if ($test !== FALSE){
        echo "$test !== false<br />";
    }
    if ($test == FALSE){
        echo "$test != false<br />";
    }
}

Вывод не в порядке, и значение изменилось после одного сравнения.Так как я могу делать запросы, $ test должен быть истинным.Я не должен получать вывод вообще, но я делаю для каждого оператора.Я также попробовал это с заменой FALSE на 0.

Bad PHP instance?

1 !== false
=== false
!== false
!= false

Ответы [ 2 ]

0 голосов
/ 19 января 2012

Разве вы не можете использовать свой второй пример и объединить функцию?вы уже получаете значение (yay / nay)

$this->con = mysql_connect($host, $un, $pw, false, $ssl ? MYSQL_CLIENT_SSL : 0);
$this->assert = mysql_ping($this->con) ? 1 : 0;

просто мысли вслух

0 голосов
/ 16 января 2012
$this->assert(is_resource($this->con));
...