Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Какой запрос будет оптимальнее
Astin  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 28 дней
Карма: 7




Приветствую Форумчане!

Решил поискать замену mysql_result для MSQLi

К примеру, раньше писал вот так
$res = mysql_query("SELECT COUNT(*) 
FROM `users`
WHERE `login` = '"
. mysql_real_escape_string($login) ."'"
);

if(mysql_result($res, 0) > 0)

echo 'Пользователь с таким логином уже существует';


Но перехожу на MSQLi и сталкнулся с заменой, ну и вот что вышло

Первый вариант

$res = $mysqli->query("SELECT `id`
FROM `users`
WHERE `login` = '"
.$mysqli->real_escape_string($login)."'");
if (mysqli_num_rows($res) > 0)
$error[] = 'Пользователь с таким логином уже существует';


Второй вариант

$res = $mysqli->query("SELECT COUNT(id)
FROM `users`
WHERE `login` = '"
.$mysqli->real_escape_string($login)."'");

$row = $res->fetch_row();

if ($row[0] > 0)
$error[] = 'Пользователь с таким логином уже существует';


Третий вариант

$res = $mysqli->query("SELECT COUNT(id)
FROM `users`
WHERE `login` = '"
.$mysqli->real_escape_string($login)."'");

if (mysqli_num_rows($res) > 0)
$error[] = 'Пользователь с таким логином уже существует';


Из всех трех запросов быстрее всего выполняется Третий. Хотя может я и экономлю
на спичках, но вот если БД наполнится хорошо, то здесь уже придется думать
об оптимизации.

Так вот, кто что скажет, у кого какой опыт по MSQLi в том моменте?

Может какой то запрос хорошо подходит для одного, а какой то лучше для другого

_
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Ron  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1049
Пользователь №: 41686
На форуме: 1 год, 4 месяца, 2 дня
Карма: 14




У тебя в третьем варианте неверная логика. count в данном случае всегда отдаст одну строку, хоть 0 записей хоть 1000. То есть по третему варианту логин будет всегда занят.

Второй вариант наиболее адекватный.

Совет: используй обертку либо готовую, либо сам напиши. Зачем этим хламом забивать код?

Цитата (Astin @ 25.06.2016 - 13:58)
Из всех трех запросов быстрее всего выполняется Третий. Хотя может я и экономлю

Эти запросы совершенно одинаковые: второй и третий. Когда речь идет о времени выполнения запроса, то смотрят на цифры, которые отдает MySQL, например, копируется в консольный клиент. Там будет написано, скажем 0,01с.

Какие задержки привносит PHP вобщем-то наплевать, потому что эта цифра в большинстве случаев незначительна и постоянна. В подавляющем большинстве проектов, bottle neck появляется именно из-за СуБД. Ситуация усугубляется еще и тем, что PHP - блокирующий язык.

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



--------------------
Жду 5.11.2017
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чеширский кот
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 5911
Пользователь №: 1
На форуме: 10 лет, 10 месяцев, 3 дня
Карма: 125

Не пью :
22 года, 3 месяца, 4 дня


Цитата (Astin @ 25.06.2016 - 12:58)
SELECT COUNT(id)

Зачем?
$res = $mysqli->query("SELECT id FROM users WHERE login = '".$mysqli->real_escape_string($login)."' LIMIT 1");
if(mysqli_num_rows($res))$error[] = 'Пользователь с таким логином уже существует';

Так не быстрее будет?


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 28 дней
Карма: 7




Цитата
У тебя в третьем варианте неверная логика. count в данном случае всегда отдаст одну строку, хоть 0 записей хоть 1000. То есть по третему варианту логин будет всегда занят.

А вот тут ты не прав, я проверял, и если использовать COUNT(id) в третьем варианте
то отдаст верное значение или есть или нет, но если поставить COUNT(*) , то
всегда будет говорить что логин занят.

Все таки я наверно соглашусь с FatCat, так и понятнее и читабельнее код
получается.
А то я что то наэксперементировался с COUNT(id), так наверно неправильно, да и
получается непонятно что
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8740
Пользователь №: 26630
На форуме: 5 лет, 9 месяцев, 9 дней
Карма: 591




Цитата (Astin @ 25.06.2016 - 22:38)
А вот тут ты не прав, я проверял, и если использовать COUNT(id) в третьем варианте
то отдаст верное значение или есть или нет, но если поставить COUNT(*) , то
всегда будет говорить что логин занят.

бред, COUNT() подсчитает количество затронутых рядов. mysqli_num_rows() всегда будет возвращать 1 (в твоем запросе).

Это сообщение отредактировал killer8080 - 25.06.2016 - 23:42
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 28 дней
Карма: 7




Если написать вот так
$res = $mysqli->query("SELECT `id`  
FROM `users`
WHERE `login` = '"
.$mysqli->real_escape_string($login)."'");
if (mysqli_num_rows($res) > 0)
$error[] = 'Пользователь с таким логином уже существует';


То действительно проверит и если нет такого логина то не выдаст ошибку

А если написать вот так
$res = $mysqli->query("SELECT COUNT(*)  
FROM `users`
WHERE `login` = '"
.$mysqli->real_escape_string($login)."'");
if (mysqli_num_rows($res) > 0)
$error[] = 'Пользователь с таким логином уже существует';


То всегда будет возвращать 1

И да, кстати по третьему варианту, правильно,

Тогда я глубоко извиняюсь за свою неправоту.

Чет как то я видимо не так тестил, а сейчас еще раз проверил и да, по третьему
варианту возвращает всегда 1

Так что еще раз извиняюсь
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чеширский кот
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 5911
Пользователь №: 1
На форуме: 10 лет, 10 месяцев, 3 дня
Карма: 125

Не пью :
22 года, 3 месяца, 4 дня


Цитата (Astin @ 25.06.2016 - 23:41)
А если написать вот так
$res = $mysqli->query("SELECT COUNT(*)
FROM `users`
WHERE `login` = '".$mysqli->real_escape_string($login)."'");
if (mysqli_num_rows($res) > 0)
$error[] = 'Пользователь с таким логином уже существует';

Тут надо иначе, как-то так:
$res = $mysqli->query("
SELECT COUNT(*) AS cnt
FROM `users`
WHERE `login` = '"
.$mysqli->real_escape_string($login)."'
"
);
$record_row = mysqli_fetch_array($res, MYSQL_ASSOC);
if($record_row['cnt'] > 0)
$error[] = 'Пользователь с таким логином уже существует';


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 28 дней
Карма: 7




Цитата
Тут надо иначе, как-то так:

Да, точно так тоже нормально работает. Спасибо FatCat
Теперь буду знать

А кто нибудь может подсказать вот по этому вопросу http://phpforum.su/index.php?redirect_scre...=0#entry3114796
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса