-1

我在 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了,但这似乎也不起作用(也许我做错了?)。我在这里做错了什么?

4

2 回答 2

-1

通过编辑我的原始代码解决了这个问题。我在两件事上失败了。一方面,我在创建过程时没有指定 user_id 是什么类型的变量(应该是 typed 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();
于 2013-09-09T16:22:46.900 回答
-2

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

  1. 创建您的程序。
  2. 从控制台进行测试调用
  3. 创建一个测试脚本,其中不包含“整个项目的代码”中的任何内容,但仅包含可复制的测试代码。
  4. 使用 PHP 的原始值进行测试调用
  5. 在同一个测试脚本中添加 PDO 和准备好的语句调用并启用错误报告。
  6. 在此处发布确切的代码及其确切的输出。

通过这种方式,您至少可以让陌生人回答您的问题。

于 2013-09-06T14:02:47.987 回答