А теперь сам вопрос: "Век живи - век учись" или все-таки есть какая-то причина, почему не используем unique?
Спустя 7 часов, 45 минут, 34 секунды (13.09.2010 - 09:10) linker написал(а):
Вполне резонно, честно не задумывался ибо не было повода.
Спустя 33 минуты, 59 секунд (13.09.2010 - 09:44) twin написал(а):
А у тебя в форме одно поле?
Ведь при регистрации приходится проверять еще кучу условий и уникальность логина - не последняя. Так что ориентироваться на то - прошел запрос или нет, идеологически не верно. Во первых, он может не пройти и по другой причине, во вторых, перед запросом на внесение записи нужно все же убедиться в её валидности.
Ведь при регистрации приходится проверять еще кучу условий и уникальность логина - не последняя. Так что ориентироваться на то - прошел запрос или нет, идеологически не верно. Во первых, он может не пройти и по другой причине, во вторых, перед запросом на внесение записи нужно все же убедиться в её валидности.
Спустя 48 минут, 20 секунд (13.09.2010 - 10:33) linker написал(а):
Ну, если требуется проверка исключительно по совпадению логина и/или мыла, то unique вполне оправдано.
Спустя 1 минута, 45 секунд (13.09.2010 - 10:35) waldicom написал(а):
Цитата (linker @ 13.09.2010 - 09:33) |
Ну, если требуется проверка исключительно по совпадению логина и/или мыла, то unique вполне оправдано. |
Для полной уверенности надо анализировать код ошибки... А это лишние телодвижения.
Можно в принципе и пяткой за ушами почесать (своей пяткой у себя за ушами

Спустя 5 минут, 23 секунды (13.09.2010 - 10:40) linker написал(а):
А разве проверка на существование целым запросом не более ресурсоемкое и длительное телодвижение? mysql_errno() отдает код ошибки, в данном случае будет что-то похожее на значение 1062. Не вижу лишних телодвижений.
Спустя 2 минуты, 59 секунд (13.09.2010 - 10:43) waldicom написал(а):
Что быстрее я не мерил, но по Вашей логике выходит примерно так (поправьте меня, если я ошибаюсь): чтобы проверить что-либо, надо спровоцировать ошибку и посмотреть, возникнет ли она... У меня просьба - не пишите софт для ядерных реакторов...
Спустя 4 минуты, 2 секунды (13.09.2010 - 10:47) linker написал(а):
if ($Result = mysql_query("INSERT..."))Какие проблемы?
{
echo "Вы успешно добавлены";
}
else
{
echo (mysql_errno() == 1062) ? "Такой юзверь существует" : mysql_error();
}
Спустя 1 минута, 29 секунд (13.09.2010 - 10:48) waldicom написал(а):
Цитата (linker @ 13.09.2010 - 09:47) |
Какие проблемы? |
У меня никаких... А Вы решаете чужие проблемы или просто так поинтересовались?
Спустя 2 минуты, 36 секунд (13.09.2010 - 10:51) linker написал(а):
Мне просто интересно, а что же тут такого мудреного и сверх заковыристого, с кучей лишних телодвижений?
Спустя 50 минут, 11 секунд (13.09.2010 - 11:41) Семён написал(а):
Обоим плюсики в карму за невозмутимость и дерзость.
waldicom - улыбнул за пример с реактором
)))
waldicom - улыбнул за пример с реактором

