MySQL存储过程和PDO?

时间:2013-09-06 12:54:02

标签: php mysql stored-procedures pdo

我在PHP类中有一个函数,我正在尝试创建和运行存储过程,但我似乎无法将变量传递给存储过程。如果我手动键入dateStartdateEnduser_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,但这似乎也没有用(也许我做错了?)。我在这里做错了什么?

2 个答案:

答案 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)

如果直接回答这个问题肯定是个问题,这里有一些提示,如何调试它。

  1. 创建您的程序。
  2. 从控制台进行测试呼叫
  3. 创建一个测试脚本,其中不包含“整个项目代码”中的一些内容,但仅包含可重现的测试代码。
  4. 使用PHP中的原始值进行测试调用
  5. 在完全相同的测试脚本中,在准备好的语句调用中添加PDO并启用错误报告。
  6. 在此处发布确切的代码和确切的输出。
  7. 这样你至少可以让陌生人回答你的问题。