На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Внимательно изучите правила раздела перед созданием темы
0. ПРИЛАГАЙТЕ СВОИ СКРИПТЫ.
1. Прежде чем создать топик, используйте поиск. Возможно это уже обсуждалось.
2. В топике указывайте ОС, режим работы скрипта (CLI|CGI). Очень желателен вывод лог-файлов и того места, куда у вас назначен вывод данных (STDOUT|STDERR)
3. Помните: вы знаете что вы хотите, а форумчане - нет. Поэтому следуйте простому правилу: грамотный развернутый вопрос - грамотный развернутый ответ.
Модераторы: ANDLL
  
    > помогите чуть исправить скрипт , скрипт немного косячит
      Здравствуйте, помогите подкорректировать скрипт.
      Скрипт должен при правильном вводе пароля и логина из БД выдавать "Добро пожаловать", иначе "неверные логин и/или пароль"
      При работе с БД все отлично работает, но при вводе пустых значений(логина и/или пароля) тоже срабатывает на "Добро пожаловать"
      В чем прорблема?


      ExpandedWrap disabled
        #!/usr/bin/perl
        print "Content-type:text/html\n\n";
        use DBI;
        print "<html>";
        print "<title> ";
        print "Авторизация";
        print "</title>";
        print "<head> ";
        print "<h1><i>Проверка данных</i></h1>  ";
        print "</head> ";
        print "<body>";
         
        $string=$ENV{'QUERY_STRING'};
        @line=split(/&/,$string);
        print "<br>";
         
         
         
        foreach $item (@line) {
        ($n, $val)=split(/=/,$item);
         if ($n eq "log"){
           $name=$val;
           }
         
           if ($n eq "pas"){
           $pasw=$val;
           }
        }
         
        $dbh=DBI->connect("DBI:mysql:test","","") || print "Connect ERROR";
        $sth=$dbh->prepare("SELECT `id` FROM `login` WHERE `name`='$name';") || print "ERROR PREPARE!!!";
        $sth->execute || print "ERROR EXE";
         
        @base=$sth->fetchrow();
         
        $id=@base[0];
         
        $sth=$dbh->prepare("SELECT `pas` FROM `pas` WHERE `id`='$id';") || print "ERROR PREPARE!!!";
        $sth->execute || print "ERROR EXE";
         
        @base=$sth->fetchrow();
        $pas=@base[0];
        $sth=$dbh->prepare("SELECT `pas.pas` FROM `pas` ;") || print "ERROR PREPARE!!!";
         
        if ($pas==$pasw)  {
         
        print " Здравствуйте, $name! Авторизация произведена успешно! <br>\n";
        }  else {
          print " Неверный логин или пароль! <br>\n";
        }
         
        print "</body>";
        print "</html>";
         
         
        $sth->finish;
        $dbh->disconnect;


      Форма
      ExpandedWrap disabled
        <html>
        <title>
        Авторизация
        </title>
        <head>
        <h1><i>Авторизация</i></h1>
        </head>
        <body>
        <i>Для входа в систему введите логин и пароль.</i> <br><br>
         
        <PRE>
        <form action=http://localhost/cgi-bin/mybase.cgi>
        Логин:   <input type=text name=log><br>
        Пароль: <input type=password name=pas><br><br>
        <input type=submit>
        </pre>
        </body>
        </html>

      Сама БД(данные)

      CREATE DATABASE `test` ;

      CREATE TABLE login(id int, name varchar(30));
      INSERT INTO login (id, name) values ("1", "adm");

      INSERT INTO login (id, name) values ("2", "user");

      INSERT INTO login (id, name) values ("3", "user1");

      CREATE TABLE pas(id int, pas int);
      INSERT INTO pas(id, pas) values ("1", "000");

      INSERT INTO pas(id, pas) values ("2", "111");

      INSERT INTO pas(id, pas) values ("3", "222");

      помогите пожалуйста( (прикреплено то же самое)

      Прикреплённый файлПрикреплённый файл____.rar (1,29 Кбайт, скачиваний: 234)
      Сообщение отредактировано: svetlanka_ya -
        Бредово и глупо, но суть понятна должна быть.

        ExpandedWrap disabled
          chomp $id;
          chomp $name;
          chomp $pas;
          chomp $pasw;
           
          my $o;
           
          $o = length( $name );
           
          if( $o == 0 ){
            print "Ololo! Name is not entered!\n";
          }



        Проверьте на длину свои переменные после чомпа (chomp), если длина равна нулю, то...
          Спасибо, у меня получилось!) :victory:

          Только теперь вот нужно сделать, так, чтобы при успешной авторизации, выходило сообщение "Неверный логин и/или пароль" (типа обманывалка) и снова выходила форма для авторизации, но на этот раз в случае правильного ввода, чтоб появлялось сообщение "Добро пожаловать", а иначе "Неверный логин и/или пароль"
          Пытаюсь сделать, но только запутываюсь все больше и больше Помогите.


          Кстати, вот правильный .cgi для авторизации=>

          ExpandedWrap disabled
            #!/usr/bin/perl
            print "Content-type:text/html\n\n";
            use DBI;
            $dbh=DBI->connect("DBI:mysql:test","","") or print "Error connect base";
            use CGI;
            my $q=CGI->new;
            $step1=$q->param ("step1");
            if ($step1) {
                $login=$q->param('login');
                $pas=$q->param('pas');
                $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
                $a->execute;
                $id=$a->fetchrow();
                if ($id)
                     { print "Добро пожаловать" }
                     else { print "Неверный логин или пароль
                     <form>
                     <input type=hidden name=step1 value=yes> <br>
                     Логин <input type=text name=login> <br>
                     Пароль <input type=text name=pas> <br>
                     <input type=submit>
                     </form>";};
                   }
             
            else {
            print "<form>
            <input type=hidden name=step1 value=yes> <br>
            Авторизация   <br>
             
            Логин  <input type=text name=login> <br>
            Пароль <input type=text name=pas> <br>
            <input type=submit>
            </form>";
            }
            Не уследил логики, но примерно вот так:

            ExpandedWrap disabled
              #!/usr/bin/perl
              print "Content-type:text/html\n\n";
              use DBI;
              $dbh=DBI->connect("DBI:mysql:test","","") or print "Error connect base";
              use CGI;
               
              my $flag = 0;
               
              my $q=CGI->new;
               
              $step1=$q->param ("step1");
               
              if( $flag == 0){
                  $login=$q->param('login');
                  $pas=$q->param('pas');
                  $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
                  $a->execute;
                  $id=$a->fetchrow();
                  if( $id ){ print "Добро пожаловать"; $flag = 1; }
                  else{ print "Неверный логин или пароль
                 <form>
                 <input type=hidden name=step1 value=yes> <br>
                 Логин <input type=text name=login> <br>
                 Пароль <input type=text name=pas> <br>
                 <input type=submit>
                 </form>";};
              }
              else{
              print "<form>
              <input type=hidden name=step1 value=yes> <br>
              Авторизация   <br>
              Логин  <input type=text name=login> <br>
              Пароль <input type=text name=pas> <br>
              <input type=submit>
              </form>";
              }
              Nadz Goldman, эмммм :wacko: что-то не так((
              при первом же вводе успешно авторизовывается и пишет "Добро пожаловать"

              По-моему это получился тот же скрипт,что и был, просто иначе написанный
              Сообщение отредактировано: svetlanka_ya -
                Ну так местами поменяйте флаг и всё будет.
                  Nadz Goldman
                  не поняла :wall:

                  в смысле значения нуля и единицы что ли?

                  ExpandedWrap disabled
                    #!/usr/bin/perl
                    print "Content-type:text/html\n\n";
                    use DBI;
                    $dbh=DBI->connect("DBI:mysql:test","","") or print "Error connect base";
                    use CGI;
                     
                    my $flag = 0;
                     
                    my $q=CGI->new;
                     
                    $step1=$q->param ("step1");
                     
                    if( $flag == 1){
                        $login=$q->param('login');
                        $pas=$q->param('pas');
                        $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
                        $a->execute;
                        $id=$a->fetchrow();
                        if( $id ){ print "Добро пожаловать"; $flag = 0; }
                        else{ print "Неверный логин или пароль
                       <form>
                       <input type=hidden name=step1 value=yes> <br>
                       Логин <input type=text name=login> <br>
                       Пароль <input type=text name=pas> <br>
                       <input type=submit>
                       </form>";};
                    }
                    else{
                    print "<form>
                    <input type=hidden name=step1 value=yes> <br>
                    Авторизация   <br>
                    Логин  <input type=text name=login> <br>
                    Пароль <input type=text name=pas> <br>
                    <input type=submit>
                    </form>";
                    }
                  или нет?
                  Сообщение отредактировано: svetlanka_ya -
                    В смысле логику сами уже определите где вам флаг выставлять и проверять. А то без комментариев в коде разбираться лениво.
                      Пытаюсь написать...по логике вроде построено правильно, но почему-то при втором разе ввода правильного пароля выдает не "добро подаловать", а заново "авторизация". Что я упустила??
                      ExpandedWrap disabled
                        #!/usr/bin/perl
                        print "Content-type:text/html\n\n";
                        use DBI;
                        $dbh=DBI->connect("DBI:mysql:test","","") or print "Error connect base";
                        use CGI;
                        my $q=CGI->new;
                        $step1=$q->param ("step1");
                        $step2=$q->param ("step2");
                        if ($step1) {
                            $login=$q->param('login');
                            $pas=$q->param('pas');
                            $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
                            $a->execute;
                            $id=$a->fetchrow();
                            if ($id)
                            {
                              if ($step2) {
                                   $login=$q->param('login');
                                   $pas=$q->param('pas');
                                   $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
                                   $a->execute;
                                   $id=$a->fetchrow();
                                   if ($id)
                                      { print "Добро пожаловать" }
                                   else { print "Неверный логин или пароль
                                      <form>          
                                      Логин <input type=text name=login> <br>
                                      Пароль <input type=text name=pas> <br>
                                      <input type=submit>
                                      </form>";
                                      }
                                 }
                                
                               else   {
                                    print "Неверный логин или пароль
                                    <form>
                                    <input type=hidden name=step2 value=yes>
                                    Логин  <input type=text name=login> <br>
                                    Пароль <input type=text name=pas> <br>
                                    <input type=submit>
                                    </form>";
                                     }    
                              }
                         
                           else {
                              print "Неверный логин или пароль
                              <form>
                              Логин <input type=text name=login> <br>
                              Пароль <input type=text name=pas> <br>
                              <input type=submit>
                              </form>";
                                 }
                        }
                              
                        else {
                        print "<form>
                        <input type=hidden name=step1 value=yes> <br>
                        Авторизация   <br>
                        Логин  <input type=text name=login> <br>
                        Пароль <input type=text name=pas> <br>
                        <input type=submit>
                        </form>";
                        }
                        Я имею ввиду вот что.
                        Вынести форму в подпрограмму:
                        ExpandedWrap disabled
                          #!/usr/bin/perl
                          print "Content-type:text/html\n\n";
                          use DBI;
                          use CGI;
                          my $step = 0;
                          $dbh=DBI->connect("DBI:mysql:test","","") or print "Error connect base";
                          my $q=CGI->new;
                           
                          if ($step == 0) {
                              $login=$q->param('login');
                              $pas=$q->param('pas');
                              $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
                              $a->execute;
                              $id=$a->fetchrow();
                                     if ($id)
                                        { print "Добро пожаловать"; myForm(); $step = 1; }
                             else {
                                print "Неверный логин или пароль"; myForm();
                          }
                          if( $step == 1 ){
                                    if ($id)
                                        { print "Добро пожаловать"; myForm(); $step = 1; }
                             else {
                                print "Неверный логин или пароль"; myForm();
                           
                          }
                           
                           
                           
                           
                           
                          sub myForm{
                          print "            <form>
                                      Логин  <input type=text name=login> <br>
                                      Пароль <input type=text name=pas> <br>
                                      <input type=submit>
                                      </form>";
                          }




                        Примерно так.

                        Логику исполнения думайте сами.
                          Nadz Goldman, ааа сейчас попробую... :unsure:
                          извините, мы только только perl начали изучать, так что все тяжело дается
                            получилось получилось!!!!!!!!1 :D
                              Вот и замечательно.

                              Вы бы еще конечный код показали бы, а то вдруг кому-то тоже нужно будет =)
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0917 ]   [ 18 queries used ]   [ Generated: 27.04.24, 02:05 GMT ]