我在PHP类中有一个函数,我正在尝试创建和运行存储过程,但我似乎无法将变量传递给存储过程。如果我手动键入dateStart
,dateEnd
和user_id
,那么事情会按预期运行,但是当我尝试将变量绑定到它时(我甚至尝试使用直接的PHP变量)无济于事:
try {
$sql = $conn->prepare("
DROP PROCEDURE IF EXISTS datespopulate;
DELIMITER |
CREATE PROCEDURE datespopulate(dateStart DATE, dateEnd DATE, user_id)
BEGIN
WHILE dateStart <= dateEnd DO
INSERT INTO timesheet (DATE_YYYYMMDD, USER_ID) VALUES (dateStart, user_id);
SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
END WHILE;
END;
|
DELIMITER ;
CALL datespopulate(:startdate,:enddate,:user_id);
");
$sql->execute(array(
':startdate'=> $startdate,
':enddate'=> $enddate,
':user_id'=> $userid));
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage(); }
我尝试了bindparam
,但这似乎也没有用(也许我做错了?)。我在这里做错了什么?
答案 0 :(得分:-1)
通过编辑我的原始代码解决了这个问题。我失败了两件事。首先,我没有在创建过程时指定user_id是什么类型的变量(应该有类型user_id INT
)。其次,我必须将所有变量分开以使用预准备语句插入它们。数组对我来说不起作用,但是如果我分别绑定每个变量,那么它可以工作:
$sql = $conn->prepare("CALL datespopulate(:startdate,:enddate,:userid);");
$sql->bindParam(':startdate', $startdate, PDO::PARAM_STR);
$sql->bindParam(':enddate', $enddate, PDO::PARAM_STR);
$sql->bindParam(':userid', $userid, PDO::PARAM_INT);
$sql->execute();
答案 1 :(得分:-2)
如果直接回答这个问题肯定是个问题,这里有一些提示,如何调试它。
这样你至少可以让陌生人回答你的问题。