Спустя 23 минуты, 59 секунд (13.09.2010 - 12:05) inpost написал(а):
Допустим в базе 10 000 записей, по способу num_rows - запрос обойдет полностью все 10 000 записей, и выберет нужную запись.
По логике, если под №2 будет запись с тем же именем, данный вариант будет обходить всю базу данных. Просто логически Unique дойдя до параметра 2 сразу должно будет выдать ошибку, а не проходить всю базу данных. Быстрее, значит лучше.
waldicom twin: если мы так раньше не делали, или не пробовали, может стоит разок попробовать (не обижайтесь, я не утверждаю!)? По крайней мере для меня - это новое, вчера перед сном узнал, что так делать можно.
linker: я в следующем своем проекте попробую твой код, который ты дал =)
twin: ну проверку на валидность проходит до обращений к базе данных, это уже совсем другое действие. Все равно скрипт оборвётся ещё до обращений, если проверку на валидность не пройдет. А ответ ошибки Линкер написал правильно.
Семён и другие эксперты: а Вы что думаете по поводу unique?
По логике, если под №2 будет запись с тем же именем, данный вариант будет обходить всю базу данных. Просто логически Unique дойдя до параметра 2 сразу должно будет выдать ошибку, а не проходить всю базу данных. Быстрее, значит лучше.
waldicom twin: если мы так раньше не делали, или не пробовали, может стоит разок попробовать (не обижайтесь, я не утверждаю!)? По крайней мере для меня - это новое, вчера перед сном узнал, что так делать можно.
linker: я в следующем своем проекте попробую твой код, который ты дал =)
twin: ну проверку на валидность проходит до обращений к базе данных, это уже совсем другое действие. Все равно скрипт оборвётся ещё до обращений, если проверку на валидность не пройдет. А ответ ошибки Линкер написал правильно.
Семён и другие эксперты: а Вы что думаете по поводу unique?
Спустя 15 минут, 10 секунд (13.09.2010 - 12:20) SlavaFr написал(а):
не надо доводить базу данных до ошибки, так как они все приземляются в лог. Так как речь идет о unique key, то дополнительный запрос на наличие идентичного содержания займет минимальное количество времени и ресурсов.
Спустя 25 минут, 57 секунд (13.09.2010 - 12:46) twin написал(а):
Цитата |
если мы так раньше не делали, или не пробовали, может стоит разок попробовать |
Не стоит. Не стоит заставлять решать программу не свойственные ей задачи.
Поиск по индексу в скрипте регистрации, который может запускается всего несколько раз в день, совсем не требует ресурсов.
А вот строить логику на ошибках не есть гут.
Для того и валидация, чтобы отправить в базу чистый и работоспособный запрос.
Я склонен сомневаться в том, что инициализация ошибки потребует меньше ресурса, чем поиск по индексному полю.
Спустя 1 минута, 21 секунда (13.09.2010 - 12:48) Семён написал(а):
Цитата (inpost @ 13.09.2010 - 13:05) |
Допустим в базе 10 000 записей, по способу num_rows - запрос обойдет полностью все 10 000 записей, и выберет нужную запись. По логике, если под №2 будет запись с тем же именем, данный вариант будет обходить всю базу данных. Просто логически Unique дойдя до параметра 2 сразу должно будет выдать ошибку, а не проходить всю базу данных. Быстрее, значит лучше. waldicom twin: если мы так раньше не делали, или не пробовали, может стоит разок попробовать (не обижайтесь, я не утверждаю!)? По крайней мере для меня - это новое, вчера перед сном узнал, что так делать можно. linker: я в следующем своем проекте попробую твой код, который ты дал =) twin: ну проверку на валидность проходит до обращений к базе данных, это уже совсем другое действие. Все равно скрипт оборвётся ещё до обращений, если проверку на валидность не пройдет. А ответ ошибки Линкер написал правильно. Семён и другие эксперты: а Вы что думаете по поводу unique? |
Наверно waldicom, лучше ответа не найти.

