Почему переменная ведет себя и как 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 шт):
У вас присвоение вместо сравнения.
Замените if( $logmatch = true) на if( $logmatch == true), а если оно наверняка булево, то даже на if( $logmatch === true). Но можно и так if($logmatch)
Я немного дополню ответ Сергея. Иногда в исходном коде программы вы действительно можете встретить подобную конструкцию, которая совмещает вычисление переменной и проверку результата вычисления:
if ($res = some_heavy_calculations_function($data)) {
...
}
Её можно считать сокращённой версией такой конструкции:
$res = some_heavy_calculations_function($data);
if ($res) {
// если переменная $res не равна ложноподобному значению
// (нулю, пустой строке и т.д.)
...
}
Это в общем случае не считается хорошим стилем программирования, и ничего не экономит с точки зрения производительности, но временами встречается в исходных кодах различного ПО.
