【问题标题】:PEAR HTML_Quick Form Functions And Processing DataPEAR HTML_Quick 表单函数和处理数据
【发布时间】:2012-03-16 06:13:46
【问题描述】:

我有以下代码,它是由 PEAR 的 html-Quick Form 生成的用户注册表格:

 <html>
<head></head>
<body>
     <?php

     require_once "HTML/QuickForm.php";
    $form = new HTML_QuickForm('UserRegistration', 'POST');

      //Form elements***********************************************
        form->addElement('header', 'RegistrationHeader', 'Fill in your details');
    $form->addElement('text', 'firstname', 'First Name', array('size' => 49, 'maxlength'=>49));      
    $form->addElement('text', 'lastname', 'Last Name', array('size' => 49, 'maxlength'=>49));
    $form->addElement('text', 'username', 'Username',array('size'=> 49, 'maxlength'=>49));
     $form->addElement('password', 'password', 'Password', array('size' => 30, 'maxlength'=>30));
      $form->addElement('password', 'confirmpassword', 'Confirm Password', array('size'=> 30, 'maxlength'=>30));
       $form->addElement('text', 'email', 'Email', array('size'=> 49, 'maxlength'=>49));
        $form->addElement('text', 'confirmemail', 'Confirm Email', array('size'=>49, 'maxlength'=>49));
        $form->addElement('hidden', 'ip', $_SERVER['REMOTE_ADDR']);
      $buttons[] = &HTML_QuickForm::createElement('reset', 'null', 'Clear');
      $buttons[] = &HTML_QuickForm::createElement('submit', 'null', 'Submit');
      $form->addGroup($buttons, null, null, '&nbsp;');

      //***********************************************************************************************************

      //Setting of form functions*************************************************
      //Email DNS check function
      function checkEmailDNS($email, $domainCheck = false)
    {
    if (preg_match('/^[a-zA-Z0-9\._-]+\@(\[?)[a-zA-Z0-9\-\.]+'.
                   '\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/', $email)) {
        if ($domainCheck && function_exists('checkdnsrr')) {
            list (, $domain)  = explode('@', $email);
            if (checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A')) {
                return true;
            }
            return false;
        }
        return true;
    }
    return false;
    }
    $form->registerRule('checkmailDNS', 'callback', 'checkEmailDNS');
       //******************************************************************************************
       //Check for Email existance in the DataBase
       function checkEmailfromDB($value) 
    {
      try {

       $pdo = new PDO('mysql:dbname=mytestsite;host=localhost', 'root', '');

    } catch (PDOException $e) {

       die('ERROR: Cannot connect: ' . $e->getMessage());
    }
    $value = $pdo->quote($value);

    $sql = "SELECT userID FROM users WHERE userEMail= $value;";

    $ret = $pdo->query($sql) or die('ERROR: ' . implode(':', $pdo->errorInfo()));

    $str = $ret->fetchColumn();

    $flag = ($str == false) ? true : false;

    unset($pdo);

    return $flag;        
      }
       //*******************************************************************
        //****************Check for username existance in the DataBase
       function checkusernamefromDB($value) 
        {
        try {

       $pdo = new PDO('mysql:dbname=mytestsite;host=localhost', 'root', '');

    } catch (PDOException $e) {

       die('ERROR: Cannot connect: ' . $e->getMessage());
    }
    $value = $pdo->quote($value);

    $sql = "SELECT userID FROM users WHERE userName= $value;";

    $ret = $pdo->query($sql) or die('ERROR: ' . implode(':', $pdo->errorInfo()));

    $str = $ret->fetchColumn();

    $flag = ($str == false) ? true : false;

    unset($pdo);

    return $flag;        
      }
        //**************************************************
    //Form   Rules********************************************
      $form->addRule('firstname', 'Your  First name is required', 'required');
      $form->addRule('lastname', 'Your Last name is required', 'required');
       $form->addRule('username', 'Username is required', 'required');                 
       $form->addRule('úsername', 'Username is already in use, choose a different one', 'callback', 'checkusernamefromDB');    
         $form->addRule('password', 'Error: Enter a password', 'required');
      $form->addRule('password', 'Error: The password should be at least 6 characters long', 'rangelength', array(6,30));
       $form->addRule('confirmpassword', 'Error: Password confirmation is required', 'required');
       $form->addRule('confirmpassword', 'Error: The password should be at least 6 characters long', 'rangelength', array(6,30));
       $form->addRule(array('password','confirmpassword'), 'ERROR: Password mismatch', 'compare');
      $form->addRule('email', 'Emal is required', 'required');
      $form->addRule('email', 'Enter a valid Email adress', 'email');
      $form->addRule('email', 'Email is incorrect', 'checkmailDNS', true);
      $form->addRule('email','Email is already in use on the system', 'callback', 'checkEmailfromDB'); 
      $form->addRule('confirmemail','Email confirmation is required','required');
      $form->addRule('confirmemail', 'Email is incorrect', 'checkmailDNS', true);
      $form->addRule('email','Email is already in use on the system', 'callback', 'checkEmailfromDB'); 
      $form->addRule(array('email', 'confirmemail'), 'Error: Email mismatch', 'compare');
      //***********************************************************************************************************

      //Form Filters*********************************************************************************************
      $form->applyFilter('_ALL_', 'trim');
       $form->applyFilter('firstname', 'lettersonly');
       $form->applyFilter('firstname', 'strtolower');
        $form->applyFilter('firstname', 'ucfirst');  
         $form->applyFilter('lastname', 'lettersonly');
         $form->applyFilter('lastname', 'strtolower');
          $form->applyFilter('lastname', 'ucfirst');
       $form->applyFilter('email', 'strtolower');                
        $form->applyFilter('confirmemail', 'strtolower');

      //Display Form************************************************************
       if ($form->validate()) {

          $form->freeze();
      }
      $form->display();  
    ?>                                                                                                               