Спустя 51 минута, 39 секунд (13.09.2010 - 13:39) linker написал(а):
SlavaFr
А что так жалко лишней записи в лог?
twin
В чем несвойственность проявляется? любая логика валидации строится на ошибках, поэтому я невижу здесь разницы между тем что ты сам будет лишним запросом проверять на уникальность, либо это сделает за тебя MySQL. Логика при этом не страдает, это не та ошибка аля "ошибка синтаксиса SQL-запроса". Не вижу серьезных препятствий для данного метода, все высказанные "против" основаны исключительно на привычке делать так как делал всю жизнь, а не иначе.
А что так жалко лишней записи в лог?
twin
В чем несвойственность проявляется? любая логика валидации строится на ошибках, поэтому я невижу здесь разницы между тем что ты сам будет лишним запросом проверять на уникальность, либо это сделает за тебя MySQL. Логика при этом не страдает, это не та ошибка аля "ошибка синтаксиса SQL-запроса". Не вижу серьезных препятствий для данного метода, все высказанные "против" основаны исключительно на привычке делать так как делал всю жизнь, а не иначе.
Спустя 28 минут, 37 секунд (13.09.2010 - 14:08) Nikitian написал(а):
Про обход всех записей - учитесь правильно общаться с бд и она будет вам отвечать взаимностью:
Задача бд - выполнять запросы и возвращать ответы. Все mysql_errno() отличные от нуля - это ошибка работы приложения или базы, но никак не рутина. Например мой враппер для общения с бд все отличные от нуля ерроркоды складывает в лог для последующего анализа мной. Учить этот логгер разбирать где ошибка, а где ошибка-недоошибка не имеет никакого смысла.
Ещё аргумент: ваша mysql перестала справляться с поставленными задачами и вы переносите проект на другой движок баз данных. Запросы переписали, а вот перепишите ли этот анализ ошибок - очень маловероятно, особенно если переносом будет заниматься посторонний человек, который вашу уникальную логику просто не сможет и представить. Не пишите код так, чтобы пришло заниматься реверс-инжинирингом для понимания его работы.
select null from table where login ="$login" limit 1
Задача бд - выполнять запросы и возвращать ответы. Все mysql_errno() отличные от нуля - это ошибка работы приложения или базы, но никак не рутина. Например мой враппер для общения с бд все отличные от нуля ерроркоды складывает в лог для последующего анализа мной. Учить этот логгер разбирать где ошибка, а где ошибка-недоошибка не имеет никакого смысла.
Ещё аргумент: ваша mysql перестала справляться с поставленными задачами и вы переносите проект на другой движок баз данных. Запросы переписали, а вот перепишите ли этот анализ ошибок - очень маловероятно, особенно если переносом будет заниматься посторонний человек, который вашу уникальную логику просто не сможет и представить. Не пишите код так, чтобы пришло заниматься реверс-инжинирингом для понимания его работы.
Спустя 14 минут, 24 секунды (13.09.2010 - 14:22) twin написал(а):
Цитата |
В чем несвойственность проявляется? |
Ну несвойственность в том, что логика на ошибках. Всегда стараемся эти ошибки исключить (та же инициализация переменных), а тут строим на них логику.
Ошибки выдаются для того, чтобы их исправлять. А не логику на них строить.
Спустя 7 минут, 8 секунд (13.09.2010 - 14:29) linker написал(а):
twin
Сам посуди, нарушение уникальности - это ошибка? Ошибка и еще какая, как от нее избавиться? Никак ибо она нужна иначе не будет работать механизм уникальности. А теперь подумаем, может MySQL лучше знает про уникальности и с чем их едят? Да и возможность получать код ошибки тоже наверное не для просто так придумали.
То что, там у кого-то чего-то там отсылает для анализа в логи, это разве проблемы мускула или пхп? Нет.
Сам посуди, нарушение уникальности - это ошибка? Ошибка и еще какая, как от нее избавиться? Никак ибо она нужна иначе не будет работать механизм уникальности. А теперь подумаем, может MySQL лучше знает про уникальности и с чем их едят? Да и возможность получать код ошибки тоже наверное не для просто так придумали.
То что, там у кого-то чего-то там отсылает для анализа в логи, это разве проблемы мускула или пхп? Нет.
Спустя 26 минут, 15 секунд (13.09.2010 - 14:56) inpost написал(а):
По эту сторону мы, ученики программирования, по ту сторону - разработчики MySQL, которые ввели в свою программу специально unique. Это не оплошность, они сделали это специально, и в новых версиях данный код не устаревает, как бывает с ПХП, значит unique является важным элементом.
Все кроме Линкера пытаются сказать, что unique вообще не нужно, но ведь если бы это так было, давно бы уже unique стало "устаревшим", с другой стороны разработчики намеренно до сих пор не убрали его, значит видят в нём эфективность.
Тогда вопрос, для чего существует unique, и где его применить?
П.С. сегодня праздник, пойду отмечать =) А вот в ближайшие пару дней я знаю, чем займусь - докопаюсь до истины, узнаю всё про unique =)))
Я рад, что на данный момент есть человек из экспертов, который имеет взгляды отличающиеся от большинства, а это значит, что данный вопрос является спорным.
Nikitian: Спасибо за правильный пример обращения к базе.
Все кроме Линкера пытаются сказать, что unique вообще не нужно, но ведь если бы это так было, давно бы уже unique стало "устаревшим", с другой стороны разработчики намеренно до сих пор не убрали его, значит видят в нём эфективность.
Тогда вопрос, для чего существует unique, и где его применить?
П.С. сегодня праздник, пойду отмечать =) А вот в ближайшие пару дней я знаю, чем займусь - докопаюсь до истины, узнаю всё про unique =)))
Я рад, что на данный момент есть человек из экспертов, который имеет взгляды отличающиеся от большинства, а это значит, что данный вопрос является спорным.
Nikitian: Спасибо за правильный пример обращения к базе.
Спустя 11 минут, 1 секунда (13.09.2010 - 15:07) twin написал(а):
Цитата |
Все кроме Линкера пытаются сказать, что unique вообще не нужно, |
да с какого перепуга не нужно то? Просто для этого есть специальные запросы, ON DUPLICATE KEY UPDATE или IGNORE, но ни как не для того, чтобы строить логику на ошибках.
Даже хотя бы потому, что это более запутанная логика, не смотря на меньшее количество строк и действий.
Спустя 2 минуты, 12 секунд (13.09.2010 - 15:09) waldicom написал(а):
Цитата (inpost @ 13.09.2010 - 13:56) |
Все кроме Линкера пытаются сказать, что unique вообще не нужно |
Покажи пожалуйста то место, где хоть кто-либо сказал, что "...unique вообще не нужно "
Спустя 5 минут, 40 секунд (13.09.2010 - 15:15) SlavaFr написал(а):
Цитата (linker @ 13.09.2010 - 11:29) |
Да и возможность получать код ошибки тоже наверное не для просто так придумали. То что, там у кого-то чего-то там отсылает для анализа в логи, это разве проблемы мускула или пхп? Нет. |
@linker код ошибки дается не для того, чтоб ее повторять, а для того чтоб ее исправлять.
так же лог нужен для того, чтоб записывать в него ошибки, которые нужно исправлять.
Референцальный интегритет и другие блокирующие функции баз деланных, это последняя возможность избежать ошибку которую может зделать Юзер, так зачем же делать ошибки предумышленно?
Спустя 1 минута, 32 секунды (13.09.2010 - 15:16) inpost написал(а):
waldicom и Twin Ну не придерайтесь к словам, сегодня же праздник =) Я имел ввиду, что в данной ситуации не нужно. Хотелось бы узнать реальные вещи, когда unique будет актуальным.
Спустя 5 минут, 53 секунды (13.09.2010 - 15:22) Michael написал(а):
Цитата (inpost @ 13.09.2010 - 11:05) |
и другие эксперты: а Вы что думаете по поводу unique? |

