Mysql Результат mysqli query не содержит первой строки

Хрен

Новичок
Здравствуйте.

Возникла проблема с переносом движка с mysql на mysqli. Ранее пытался найти помощи на тостере, но там помочь не смогли https://toster.ru/q/537186.

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

<?php

define('DB_HOSTNAME', '...');
define('DB_USERNAME', '...');
define('DB_PASSWORD', '...');
define('DB_DATABASE', '...');

$mysqli = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);

if ($mysqli->connect_error) {
echo 'Error: Could not make a database link (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error;
}

$mysqli->query("SET NAMES 'utf8'");
$mysqli->query("SET CHARACTER SET utf8");
$mysqli->query("SET CHARACTER_SET_CONNECTION=utf8");
$mysqli->query("SET SQL_MODE = ''");


$result = $mysqli->query("SELECT * FROM setting WHERE qwe = '0'");
print_r($result);
?>
Этот код возвращает на одну строку меньше чем есть в базе. В базе 536 строк.
mysqli_result Object ( [current_field] => 0 [field_count] => 6 [lengths] => [num_rows] => 535 [type] => 0 )
Если убрать кавычки в условии
$result = $mysqli->query("SELECT * FROM setting WHERE qwe = 0");
То возращает нормально
mysqli_result Object ( [current_field] => 0 [field_count] => 6 [lengths] => [num_rows] => 536 [type] => 0 )
С другим запросом ещё хуже.
$result = $mysqli->query("SELECT * FROM `language`");
В базе одна строка, но mysqli возвращает ноль
mysqli_result Object ( [current_field] => 0 [field_count] => 9 [lengths] => [num_rows] => 0 [type] => 0 )
Если убрать кавычки вокруг названии таблицы
$result = $mysqli->query("SELECT * FROM language");
То возвращает всё правильно
mysqli_result Object ( [current_field] => 0 [field_count] => 9 [lengths] => [num_rows] => 1 [type] => 0 )
Подскажите, пожалуйста, что за полтергейст с mysqli? Почему это расширение так странно реагирует на кавычки, и выдаёт другой результат нежели mysql. Для mysqli нужно как-то особо переписывать запросы?

При этом на сервере стоит phpMyAdmin, который работает судя по выводимой информации через mysqli, и он все варианты этих запросов, что с кавычками что без выполняет правильно.
 

fixxxer

К.О.
Партнер клуба
$mysqli->query("SET NAMES 'utf8'");
$mysqli->query("SET CHARACTER SET utf8");
$mysqli->query("SET CHARACTER_SET_CONNECTION=utf8");
$mysqli->query("SET SQL_MODE = ''");
Не делай так. Никогда.
SQL mode вообще не тереби и оставь в покое. Кодировку задавай через http://php.net/manual/en/mysqli.set-charset.php
А лучше возьми PDO.
А еще лучше какую-нибудь готовую библиотеку, которая внутрях использует PDO. Нафига изобретать велосипеды-то?
 

Хрен

Новичок
Зачем сбрасывать SQL Mode?
Скорее всего, причина именно в этом – почитай материал по ссылке.
Бегло прочитал статью. Закомментировал изменении SQL_MODE в примере, работать начало. Но это сбрасывание было в движке, поэтому я его не трогал.
Но, ведь этот режим обрабатывается в базе, и при использовании mysql_query он так же сбрасывался (mysql_query("SET SQL_MODE = ''", $this->link);)
Почему от смены расширения меняется результат? Насколько я раньше понимал, расширения mysql и mysqli в плане исполнения запросов полностью идентичны, а оказывается нет.
 

Хрен

Новичок
Не делай так. Никогда.
SQL mode вообще не тереби и оставь в покое. Кодировку задавай через http://php.net/manual/en/mysqli.set-charset.php
А лучше возьми PDO.
А еще лучше какую-нибудь готовую библиотеку, которая внутрях использует PDO. Нафига изобретать велосипеды-то?
Про set_charset спасибо что напомнили, изменю. SQL mode трогался авторами движка, поэтому я его так и оставил. Просто взял структуру mysql класса и переписал его на mysqli.
Использовать PDO не вариант по двум причинам: 1) в этом движке всё через mysql, и переписывать сотни запросов под PDO у меня нет ни времени ни желания. 2) я говнокодер, но стараюсь писать хорошо, ООП мне даётся с трудом, привык к процедурному программированию так и мучаюсь. Поэтому мне привычнее, проще и понятнее видеть обычные строковые запросы.
 

Хрен

Новичок
И я всё ещё остаюсь в не ведении. Если SQL_MODE меняет режим проверки данных и т.д., то почему результат выполнения запроса возвращает нужные данные, но только без первой строки. Или в SQL_MODE есть режим "в некоторых ситуациях пропускать первую строку"?
 

Фанат

oncle terrible
Команда форума
PDO это обычные строковые запросы, но как ты правильно заметил, говнокодеры до колик боятся хоть что-то изменить в своих с таким превеликим трудом нкаопипащеных творениях, что никто тебя заставлять не будет.

Никаких режимов в SQL_MODE нет, все строки всегда возвращаются целиком, у тебя просто глюки.
 

Хрен

Новичок
PDO это обычные строковые запросы, но как ты правильно заметил, говнокодеры до колик боятся хоть что-то изменить в своих с таким превеликим трудом нкаопипащеных творениях, что никто тебя заставлять не будет.

Никаких режимов в SQL_MODE нет, все строки всегда возвращаются целиком, у тебя просто глюки.
Это не моё творение, это один из опенсурс движков.
Можно заняться рефакторингом кода, переписать его на PDO и через пол года с гордостью бить кулаком в грудь и кричать "Я смог". К сожалению, столько времени у меня нет, да и смысла я в этом не вижу (тщеславием не болею).

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

Хрен

Новичок

Фанат

oncle terrible
Команда форума
Короче, все проблемы от невнимательности.

Сначала ты нам ездишь по ушам про запрос с параметром, а потом ВДРУГ всплывает количество записей в базе.
Ты уж определись, милок, какие записи ты считаешь.
И с какого перепугу вдруг решил, что у тебя именно 536 записей соответствуют условию WHERE qwe = '0'
 

Фанат

oncle terrible
Команда форума
Я лумаю что все твои проблемы вызваны разными, не связанными междусобой причинами.
"АААААА, похапе съедает первую строку!!!!1111адинадин" - это частое явление в говнокоде, вызвано лишним фетчем.
БД не находит данные по запросу - в БД их нет.
"таблица в кавычках ничего не возвращает" - ну тут я ничего не могу придумать, но тоже скорее всего какой-нибудь косяк в коде
 

fixxxer

К.О.
Партнер клуба
Это не моё творение, это один из опенсурс движков.
Можно заняться рефакторингом кода, переписать его на PDO и через пол года с гордостью бить кулаком в грудь и кричать "Я смог". К сожалению, столько времени у меня нет, да и смысла я в этом не вижу (тщеславием не болею).
Тогда проще всего было бы вообще ничего не трогать. Смысл менять шило на мыло? Только для того, чтобы работало в php7? Тут есть два варианта намного проще: (1) - оставить 5.6 и не трогать, (2) - зажмуриться, засунуть подключение dshafik/php7-mysql-shim в какой-нибудь там инклюдник типа db.php (100% такой там есть) и забыть.
 
Сверху