ПХП, кто подскажет с одной функцией?

1. spletni (30.05.2012 / 22:19)
Смотрите, есть настройки пользовательские, а там никнейм, то есть site.ru/nickname , и когда меняешь что-либо в настройках, пишет, что такой никнейм уже есть, хотя пользователь никнейм не трогал, как это предотвратить ?

2. Игорь (30.05.2012 / 22:27)
1. spletni, иии? Что за скрипт? Или какой движок? Какая функция?

3. spletni (30.05.2012 / 22:39)
$.ajax({
type: "POST",
url: "save_sett.php",
data: "set=profile&id='.$_SESSION[id].'&login=" + $("#username").val() + "&first_name=" + $("#name").val() + "&last_name=" + $("#last_name").val() + "&city=" + $("#location").val() + "&about=" + $("#about").val() + "&status=" + $("#promo").val() + "&bday=" + $("#bday option:selected").val() + "&bmonth=" + $("#bmonth option:selected").val() + "&byear=" + $("#byear option:selected").val() + "&sex=" + $("#sex option:selected").val(),
success: function(html){
$("#success").html(html);
window.location.reload(true);
}
});


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

4. spletni (30.05.2012 / 22:55)
никто не поможет глупцу? :[

5. Nu3oN (30.05.2012 / 23:06)
save_sett.php в студию smile

6. spletni (30.05.2012 / 23:09)
$login = trim($_POST['login']);
$login = preg_replace("/[^a-z0-9_-]/i", "", $login);




if(strlen($login) < 3){ echo "Короткий логин!"; }

$l_check = mysql_fetch_array(mysql_query("SELECT login FROM users WHERE id = '$uid' "));
$check = mysql_num_rows(mysql_query("SELECT login FROM users WHERE login = '$login' "));
if($check !== 0 AND $login !== $l_check['login']){ echo "Логин уже зарегистрирован!!!"; exit;}

mysql_query("UPDATE users SET login = '$login', first_name = '$first_name', last_name = '$last_name', city = '$city', about = '$about', status = '$status', leng = '$leng', b_day = '$b_day', b_month = '$b_month', b_year = '$b_year', sex = '$sex' WHERE id = '$id'");
echo "Настройки сохранены!";
}

7. ramzes (30.05.2012 / 23:15)
$check = mysql_num_rows(mysql_query("SELECT login FROM users WHERE login = ".$login." AND id!=".$uid."; "));
з.ы. хотите помощи, делайте хоть что то для этого.
хотя бы минимум, заключайте код в соответствующие теги

8. Nu3oN (30.05.2012 / 23:19)
<?php
$intUser = mysql_num_rows(
                          mysql_query("
                                       SELECT `id` FROM `users` 
                                       WHERE `login` = '" . $login  . "'  
                                       AND `id` != " . $uid . " 
                                       LIMIT 1;
                                      ")
                         );
if ($intUser > 0) {
    die('Логин уже зарегистрирован!!!');
}

Вместо
<?php
$l_check = mysql_fetch_array(mysql_query("SELECT login FROM users WHERE id = '$uid' "));
$check = mysql_num_rows(mysql_query("SELECT login FROM users WHERE login = '$login' "));
if($check !== 0 AND $login !== $l_check['login']){ echo "Логин уже зарегистрирован!!!"; exit;}


9. spletni (30.05.2012 / 23:26)
7, 8, Джикинайс и ramzes, спасибо большое, за ваши попытки, но ни один из приведенных кодов, к сожалению, не работает ...

10. ramzes (30.05.2012 / 23:29)
переменная $uid откуда берется?
проверь ее

11. mix (31.05.2012 / 01:10)
$check = mysql_num_rows(mysql_query("SELECT login FROM users WHERE login = '$login' "));
Запроса, тупее этого, я ещё не встречал

12. ramzes (31.05.2012 / 01:39)
11. Vitamin aka mix, чем он тебе не нравится? num_rows'ом? не вижу ни чего страшного в нем

13. KOZZ (31.05.2012 / 08:03)
12. ramzes, ну по идее нам же нужны не сами данные, а количество совпадений, так что select count(*) поразумнее будет

14. spletni (31.05.2012 / 09:27)
так проблему кто-нибудь, решить поможет?

15. Дмитрий (31.05.2012 / 10:35)
14. spletni, а слабо прочесть все сообщения, что тебе тут написали?

16. spletni (31.05.2012 / 10:37)
15, я как бы прочитал, и оставил пост о том, что не подошёл не один из вариантов,
насчёт переменной uid сейчас выясню

Добавлено через 04:22 сек.
другой вопрос, как избавить от пробелов в имени/фамилии, когда пользователь вводите данный, он ведь может и пробел поставить, если есть те, кого не затруднит, обьясните)

