2013-09-06 9 views
-1

У меня есть функция в классе PHP, где я пытаюсь создать и запустить хранимую процедуру, но я не могу заставить переменные перейти к хранимой процедуре. Если я вручную ввести dateStart, dateEnd и user_id то вещи работают, как и ожидалось, но не тогда, когда я пытаюсь связать переменные с ним (я даже попытался с помощью PHP прямо переменных без толку):MySQL хранимой процедуры и PDO?

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, но это тоже не сработало (возможно, я делал это неправильно?). Что я здесь делаю неправильно?

ответ

-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(); 
+0

Действительно, кто-то проголосовал за этот ответ? Было бы интересно объяснить, почему это заслуживает голосования. –

-2

Поскольку этот вопрос является верным offtopic, если ответ прямо, вот несколько советов для вас, как отлаживать его.

  1. создайте свою процедуру.
  2. Проведите тестовый вызов с консоли
  3. создайте тестовый скрипт, который не содержит немного кода «всего проекта», но только для воспроизводимого кода тестирования.
  4. сделать тестовый вызов с необработанными значениями из PHP
  5. в том же тестовом скрипте добавить PDO с подготовленными операторами вызвать с сообщением об ошибках.
  6. Отправьте здесь точный код и его точный результат.

Таким образом, вы зададите свой вопрос, по крайней мере, посторонним.

Смежные вопросы