Спустя 1 минута, 12 секунд (13.09.2010 - 15:23) SlavaFr написал(а):
Цитата (inpost @ 13.09.2010 - 12:16) |
waldicom и Twin Ну не придерайтесь к словам, сегодня же праздник =) Я имел ввиду, что в данной ситуации не нужно. Хотелось бы узнать реальные вещи, когда unique будет актуальным. |
unique это как раз в данной ситуации и нужно, так как это последняя возможность исправить ошибку юзера( в нашем случае пхп-программиста)
Спустя 2 минуты, 25 секунд (13.09.2010 - 15:26) Nikitian написал(а):
Цитата (inpost @ 13.09.2010 - 12:16) |
Хотелось бы узнать реальные вещи, когда unique будет актуальным. |
Спустя 14 минут (13.09.2010 - 15:40) linker написал(а):
SlavaFr
С чего ты взял, что это та ошибка которую необходимо исправлять? Ошибка синтаксиса - да, варианты без необходимости проверки уникальности - да, но это не тот случай.
Вы же не спешите исправлять ошибки, когда
Код ошибки дается, чтобы именно анализировать программно, какая ошибка возникла и совершать те или иные действия.
twin
ON DUPLICATE KEY UPDATE или IGNORE не подходят для данной задачи.
С чего ты взял, что это та ошибка которую необходимо исправлять? Ошибка синтаксиса - да, варианты без необходимости проверки уникальности - да, но это не тот случай.
Вы же не спешите исправлять ошибки, когда
SELECT NULL FROM `users` WHERE `login` = 'vasya'возвращает пустой результат? Это не ошибка запроса, это ошибка запрограммированной логики работы приложения, которая ничем не отличается от проверки empty(), isset(), is_null() и прочие.
Код ошибки дается, чтобы именно анализировать программно, какая ошибка возникла и совершать те или иные действия.
twin
ON DUPLICATE KEY UPDATE или IGNORE не подходят для данной задачи.
Цитата |
Даже хотя бы потому, что это более запутанная логика, не смотря на меньшее количество строк и действий. |
Посмотри на пример моего кода и скажи в чем запутанность?
define('ERROR__USEREXISTS', 1062);Где ты запутался?
...
if ($Result = mysql_query("INSERT..."))
{
echo "Вы успешно добавлены";
}
else
{
echo (mysql_errno() == ERROR__USEREXISTS) ? "Такой юзверь существует" : mysql_error();
}
Спустя 12 минут, 22 секунды (13.09.2010 - 15:52) twin написал(а):
Цитата |
ON DUPLICATE KEY UPDATE или IGNORE не подходят для данной задачи. |
А я не говорил про эту задачу. Я про unique.
А код запутан, потому что mysql_query() возвращает указатель на результат запроса, или FALSE если запрос не был выполнен. А не выполнен он может оказаться и по другой причине.
При поиске по условию возврат нуля строк явно указывает на отсутствие записи, этому условию удовлетворяющему.
Спустя 1 час, 44 минуты, 48 секунд (13.09.2010 - 17:37) SlavaFr написал(а):
@linker твой код прост и удобен, но если я так зделаю, то получу при следующем релизе прозьбу от людей которые обслуживают б.д исправить ошибку запроса к б.д.
А если я скажу им что это не какая не ошибка, то они будут все ровно дальше каждый раз говорить что это ошибка, так как она в логе записана. После 300 E-mail или одного разговора с начальником прийдется изменить код чтоб тебя оставили в покое те кому платят именно за то, чтоб они нас о ошибках в б.д. информировали
.
А если я скажу им что это не какая не ошибка, то они будут все ровно дальше каждый раз говорить что это ошибка, так как она в логе записана. После 300 E-mail или одного разговора с начальником прийдется изменить код чтоб тебя оставили в покое те кому платят именно за то, чтоб они нас о ошибках в б.д. информировали