</body>
</html>

检查一个值是否已存在于数据库中的正确方法是什么,如果存在,则显示一条消息,您知道 - 作为验证规则,重要的是 - 处理数据并将其插入到的方法是什么数据库?我对 PHP 很陌生,对 PEAR 更是如此,我看过一些手册,但它们似乎没有显示如何处理提交的数据,可能太新手了......:D

【问题讨论】:

    标签: php mysql pear


    【解决方案1】:

    我认为您可以通过几种不同的方式做到这一点,例如:

    (1) PEAR 数据对象:

    if ($form->validate()) {
       $user = new DataObjects_User;
       $user->username = $form->exportValue('username');
       if($user->find()) {
          // username is already exists in the db
       }
    
    }
    

    (2)PDO

    if ($form->validate()) {
        $username = $form->exportValue('username');
        $email = $form->exportValue('password');
    
        if( !checkusernamefromDB($username) or !checkEmailfromDB($email) ) {
           $form->display(); 
        } else {
           $sql = "INSERT INTO users (userID,userEMail) VALUES($username, $email)";
           $pdo->query($sql);
        }
    
    }
    

    我希望上面的例子能给出一个想法,如何检查一个值是否已经存在于数据库中。有一个很好的PEAR HTML_QuickForm使用教程:http://devzone.zend.com/1165/generating-and-validating-web-forms-with-pear-html_quickform-part-2/

    【讨论】:

    • Vasil,谢谢你的回答,这两个例子是如何在我发布的代码中实现的,是那些要安装的 PEAR 包,第二个问题是如何在验证后的数据库?我是 php 的新手,因为你最清楚地注意到了。顺便问一下,你是保加利亚人吗?;)
    • 如果您没有安装 MDB2,您可以从命令行安装它。您还需要安装相应 DBMS 的驱动程序才能正常安装: $ pear install MDB2 $ pear install MDB2#mysql 之后您应该在此处查看 MDB2 文档:pear.php.net/manual/en/package.database.mdb2.php
    • 瓦西尔,OK,ставалинакраткодамиобяснишкакдаинтегрирамвъввечеспоменататаформафункция,коятодапроверява的MySQLбазатаданнизадублиращасестойност,катоинформира用户азатова,акотакавастойносте налична, друго-как да вкарам вече попълнените данни от user-а в базата данни。
    • примерите,КоитоСъмтидалпо-ГоребиТрябвалодаработят,Виждамобаче,чнеизползваш梨DataObjects,ЗатоваПреминаваменавариант2 - MDB2。 Инсталацията става много просто като изпълниш следния ред в терминал: "$pear install MDB2", след което библотеката е на твое разположнал. В линка, който съм ти дал по-горе има детайлна информация как да извличаш или добавяш данни。 Трябва също така да отбележа, че за да ползваш PEAR трябва да имаш добри познания по native php。 Още нещо, PEAR вече е заменен от много мощни MVC 框架, и по тази причина се използва все по-рядко。
    • По принцип методът fetchRow() връща integer ако открие резултат, в противен случай връща NULL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多