ПХП, кто подскажет с одной функцией?
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 в студию
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, может синтаксические?
Может
перепутал.
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 так же тормозить будет
Выборка не по индексу идет.
38.
ктулху (01.06.2012 / 10:05)
37.
ramzes, Теория конечно хорошо, но нужно же проверять на практике =)
39.
YeachAgBitch (01.06.2012 / 10:08)
$db->result(); - норм вааще
40.
Nu3oN (01.06.2012 / 11:17)
ShiftBHT (1 Июня 2012 / 02:50)
Сколько записей было в таблице?
В среднем записей так 100! Может чуть больше)
URL:
https://visavi.net/topics/32297