Спустя 7 минут, 20 секунд (13.09.2010 - 17:44) inpost написал(а):
SlavaFr
Так а подправить логи, чтоб эта ошибка не записывалась, разве нельзя?
Так а подправить логи, чтоб эта ошибка не записывалась, разве нельзя?
Спустя 4 минуты, 7 секунд (13.09.2010 - 17:48) waldicom написал(а):
Цитата (inpost @ 13.09.2010 - 16:44) |
SlavaFr Так а подправить логи, чтоб эта ошибка не записывалась, разве нельзя? |
А потом подправить еще что-нить... а потом еще... и еще... и у Кролика ничего не осталось
Спустя 3 минуты, 40 секунд (13.09.2010 - 17:52) SlavaFr написал(а):
Цитата (inpost @ 13.09.2010 - 14:44) |
SlavaFr Так а подправить логи, чтоб эта ошибка не записывалась, разве нельзя? |
незнаю, может и можно, но тогда это будет просто запрятаная ошибка.
Спустя 17 минут, 8 секунд (13.09.2010 - 18:09) inpost написал(а):
SlavaFr
А почему же возврат удачной операции называть ошибкой? В моём понятии ошибка - неправильная работа или отсутствие работы в целом. В данной ситуации MySQL вернёт: невозможно добавить по той причине, что такой пользователь уже существует, но при этом выполняется поставленная задача.
Неудачная операция: ты отправляешь запрос серверу, а он молчит. Ты отправляешь запрос серверу, а он говорит, что ты хочешь всякий бред сделать, таких комманд даже не существует. А удачная операция: ты отправляешь запрос серверу - он даёт ответ: "добавили пользователя" или "не добавили пользователя, потому что такой существует уже".
А почему же возврат удачной операции называть ошибкой? В моём понятии ошибка - неправильная работа или отсутствие работы в целом. В данной ситуации MySQL вернёт: невозможно добавить по той причине, что такой пользователь уже существует, но при этом выполняется поставленная задача.
Неудачная операция: ты отправляешь запрос серверу, а он молчит. Ты отправляешь запрос серверу, а он говорит, что ты хочешь всякий бред сделать, таких комманд даже не существует. А удачная операция: ты отправляешь запрос серверу - он даёт ответ: "добавили пользователя" или "не добавили пользователя, потому что такой существует уже".
Спустя 19 минут, 34 секунды (13.09.2010 - 18:29) twin написал(а):
Ошибка, потому что запрос не проходит.
Читаем мануал -
Читаем мануал -
Цитата |
mysql_query() возвращает указатель на результат запроса, или FALSE если запрос не был выполнен. Значение не равное FALSE говорит о том, что запрос был выполнен успешно. Он не говорит о количестве затронутых или возвращённых рядов. Вполне возможна ситуация, когда успешный запрос не затронет ни одного ряда. |
Если функция возвращает указатель на результат - это штатное поведение. Пусть даже этот результат пуст.
Если она возвращает фальсе - это нештатная ситуация. Ошибка. Сбой программы.
Строить логику на сбоях - то же самое, что жарить картошку на пожаре.
Спустя 4 часа, 25 секунд (13.09.2010 - 22:29) linker написал(а):
twin
В данном топике, речь идет о проверке уникальности, т.е. о конкретной задаче. И чем FALSE отличается от иного вида ошибки? Ну возвращала бы mysql_query() не FALSE, а код ошибки? Какие трудности?
В данном топике, речь идет о проверке уникальности, т.е. о конкретной задаче. И чем FALSE отличается от иного вида ошибки? Ну возвращала бы mysql_query() не FALSE, а код ошибки? Какие трудности?
Цитата |
Если она возвращает фальсе - это нештатная ситуация. Ошибка. Сбой программы. |
Ошибки бывают разные, фатальные, серьезные, несерьезные. Одна ошибка, например, переполнение буфера приводит к краху, а другая - невозможность выделить требуемой свободной памяти - обрабатываемая и вполне решаема без всяких сбоев. Или проверяете на существование какой-либо файл, если есть замечательно, если нет - можно тормознуться, а можно тупо его создать и продолжить работу. Гибкость и маневренность есть неотъемлемая часть грамотного приложения.
Цитата |
Строить логику на сбоях - то же самое, что жарить картошку на пожаре. |
Читай ниже.
SlavaFr
Может стоит подумать на тему, а стоит ли абсолютно все гумно слать?
Объясню на примере, что не все ошибка от которой нужно избавиться путем перекодинга с поиском иных путей. Все знают что такое "исключение". Все знаю про своп и виртуальную память. Так вот, страничное исключение есть часть страничного механизма, без которого просто невозможно существование виртуальной памяти. Значит по вашему, надо переделать архитектуру IA32, а также все приложения, чтобы никогда не возникало подобной ошибки, а то бедные админы поддерживающие серваки, а также начальство никак не могут справится с бесконечными свопами.
Спустя 2 часа, 9 минут, 24 секунды (14.09.2010 - 00:38) Nikitian написал(а):
Заказчики вдолбили мне в мозг на уровень автоматизма слово "унификация". Другими словами, если я делаю mysql_query(), то ожидаю получить результат запроса, а не false. False - это ошибка и её обрабатываем соответствующим образом без костылей вида "Ну если это был инсерт при регистрации, то смотрим в другом месте...".
С другой стороны, почему для проверки уникальности одного параметра надо использовать костыль с разбором кода ошибки, а для проверки уникальности нескольких параметров уже делать другой запрос и анализировать его ответ? Ни один вменяемый заказчик не примет приложение, которое при попытке записи чего-либо в базу будет говорить: "У вас что-то не уникальное: либо логин, либо емейл, либо телефон, либо ещё какая-то хрень... Разбирайтесь сами что у вас не уникально." Сегодня уникальным должен быть только логин, завтра появится телефон и емейл - переписывать логику? Золотое правило программистов: если что-то работает, то не трогай! Дописать можешь, но менять.... Это сейчас кажется, что ни на что не влияет, а в будущем окажется, что ничего не работает. Именно поэтому и не рекомендуется использовать глобальные переменные, где нужен синглтон.
linker
И не надо путать мягкое с солёным. IA-32 не ради ли обратной совместимости с огромным парком имеющегося оборудования до сих пор поддерживается? Есть же CISC и RISC, которые уже со времён ещё Pentium MMX, постепенно интегрируются в IA-32.
Вернёмся опять к PHP. Можно написать так:
Всех с праздником! К сожалению, традицию поддержать не удалось - коньяк кончился ещё на выходных
Только пыво.
С другой стороны, почему для проверки уникальности одного параметра надо использовать костыль с разбором кода ошибки, а для проверки уникальности нескольких параметров уже делать другой запрос и анализировать его ответ? Ни один вменяемый заказчик не примет приложение, которое при попытке записи чего-либо в базу будет говорить: "У вас что-то не уникальное: либо логин, либо емейл, либо телефон, либо ещё какая-то хрень... Разбирайтесь сами что у вас не уникально." Сегодня уникальным должен быть только логин, завтра появится телефон и емейл - переписывать логику? Золотое правило программистов: если что-то работает, то не трогай! Дописать можешь, но менять.... Это сейчас кажется, что ни на что не влияет, а в будущем окажется, что ничего не работает. Именно поэтому и не рекомендуется использовать глобальные переменные, где нужен синглтон.
linker
И не надо путать мягкое с солёным. IA-32 не ради ли обратной совместимости с огромным парком имеющегося оборудования до сих пор поддерживается? Есть же CISC и RISC, которые уже со времён ещё Pentium MMX, постепенно интегрируются в IA-32.
Вернёмся опять к PHP. Можно написать так:
Но для того, чтобы указать что именно не так, необходимо всё-равно выполнять дополнительные проверки. Другими словами, если хватит от операции ответа "Что-то не так, работаем по альтернативному сценарию", то ваш алгоритм вполне жизнеспособен (хотя про расширяемость писал выше), если же необходимо понять что именно пошло не так, то лучше сразу делать запросы с ожиданием ответа сервера, а не ошибки.
if(!$fp=fopen('filename.txt','r')){
echo'Что-то не так';//Либо файла нет, либо директория закрыта для чтения, либо файл не доступен для чтения..
}
Всех с праздником! К сожалению, традицию поддержать не удалось - коньяк кончился ещё на выходных

