Как методами Php послать запрос Sql на поиск в базе?

Discussion in 'PHP' started by PEPSICOLA, 25 Sep 2006.

  1. PEPSICOLA

    PEPSICOLA . . . . . 2L . . . . .

    Joined:
    14 Oct 2004
    Messages:
    1,025
    Likes Received:
    823
    Reputations:
    368
    Авторизация в портале\форуме.

    Имеется база данных пользователей. В таблице users есть столбик login и password.

    С регистрацией всё ясно, пользователи в базе.

    Авторизация...


    Допустим получаем методом POST:

    $login = "admin";
    $password = "123";

    К MySQL базе подключились, к таблице users тоже.

    Как должен выглядить sql запрос на поиск в таблице login'a и правильного к нему password'a?

    $query = "SELECT * FROM users"; (Вот тут уже не знаю, в самоучителе не написано :D )

    NEED HELP!

    ______________________________________


    И появилась проблема в phpmyadmin

    utf8 vs cp1251

    В готовой таблице есть login = admin, password - 123.

    Я в phpmyadmin иду по ссылке "искать" (там где: Или Выполнить "запрос по примеру" (символ подстановки: "%")), значит пишу в строчке для столбика Login: admin, в строчке для столбика password: 123, меняю оператор "LIKE" на "="... а результат:

    MySQL вернула пустой результат (т.е. ноль рядов). (Запрос занял 0.0004 сек)


    Думаю что ошибка в кодировке... Что делать не знаю.

    SOS! Please! :confused:
     
  2. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Не знаю зачем заставлять SQL кодировать в utf8, когда проще заранние средствами php закодировать,
    а вообще, латинский алфовит и цифры в utf8 так и остаются сами собой, так что дело не в этом.
    Вообше не проверял, но вроде так правильно
    'SELECT * FROM login WHERE login="'.utf8_encode(preg_replace('/"/','`',$login)).'"' AND password="'.utf8_encode(preg_replace('/"/','`',$pass)).'"'
     
  3. VampiRUS

    VampiRUS Elder - Старейшина

    Joined:
    31 Dec 2005
    Messages:
    210
    Likes Received:
    105
    Reputations:
    57
    можешь так попробывать:
    Code:
    <?$sql="select password from users where login='$login'";
            $result=mysql_query($sql);
            $row=mysql_fetch_row($result);
            $num_rows=mysql_num_rows($result);
            if (($num_rows==1) && (!strcasecmp(md5($password),$row[0]))) {
    //логин и пароль верные, если хеширования нету то&& (!strcasecmp(md5($password),$row[0])) убери
    ?>
    
     
    1 person likes this.
  4. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    Какие все Эксперты собрались, кто-то кавычки регулярными выражениями вырезает, зачем-то заменяя их на другие символы, что конечно неприемлимо для нормального ресурса, а кто-то, даже не смотря на тематику сего форума, даже и не почесался об этом...
    Чтобы все было корректно, стоит отключить magic_quotes_gpc и при SELECTе можно пользовать mysql_real_escape_string и еще вырезать str_replaceом пару символов, когда уточняющая информация в LIKE
     
  5. VampiRUS

    VampiRUS Elder - Старейшина

    Joined:
    31 Dec 2005
    Messages:
    210
    Likes Received:
    105
    Reputations:
    57
    Небудем показывать пальцем)).Человеку нужно извлечь, значит извлекаем и ничего лишнего, о безопастности он сам должен думать, без подсказок.
     
  6. Егорыч+++

    Staff Member

    Joined:
    27 May 2002
    Messages:
    1,373
    Likes Received:
    895
    Reputations:
    20

    Причем тут кодировка вообще. У тебя весь текст вообще латинско-цифровой. Убери нафиг все кодировки из селекта.
     
  7. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    пепсик привет =))) рад что начинаешь вникать =)
    Самоучители выбрось, http://dev.mysql.com/doc тебе в помощь. насчет твоего запроса, то оптимально будет примерно так:
    PHP:
    <?
    if(isset(
    $_POST['login']) && isset($_POST['password'])){
      
    $sql=mysql_query("SELECT passwd FROM users WHERE login='".addslashes($_POST['login'])."' LIMIT 1");
      if(
    mysql_num_rows($sql)){
        if(
    mysql_result($sql0,  'passwd')==md5($_POST['passwd'])){
          echo 
    'вы авторизировались';
        }else{echo 
    'пароль неверен';}
      }else{echo 
    'логина не существует в базе';}
    }
    ?>
    Как видишь, язык sql запросов очень прост. Кодировка тут не при чем ) Забудь о ней =) В запросе я сверяю только логин потому что оптимальнее искать поле по одному составляющему, чем по двум. Проверка пароля php намного быстрее, чем mysql будет искать все поля с таким пассом, после того как найдет все логины. И еще, логины при такой схеме должны быть уникальным полем. Поставь в phpmyadmin этому полю UNIQUE индекс. И вообще индексируй все поля, по которым будешь проводить поиск в базе
     
    _________________________
    2 people like this.
  8. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    В данном случае сделать запрос безопасным является необходимой компонентой написания корректно работающего запроса
     
  9. Егорыч+++

    Staff Member

    Joined:
    27 May 2002
    Messages:
    1,373
    Likes Received:
    895
    Reputations:
    20
    Индекс можно делать и для двух полей сразу. так что ничего страшного. Можно и сразу все проверить.
     
  10. Sw%00p

    Sw%00p Banned

    Joined:
    13 Apr 2006
    Messages:
    47
    Likes Received:
    8
    Reputations:
    8
    так предупреждаю не смеяться тут не говориться что надо найти речь идёт об авторизации и сверки с базой введённого пасса и пароля
    я бы сделал бы так (пхп код писать не буду просто в псевдо коде)
    даём запрос на даннуую таблицу пользователей и результат (массив значений) даём в цикл для обработки и обычной функцией побитного сравнения строк (strcmp или strcasecmp) сравниваем каждое значение из таблицы с введёнными значениями логина и пасса
    помоему получиться
     
  11. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    Не буду с тобой спорить =)
     
    _________________________