Почему переменная ведет себя и как TRUE и как FALSE?

public function searchAnswer() {
    $today = date("m.d.Y H:i"); 
    $searchanswer = $_POST['searchanswer'];
    $login = strstr($searchanswer, '_', true);
    $search_login = trim(strstr($searchanswer, '_'), '_');
    $reverse_dia = $search_login.'_'.$login;
    $searcher_sql1 = 'SHOW TABLES LIKE "%'.$searchanswer.'%"';
    $searcher_result1 = mysqli_query($this->conn, $searcher_sql1);
    $searcher_sql2 = 'SHOW TABLES LIKE "%'.$reverse_dia.'%"';
    $searcher_result2 = mysqli_query($this->conn, $searcher_sql2);
    $searcher_result_assoc1 = mysqli_fetch_assoc($searcher_result1);
    $searcher_result_assoc2 = mysqli_fetch_assoc($searcher_result2);

    global $logmatch; // даже если объявить глобальную переменную
    $logmatch = true;
    var_dump($logmatch); // TRUE
    
    if ( $login == $search_login) {
        echo 'Selfdia';
    } 
    if(isset($searcher_result_assoc1)) {
        if($searcher_result_assoc1["Tables_in_chat (%".$searchanswer."%)"] == $searchanswer) {
            $logmatch = false;
            echo 'AOAOAOAO'; // проверяем, что участок кода сработал
            var_dump($logmatch); //FALSE , нашлось совпадение с таблицей чатов  
        } 
     } 
     if(isset($searcher_result_assoc2)) {
         if($searcher_result_assoc2["Tables_in_chat (%".$reverse_dia."%)"] == $reverse_dia) {
            $logmatch === false;
         } 
     }
     if(!isset($searcher_result_assoc1) && !isset($searcher_result_assoc2)) {
        $logmatch = true;
     }

    var_dump($logmatch); //FALSE
    if( $logmatch = true) { // НО ЭТОТ УЧАСТОК КОДА ПОЧЕМУ-ТО СРАБАТЫВАЕТ, КАК TRUE
        echo 'LOOOL12'; // этот участок кода почему-то сработал, на скриншоте видно
        $users_sql = 'SELECT login FROM users ';
        $users_result = mysqli_query($this->conn2, $users_sql);

        foreach ($users_result as $row2) {
            if ($row2['login'] == $search_login) {
                $sql_t = "CREATE TABLE ".$searchanswer." ( login VARCHAR(30) , message TEXT, date VARCHAR(100), id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY )";
                $newtable_sql = mysqli_query($this->conn, $sql_t);
                $insert_t = 'INSERT INTO '.$searchanswer.' VALUES ("Новый диалог","Начните общение прямо сейчас","'.$today.'", "1" )';
                $insert_sql = mysqli_query($this->conn, $insert_t);
            
                $reorg_sql1 = 'SELECT dialogs FROM users WHERE login ="'.$login.'"';
                $reorg_sql2 = 'SELECT dialogs FROM users WHERE login ="'.$search_login.'"';
                $reorg_sql_result1 = mysqli_query($this->conn2, $reorg_sql1);
                $reorg_sql_result2 = mysqli_query($this->conn2, $reorg_sql2);
                if ($reorg_sql_result1) {
                    foreach ($reorg_sql_result1 as $row3) {
                        if ($row3['dialogs'] == '') {
                            $insert_user_dia = 'UPDATE users SET dialogs = CONCAT(dialogs, "'.$searchanswer.'" )  WHERE login ="'.$login.'"';
                            $insert_user_dia_sql = mysqli_query($this->conn2, $insert_user_dia);
                        } else {
                            $insert_user_dia = 'UPDATE users SET dialogs = CONCAT(dialogs, "'.",".$searchanswer.'" )  WHERE login ="'.$login.'"';
                            $insert_user_dia_sql = mysqli_query($this->conn2, $insert_user_dia);
                        }
                    }
                }
                if($reorg_sql_result2) {
                    foreach ($reorg_sql_result2 as $row4) {
                        if ($row4['dialogs'] == '') {
                            $insert_user_dia = 'UPDATE users SET dialogs = CONCAT(dialogs, "'.$searchanswer.'" )  WHERE login ="'.$search_login.'"';
                            $insert_user_dia_sql = mysqli_query($this->conn2, $insert_user_dia);
                            } else {
                                $insert_user_dia = 'UPDATE users SET dialogs = CONCAT(dialogs, "'.",".$searchanswer.'" )  WHERE login ="'.$search_login.'"';
                                $insert_user_dia_sql = mysqli_query($this->conn2, $insert_user_dia);
                            }
                        }
                    }
                    echo 'Новый диалог создан';
                }
        }
    } else {
        echo 'Диалог найден';
    }
}

Проблема с переменной $logmatch, которая ведет себя непонятным образом. На скриншоте срабатывают все три var_dump(), где переменная равна и TRUE и FALSE, при этом срабатывают одновременно участки кода, где делается проверка и на FALSE и на TRUE. Пробовал уменьшать, увеличивать знаки равно, массив глобалс, разные хитрости, но результат тот же - переменная ведет себя и как TRUE и как FALSE. Может какой-то сбой в php.ini или еще что? Причем функция наполовину работает

P.S. Ошибка на скриншоте возникает из-за того, что в базе данных нет такого чата, но из-за того, что код неправильно работает он ищет совпадение.

P.P.S. Извините, что много кода, выделил комментариями основные моменты

результат срабатывания функции


Ответы (2 шт):

Автор решения: Solt

У вас присвоение вместо сравнения.

Замените if( $logmatch = true) на if( $logmatch == true), а если оно наверняка булево, то даже на if( $logmatch === true). Но можно и так if($logmatch)

→ Ссылка
Автор решения: Ivan Shatsky

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

if ($res = some_heavy_calculations_function($data)) {
    ...
}

Её можно считать сокращённой версией такой конструкции:

$res = some_heavy_calculations_function($data);
if ($res) {
    // если переменная $res не равна ложноподобному значению
    // (нулю, пустой строке и т.д.)
    ...
}

Это в общем случае не считается хорошим стилем программирования, и ничего не экономит с точки зрения производительности, но временами встречается в исходных кодах различного ПО.

→ Ссылка