LIKE не работает в SQL-запросе из php

fflesh4

Новичок
@fflesh4
Код:
mysql> SELECT '[email protected]' LIKE '%[email protected]%';
+----------------------------------------------+
| '[email protected]' LIKE '%[email protected]%' |
+----------------------------------------------+
|                                            1 |
+----------------------------------------------+
1 row in set (0.00 sec)
- Я понимаю, что должно находится, но ..



Таблица MyISAM, поле email varchar(50), utf8_general_ci.
..делаю идентичные запросы в phpmyadmin - по равенству находит, по лайку нет:

 

antson

Новичок
Партнер клуба
@fflesh4, попутно размеры полей

емайл
The maximum total length of a user name or other local-part is 64 octets.
The maximum total length of a domain name or number is 255 octets.
Вот они, исходные 320 байт

Но сверху ограничивает RFC 2821, который принимает только 254 октета.

пароль
у тебя там 32 символа предполагаю и что md5 хеширование
почитай http://php.net/manual/ru/faq.passwords.php
 

fflesh4

Новичок
по-моему, у тебя там пробел после второго «%».
PHP:
SELECT COUNT(*) as count FROM dle_users WHERE email = '[email protected]'; // найдено 1 совпадение
SELECT COUNT(*) as count FROM dle_users WHERE email LIKE '%[email protected]%'; // 0
- нет, там нет пробелов.

емайл
The maximum total length of a user name or other local-part is 64 octets.
The maximum total length of a domain name or number is 255 octets.
Вот они, исходные 320 байт

Но сверху ограничивает RFC 2821, который принимает только 254 октета.

пароль
у тебя там 32 символа предполагаю и что md5 хеширование
почитай http://php.net/manual/ru/faq.passwords.php
- движок на рабочем проекте, каждый день регистрируются десятки пользователей и только с конкретно этим е-майлом произошла такая ситуация.
На сайте полно пользователей с более длинными майлами, и с похожими и все находится..

В принципе, дело не в самом косяке, а в том, из за чего это произошло и как избежать повторения данной ситуации.


---
Всем спасибо, разобрался - произошел какой-то косяк в самой таблице - вывалилось окно с пометкой о повреждении нескольких строк.
После анализа и восстановления оптимизировал и обновил хеш - все стало нормально находится... хм..
)
 
Последнее редактирование:

antson

Новичок
Партнер клуба
дле очень старый движок. советую все таки посмотреть что там с авторизацией и таблицей пользователей не поменяли ли разработчики
 

fflesh4

Новичок
дле очень старый движок.
да это-то да.. но на что переносить-то? тем более, проект не маленький..

советую все таки посмотреть что там с авторизацией и таблицей пользователей не поменяли ли разработчики
Да вроде все работало без ошибок почти 4 года .. до сегодняшнего дня.. а доступ к коду только у меня - или что вы имели в виду под «не поменяли ли разработчики»?
 

fixxxer

К.О.
Партнер клуба
из за чего это произошло
MyISAM-таблицы имеют свойство разваливаться со временем сами по себе.
и как избежать повторения данной ситуации.
Не использовать MyISAM, или хотя бы установить ежедневную проверку-починку таблиц в cron.
 

antson