17. mix (31.05.2012 / 10:57)
ramzes (31 Мая 2012 / 01:39)
11. Vitamin aka mix, чем он тебе не нравится? num_rows'ом? не вижу ни чего страшного в нем
eGo опередил уже, это неправильный вариант проверки на существование. ИМХО.
Я бы проверил так:
if(mysql_result(mysql_query("SELECT COUNT(*) FROM users WHERE login = '$login'"), 0) != 0)$error.='Такой логин уже зарегистрирован, выберите другой<br />';
Теперь сверь мой код с кодом автора, мой читабельнее, а у автора ГК.
З.Ы. Код писал с телефона, могут быт орфографические ошибки.

Добавлено через 02:21 сек.
num_rows'ом тоже можно здесь пользоваться, но запрос по-другому нужно составить.

18. KOZZ (31.05.2012 / 10:59)
17. Vitamin aka mix,
З.Ы. Код писал с телефона, могут быт орфографические ошибки.
может синтаксические?

19. mix (31.05.2012 / 11:04)
eGo Работает на Себя (31 Мая 2012 / 10:59)
17. Vitamin aka mix, может синтаксические?
Можетsmile перепутал.

20. spletni (31.05.2012 / 11:18)
18, 19, лучше бы подсказали)

21. ramzes (31.05.2012 / 13:38)
17. Vitamin aka mix, да без разницы как проверять.
и так и так бежит повсем строкам проверяя логин.
правильнее было бы where 'индекс' limit 1
Все естальное примерно одинаково действует

22. KOZZ (31.05.2012 / 13:57)
21. ramzes, в твоем варианте он пробегает по строкам и собирает полученные данные, в варианте с count(*) он только считает их количество.
конкретно в этом случае не критично, а вообще - разница емкая довольно.
ну это если рассуждать логически, тесты не проводил

23. spletni (31.05.2012 / 14:19)
так никто и не обьяснил

24. ramzes (31.05.2012 / 14:27)
22. eGo Работает на Себя, коунт точно так же для выполнения условия читает поле логин у всех записей
оба запроса не айс. но существенной разницы в них нет.
первый просто еще массив соберет ненужный, но это скорее вопрос трафика чем производительности

25. Кевин Митник (31.05.2012 / 15:36)
Артем, я же сказал что разберусь с этим. Там проверку нужно всего лишь сделать, если логин в бд с твоим id == твой логин по $_GLOBALS, то не выводить это сообщение.

Добавлено через 04:45 сек.
11. Vitamin aka mix, ну-ну. механизм работы count() знаешь ведь? тогда зачем советуешь?

26. spletni (31.05.2012 / 15:45)
25, уже разобрался, вроде)

27. mix (31.05.2012 / 18:18)
Кевин Митник_HHTeam (31 Мая 2012 / 15:36)
Артем, я же сказал что разберусь с этим. Там проверку нужно всего лишь сделать, если логин в бд с твоим id == твой логин по $_GLOBALS, то не выводить это сообщение.

Добавлено через 04:45 сек.
11. Vitamin aka mix, ну-ну. механизм работы count() знаешь ведь? тогда зачем советуешь?
потому что count() в данном случае вариант вернее mysql_num_rows()'a

28. ramzes (31.05.2012 / 19:43)
Vitamin aka mix (31 Мая 2012 / 18:18)
потому что count() в данном случае вариант вернее mysql_num_rows()'a
WTF?
Чем он вернее?))) Что за бред?

29. mix (31.05.2012 / 20:36)
тем, что он считает строки с данным логином, а не пихает в массив всю информацию о строке с логином

Добавлено через 05:09 сек.
28. ramzes, давай завяжем!?
все равно ты не сможешь меня убедить, что оба эти запроса выполняются за одно и то же время, да и я, как смотрю, не могу тебя убедить.

