Как выполнить хранимую процедуру вставки с использованием переменных формы PDO и PHP? - PullRequest
0 голосов
/ 23 августа 2010

Good Evening All,

Я очень новичок в заявлениях, подготовленных 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

Reginsert.php содержит вышеуказанные операторы PDO.Как мне вызвать его с помощью кнопки отправки в форме?

Предлагаете ли вы создать отдельный файл и функцию контейнера для письма-подтверждения?Если да, то как мне запустить этот файл после того, как reginsert.php запустится без ошибок?

Большое спасибо за помощь этому новичку, лишенному сна.Это очень ценится !!

РЕДАКТИРОВАТЬ:

Вот пересмотренный код для reginsert.php.Когда я предоставляю действительные данные формы и нажимаю «отправить», запись не добавляется в базу данных.Можете ли вы направить меня в правильном направлении?

<?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 Ответ

1 голос
/ 22 января 2011

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

Ваш код, вероятно, должен выглядеть примерно так

$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);
// ... 

У меня был только один параметр для моей процедуры, но он работал с использованием названного варианта (возможно, с небольшим перебором для меня.)

...