Новичок
Партнер клуба
Код:
$tableSchema[] = "CREATE TABLE " . PREFIX . "_users (
  `email` varchar(50) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  `name` varchar(40) NOT NULL default '',
  `user_id` int(11) NOT NULL auto_increment,
  `news_num` mediumint(8) NOT NULL default '0',
  `comm_num` mediumint(8) NOT NULL default '0',
  `user_group` smallint(5) NOT NULL default '4',
  `lastdate` varchar(20) NOT NULL default '',
  `reg_date` varchar(20) NOT NULL default '',
  `banned` varchar(5) NOT NULL default '',
  `allow_mail` tinyint(1) NOT NULL default '1',
  `info` text NOT NULL,
  `signature` text NOT NULL,
  `foto` varchar(255) NOT NULL default '',
  `fullname` varchar(100) NOT NULL default '',
  `land` varchar(100) NOT NULL default '',
  `favorites` text NOT NULL,
  `pm_all` smallint(5) NOT NULL default '0',
  `pm_unread` smallint(5) NOT NULL default '0',
  `time_limit` varchar(20) NOT NULL default '',
  `xfields` text NOT NULL,
  `allowed_ip` varchar(255) NOT NULL default '',
  `hash` varchar(32) NOT NULL default '',
  `logged_ip` varchar(40) NOT NULL default '',
  `restricted` TINYINT(1) NOT NULL default '0',
  `restricted_days` SMALLINT(4) NOT NULL default '0',
  `restricted_date` VARCHAR(15) NOT NULL default '',
  `timezone` VARCHAR(100) NOT NULL default '',
  `news_subscribe` tinyint(1) NOT NULL default '0',
  `comments_reply_subscribe` tinyint(1) NOT NULL default '0',
  `twofactor_auth` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`user_id`),
  UNIQUE KEY `name` (`name`),
  UNIQUE KEY `email` (`email`)
) ENGINE=" . $storage_engine . " DEFAULT CHARACTER SET " . COLLATE . " COLLATE " . COLLATE . "_general_ci";
это из инсталла дле 11.2
пароль они уже расширили. А емайлы все так и считают,что 50 символов за глаза ;)

хеши похоже остались md5 .
 

antson

Новичок
Партнер клуба
@AnrDaemon, ну не надо так утрировать.
Для "просто сменил тип у таблицы" муська уже должна быть оттюнингована с поддержкой ino.
А если оперативки на впс мало, а проекты были старые, то админ мог и оптимизировать
ресурсы под текущее потребности .
 

fixxxer

К.О.
Партнер клуба
Подозреваю, что там шаред и всё давно настроено.
 

fflesh4

Новичок
`password` varchar(255) NOT NULL default '',
Интересно, а зачем в password varchar(255) если там хранится хеш? в phpBB вообще varchar(32)..

Что, это такая большая проблема, один раз прогнать "ALTER TABLE xxx ENGINE=InnoDB" по базе?
Да нет, данное действие - совсем не проблема.
Проблема в том что с данным типом я мало знаком и если посыпятся косяки, быстро устранить не смогу. А тестить на локале времени пока нет..
Кроме того, в дле поиск завязан FULLTEXT, следовательно, если переходить, то нужно искать и делать какую-то альтернативу..
..хотя, я слышал, что в MySQL 5.6.4 доступен полнотекстовый поиск в InnoDB..
Короче, все это не так просто, как кажется со стороны. Тем более, проект рабочий и к тому же не мой..)

Ток перед этим "innodb_file_per_table = 1" не забыть настроить.
Вот видите сколько нюансов .. а я даже не знаю что такое вы написали..)

Подозреваю, что там шаред и всё давно настроено.
Да, шаред на ssd и его вполне хватает, пока во всяком случае..

А если оперативки на впс мало
Вообще, .. dle не особо жрет оперативку, как впрочем и phpbb 3.0.x (за что я его и уважаю) - под админом редко превышает 8 mb, а на дле и того меньше..

А если оперативки на впс мало, а проекты были старые, то админ мог и оптимизировать
А как узнать сколько памяти жрет мускул?
 

antson

Новичок
Партнер клуба
Интересно, а зачем в password varchar(255) если там хранится хеш? в phpBB вообще varchar(32)..
http://php.net/manual/ru/function.password-hash.php - даю прямую ссылку. Первую более общую,что я приводил, Вы похоже не сочли нужным прочесть.

на счет оперативки: берешь ящик пива и идешь к знакомому сисадмину.
пусть немного тебя просветит про то как работает сервер.
если пива хватит. возможно сможешь грокнуть фразу
"сквизинг спулинга во время свопинга не рекомендуется" :)
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок

fflesh4

Новичок
Первую более общую,что я приводил, Вы похоже не сочли нужным прочесть.
Да.. В тот момент голова была занята более насущными проблемами..
Ознакомился. Буду иметь в виду)

В вашем случае вы разницы не заметите.
Спасибо. На локале попробую обязательно)
 
Сверху