Спустя 6 часов, 23 минуты, 43 секунды (14.09.2010 - 07:02) Семён написал(а):
Сейчас пока шёл на улицу, вспомнилась аналогия с Windows.
При операциях: копирование, вырезать, Windows вместо того чтобы проверить наличие доступного места на конечном диске и заблокировать его для использования, начинает сразу копировать, а в конце выдаёт ошибку.
При операциях: копирование, вырезать, Windows вместо того чтобы проверить наличие доступного места на конечном диске и заблокировать его для использования, начинает сразу копировать, а в конце выдаёт ошибку.
Спустя 1 час, 23 минуты, 32 секунды (14.09.2010 - 08:26) linker написал(а):
Цитата |
Другими словами, если я делаю mysql_query(), то ожидаю получить результат запроса, а не false. |
А что есть такие заказчики, которым небезразлично какой результат возвращает функция mysql_query()?

Цитата |
Сегодня уникальным должен быть только логин, завтра появится телефон и емейл - переписывать логику? |


Цитата |
Золотое правило программистов: если что-то работает, то не трогай! Дописать можешь, но менять.... |
Золотое правило хороших и > программистов: нет такой программы, которую нельзя не оптимизировать или отрефачить. Если приложение настолько кривое, что от любого случайного вздоха программера оно может упасть, то в топку такое приложение и такого программера, написавшего сию говнохрень.
Цитата |
И не надо путать мягкое с солёным. IA-32 не ради ли обратной совместимости с огромным парком имеющегося оборудования до сих пор поддерживается? |
Это не мягкое и не соленое, это банальный метод. Нет, поверьте. Единственно, что IA-32 поддерживает - это виртуальный режим совместимости с MS DOS. И не путайте IA-32 с MMX, CISC, RISC.
Штампы, штампы, сплошные штампы. Не осталось места простым и гениальным идеям в замученном мозгу программеров.
Спустя 34 минуты, 51 секунда (14.09.2010 - 09:01) twin написал(а):
Цитата |
а в данном случае всего лишь поставить соответствующий индекс на нужное поле в таблице Клева да? |
А как узнать, что именно неуникально? Ниче не клева.
Спустя 10 минут, 33 секунды (14.09.2010 - 09:11) linker написал(а):
Читай ТС, мы не говорим в целом про unique, в случае регистрации нового юзверя нет надобности делать проверку, а что же там не уникально. В данном топике, в данной конкретной задаче, о которой собственно и завелся этот топик достаточно просто знать, что такой пользователь уже существует.
Спустя 10 минут, 6 секунд (14.09.2010 - 09:21) twin написал(а):
Цитата |
достаточно просто знать, что такой пользователь уже существует. |
В том и беда, что для того, чтобы узнать, запрос на вставку строки - нонсенс.
Если нужно вставить строку только c уникальным значением, есть штатная процедура, основанная на том же unique. Которая делает фактически тоже самое, но цивилизованным способом. Не основываясь на ошибках.
mysql_query("INSERT IGNORE INTO....");
if(mysql_affected_rows() == 0)
echo "Фигвам";
Ведь как не крути, заставлять систему давать сбои специально - совсем не по хрестиански. И не штампы это вовсе, а элементарная гигиена.
Спустя 19 минут, 36 секунд (14.09.2010 - 09:41) linker написал(а):
Замечательно, вот мы и соптимизировали.
Спустя 23 минуты, 34 секунды (14.09.2010 - 10:04) twin написал(а):
Я бы не стал торопиться с выводами о оптимизации. Дело в том, что это несколько иная задача.
По той простой причине, что скрипт, построеный по такому принципу, достаточно специфичен и труднорасширяем. Этот принцип подходит для статистики (всяких счетчиков), но никак не для систем регистрации.
Ибо верно заметил Nikitian - потребуется немного изменить условия и придется полностью менять логику.
Для того же аякса это вообще не подходит к примеру.
По той простой причине, что скрипт, построеный по такому принципу, достаточно специфичен и труднорасширяем. Этот принцип подходит для статистики (всяких счетчиков), но никак не для систем регистрации.
Ибо верно заметил Nikitian - потребуется немного изменить условия и придется полностью менять логику.
Для того же аякса это вообще не подходит к примеру.
Спустя 17 минут, 13 секунд (14.09.2010 - 10:22) linker написал(а):
Ошибаешься, причем жестоко.
Где меняется логика? Сначала хотим уникальность логина, ставим индекс, потому передумываем, хотим по мылу, убираем индекс и ставим на другое поле, что-то в логике кода поменялось? Нет, логика как была (есть юзверь/нет юзверя) так и осталась в неизменном виде.
Что мешает ajax'ом возвращать результат 0 или 1 - ошибка или успешно зарегистрирован соответственно или какие иные значения?
Где меняется логика? Сначала хотим уникальность логина, ставим индекс, потому передумываем, хотим по мылу, убираем индекс и ставим на другое поле, что-то в логике кода поменялось? Нет, логика как была (есть юзверь/нет юзверя) так и осталась в неизменном виде.
Что мешает ajax'ом возвращать результат 0 или 1 - ошибка или успешно зарегистрирован соответственно или какие иные значения?
Спустя 9 минут, 20 секунд (14.09.2010 - 10:31) waldicom написал(а):
Цитата (linker @ 14.09.2010 - 09:22) |
Ошибаешься, причем жестоко. Где меняется логика? Сначала хотим уникальность логина, ставим индекс, потому передумываем, хотим по мылу, убираем индекс и ставим на другое поле, что-то в логике кода поменялось? Нет, логика как была (есть юзверь/нет юзверя) так и осталась в неизменном виде. |
Т.е. вариант с несколькими уникальными полями Вы не рассматриваете в принципе?
Спустя 6 минут, 20 секунд (14.09.2010 - 10:37) twin написал(а):
Цитата |
Что мешает ajax'ом возвращать результат 0 или 1 - ошибка или успешно зарегистрирован соответственно или какие иные значения? |
Обычно аяксом осуществляется только предварительная проверка. Внесение данных уже простым скриптом.
Причин несколько -
1. может быть отключен JS у клиента, тогда включаем обычную проверку.
2. если есть капча, то проверять её аяксом вообще нет смысла.
3. часто после успешной регистрации происходит редирект в личный кабинет допустим. Что тоже невозможно при отключенных скриптах.
Ну и так далее.
По этому там нужна именно проверка. И адаптировать под аякс скрипт, основанный на внесении данных, не выйдет.
А почему придется менять логику - ну ответь на вопрос waldicom
Спустя 55 минут, 15 секунд (14.09.2010 - 11:32) linker написал(а):
waldicom
В целом рассматриваю, но в данной конкретной задаче такой необходимости нет. Плюс, возможны варианты условий, когда при уникальности нескольких полей такое решение также подойдет. Любое решение зависит от поставленной задачи.
twin
В предварительной проверке, конечно такой метод не подходит, тут даже думать нечего. Логика проверки каптчи и прочие подобные проверки отфильтровывают возможные проблемы еще до какого-либо запроса. Причем здесь JS?
В целом рассматриваю, но в данной конкретной задаче такой необходимости нет. Плюс, возможны варианты условий, когда при уникальности нескольких полей такое решение также подойдет. Любое решение зависит от поставленной задачи.
twin
В предварительной проверке, конечно такой метод не подходит, тут даже думать нечего. Логика проверки каптчи и прочие подобные проверки отфильтровывают возможные проблемы еще до какого-либо запроса. Причем здесь JS?
Спустя 4 минуты, 20 секунд (14.09.2010 - 11:37) waldicom написал(а):
Цитата (linker @ 14.09.2010 - 10:32) |
waldicom В целом рассматриваю, но в данной конкретной задаче такой необходимости нет. Плюс, возможны варианты условий, когда при уникальности нескольких полей такое решение также подойдет. Любое решение зависит от поставленной задачи. |
Это в какой такой данной конкретной задаче?
Читаем первый пост, а там написано:
Цитата |
Регистрация пользователя, проверяем каким образом? Делаем обращение к БД, а потом mysql_num_rows? Дорогие эксперты, а почему бы просто не использовать unique? А потом проверять, прошел ли запрос к БД |
Т.е. при регистрации пользователя Вы предпочтете Ваш вариант? И почему не делать нормально сразу, а нужно смотреть, что за случай, чтобы сначала сделать так, а потом переделать?
Спустя 13 минут, 35 секунд (14.09.2010 - 11:50) twin написал(а):
Цитата |
Логика проверки каптчи и прочие подобные проверки отфильтровывают возможные проблемы еще до какого-либо запроса. Причем здесь JS? |
Очень даже причем.
Вот есть у меня валидатор. Там идут проверки по очереди, ошибки собираются в массив и выдаются юзеру. Вот попросил меня заказчик поставить проверку аяксом. Я незадуряясь использую тот же скрипт.
Каким образом сделать вывод ошибки о уникальности не последним?
Это к вопросу о унификации. А другой попросил проверить на уникальность еще и мыло. Это - расширяемость.
В задаче четко и ясно сказано:
Вот есть у меня валидатор. Там идут проверки по очереди, ошибки собираются в массив и выдаются юзеру. Вот попросил меня заказчик поставить проверку аяксом. Я незадуряясь использую тот же скрипт.
Каким образом сделать вывод ошибки о уникальности не последним?
Это к вопросу о унификации. А другой попросил проверить на уникальность еще и мыло. Это - расширяемость.
В задаче четко и ясно сказано:
Цитата |
Регистрация пользователя, |
Не внесение уникального значения (узкая специфичная задача), а именно регистрация. И думать нужно в первую очередь о том, как удобно будет использовать скрипт в последствии.
То есть о той же расширяемости в первую очередь.
Именно по этому ни у кого и не возникает вопросов в том, как проверять уникальность. На регистрации ресурсоемкость - дело десятое. А вот удобство - первое.
То есть о той же расширяемости в первую очередь.
Именно по этому ни у кого и не возникает вопросов в том, как проверять уникальность. На регистрации ресурсоемкость - дело десятое. А вот удобство - первое.
Спустя 1 час, 4 минуты, 38 секунд (14.09.2010 - 12:55) linker написал(а):
Да что вы со своими заказчиками приперлись, нахрена решать те задачи, которые в данном случае не стоят.
Я предпочитаю тот вариант, который наиболее подходит в том или ином случае.
Я все сказал.
Я предпочитаю тот вариант, который наиболее подходит в том или ином случае.
Я все сказал.
Спустя 6 минут, 48 секунд (14.09.2010 - 13:02) twin написал(а):
Странно слышать это от человека, яростно пропогандирующего ООП, а особенно в части "многократное использование кода"
Прямо противоположное заявление.
Прямо противоположное заявление.
Спустя 7 минут, 18 секунд (14.09.2010 - 13:09) Ice написал(а):
Цитата (linker @ 13.09.2010 - 14:39) |
SlavaFr А что так жалко лишней записи в лог? |

Спустя 10 минут, 27 секунд (14.09.2010 - 13:20) Семён написал(а):
Rivalryzerg
Цитата |
Золотые слова Фёдор Венедиктович |
На этом можно и закрыть.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).