30. ramzes (31.05.2012 / 20:43)
29. Vitamin aka mix, какую "всю информацию"?))
Он логин в массив добавит.
Целый 1 логин, в целый 1 массив)))
потом пришлет этот целый 1 массив, точно так же как и с коунтом, только содержимое отличаться будет.
Следом посчитает этот целый 1 логин в массиве, в то время как результ вернет 0 индекс из массива.
вот и вся разница

Добавлено через 03:17 сек.
Vitamin aka mix (31 Мая 2012 / 20:36)
28. ramzes, давай завяжем!?
поддерживаю)

31. mix (31.05.2012 / 20:54)
ладно, представь себе, ты хочешь узнать живет ли во 2ой квартире человек с красной майкой. так тебе будет легче посмотреть есть ли во 2ой квартире человек с красной майкой или видя цвет майки, все же спросить, а какой у вашей майки цвет?
пример немного грубый, но к месту(SELECT login FROM ... WHERE login = '$login')

Добавлено через 04:58 сек.
ramzes (31 Мая 2012 / 20:43)
29. Vitamin aka mix,
Добавлено через 03:17 сек.
поддерживаю)
По рукам

32. Nu3oN (31.05.2012 / 21:43)
Ппц... разница между mysql_result, mysql_fetch_assoc и mysql_num_rows в том, какой тип данных они возвращают!

33. Nu3oN (31.05.2012 / 21:53)
И так по результатам тестирования:
Скрипт:
<?php
$intStartWork = microtime(true);
for ($i=0; $i<=50; $i++) {
    $strSql = "SELECT `id` FROM `users` WHERE `login` = '" . $login . "' LIMIT 1;";
    $intResult = mysql_num_rows(mysql_query($strSql));
}
echo round(microtime(true) - $intStartWork, 4) . '<br />';
//////////////////////////////////////////////////////
$intStartWork = microtime(true);
for ($i=0; $i<=50; $i++) {
    $strSql = "SELECT count(*) FROM `users` WHERE `login` = '" . $login . "';";
    $strResult = mysql_result(mysql_query($strSql), 0);
}
echo round(microtime(true) - $intStartWork, 4) . '<br />';
//////////////////////////////////////////////////////
$intStartWork = microtime(true);
for ($i=0; $i<=50; $i++) {
    $strSql = "SELECT `id` FROM `users` WHERE `login` = '" . $login . "' LIMIT 1;";
    $arrResult = mysql_fetch_assoc(mysql_query($strSql));
}
echo round(microtime(true) - $intStartWork, 4);

Показал следующее:
Вариант 1: 0.0165, 0.0141, 0.0144, 0.0275, 0.0129;
Вариант 2: 0.0117, 0.0111, 0.0097, 0.0201, 0.0114;
Вариант 3: 0.0136, 0.0149, 0.0144, 0.0155, 0.0142;

И результаты выдаваемые запросами:
При условии true
Вариант 1: int(1)
Вариант 2: string(1) "1"
Вариант 3: array(1) { ["users_id"]=> string(1) "1" }

При условии false
Вариант 1: int(0)
Вариант 2: string(1) "0"
Вариант 3: bool(false)

Добавлено через 07:40 сек.
А вообще это экономия на спичках! ради этой пары запросов, мой выбор 1й вариант! т.к результат всегда integer и не надо сравнивать строки!

34. Nu3oN (31.05.2012 / 22:08)
А если еще и убрать limit, так 3й вариант значительно выигрывает в скорости)

35. Кевин Митник (31.05.2012 / 22:28)
#33 респект и плюс)

36. ктулху (01.06.2012 / 02:50)
Сколько записей было в таблице?

37. ramzes (01.06.2012 / 03:52)
36. ShiftBHT, count так же тормозить будетsmile
Выборка не по индексу идет.

38. ктулху (01.06.2012 / 10:05)
37. ramzes, Теория конечно хорошо, но нужно же проверять на практике =)

39. YeachAgBitch (01.06.2012 / 10:08)
$db->result(); - норм вааще smile

40. Nu3oN (01.06.2012 / 11:17)
ShiftBHT (1 Июня 2012 / 02:50)
Сколько записей было в таблице?
В среднем записей так 100! Может чуть больше)

URL: https://visavi.net/topics/32297