代码之家  ›  专栏  ›  技术社区  ›  SidC

如何使用pdo和php表单变量执行插入存储过程?

  •  0
  • SidC  · 技术社区  · 14 年前

    大家晚上好,

    我对PDO准备的声明非常陌生,需要一些指导/温和的推动。我创建了以下mysql存储过程:

    -- --------------------------------------------------------------------------------
    -- Routine DDL
    -- --------------------------------------------------------------------------------
    DELIMITER $$
    
    CREATE DEFINER=`root`@`%` PROCEDURE `RegInsert`(
    IN p_regid int,
    IN p_username VARCHAR(45),
    IN p_password VARCHAR(45),
    IN p_confpassword VARCHAR(45),
    IN p_status INT(1),
    IN p_salutation VARCHAR(45),
    IN p_firstname VARCHAR(45),
    IN p_lastname VARCHAR(45),
    IN p_jobtitle VARCHAR(45),
    IN p_telephone VARCHAR(45),
    IN p_companyname VARCHAR(45),
    IN p_industry VARCHAR(45),
    IN p_address VARCHAR(45),
    IN p_city VARCHAR(45),
    IN p_state VARCHAR(45),
    IN p_country VARCHAR(45),
    IN p_postalcode VARCHAR(45),
    IN p_regtype VARCHAR(45),
    IN p_interest VARCHAR(45),
    IN p_hdsprovider VARCHAR(45)
    )
    BEGIN
    Insert into regdata(
    RegID,
    UserName,
    Password,
    Confpassword,
    Status,
    Salutation,
    FirstName,
    LastName,
    JobTitle,
    Telephone,
    Companyname,
    Industry,
    Address,
    City,
    Country,
    State,
    PostalCode,
    RegType,
    Interests,
    HDSprovider
    )
    values(
    p_regid,
    p_username,
    p_password,
    p_confpassword,
    p_status,
    p_salutation,
    p_firstname,
    p_lastname,
    p_jobtitle,
    p_telephone,
    p_companyname,
    p_industry,
    p_address,
    p_city,
    p_country,
    p_state,
    p_postalcode,
    p_regtype,
    p_interest,
    p_hdsprovider
    );
    END
    

    在阅读有关PDO的文档时,我了解到以下语句用于打开连接,Try-Catch块设置参数。这就是我困惑的地方。到目前为止,这是我的代码块:

    <?php
    require once ("/home/somedir/pdo_connect.php")
    try{
    $dbh=pdo_connect.php();
    $stmt = $dbh->prepare("CALL RegInsert(?)");
    $stmt->bindParam
    }
    catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
    }
    ?>
    

    问题:
    1。将过程输入参数与PHP表单变量关联的正确语法是什么?是不是有点像:

    $_Post['salutation'] = p_salutation
    
    1. reginsert.php包含上述pdo语句。如何从表单上的提交按钮调用它?

    2. 您是否建议为确认电子邮件创建单独的文件和容器功能?如果是这样,如何在reginsert.php运行后不出错地触发该文件运行?

    非常感谢你帮助这个睡眠不足的新生儿。非常感谢!!

    编辑:

    这是reginsert.php的修订代码。当我提供有效的表单数据并按Submit时,记录不会插入到数据库中。你能指引我正确的方向吗?

    <?php
    require once ("/home/mydir/pdo_connect.php")
    try{
    $dbh=pdo_connect.php();
    $stmt = $dbh->prepare('CALL RegInsert(?)');
    $stmt->bindParam(':p_username',$email_address,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_password',$create_password,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_confpassword',$confirm_password,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_salutation',$salutation2,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_firstname',$first_name,PDO::PARAM_STR,45);  
    $stmt->bindParam(':p_lastname',$last_name,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_jobtitle',$job_title,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_telephone',$telephone,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_companyname',$company_name,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_industry',$industry,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_address',$address,PDO::PARAM_STR,45);  
    $stmt->bindParam(':p_city',$city,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_state',$state,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_country',$country,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_postalcode',$postal_code,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_regtype',$partner_customer_other,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_interest',$interests,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_hdsprovider',$provider_partner,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_passwordremindquestion',$password_reminder_question,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_passwordremindanswer',$password_reminder_answer,PDO::PARAM_STR,45);
    $stmt->execute();
    }
    catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
    }
    ?>
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Bretticus    14 年前

    我来这里是为了寻求建议(在谷歌上找到),在我测试我的之前,但是,我可以看到你不仅使用了一个位置保持器。标记)用于查询(例程调用),但您也尝试将命名参数发送给它。

    您的代码可能看起来更像这样

    $stmt = $dbh->prepare('CALL RegInsert(:p_username, :p_password, :p_confpassword[, ...])');
    $stmt->bindParam(':p_username',$email_address,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_password',$create_password,PDO::PARAM_STR,45);
    $stmt->bindParam(':p_confpassword',$confirm_password,PDO::PARAM_STR,45);
    // ... 
    

    我的程序只有一个参数,但是它使用了命名的变体(对我来说可能有点过分杀伤力)。