【问题标题】:Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in警告:PDOStatement::execute(): SQLSTATE[HY093]: 参数号无效:参数未在
【发布时间】:2016-01-27 12:57:23
【问题描述】:

我尝试使用 php 和 mysql 调用存储过程并收到上述错误消息?有人对我做错了什么有任何想法吗?

try{
   $conn = new PDO('mysql:host=localhost;dbname=holidaybookingapp', '', '');
}
catch (PDOException $exception) 
{
   echo "Oh no, there was a problem" . $exception->getMessage();
}

    $startDate="2017-05-23";
    $endDate="2017-05-23";
    $empID= "2";

    $sql='CALL spAddNewHoliday(:EmployeeID,:StartDate,:EndDate)';
    $stmt = $conn->prepare($sql);

    $stmt = $conn->prepare("CALL spAddNewHoloiday(?,?,?)");

    $stmt->bindParam('employeeID',$empID, PDO::PARAM_STR);
    $stmt->bindParam('StartDate1',$startDate, PDO::PARAM_STR);
    $stmt->bindParam('EndDate1',$endDate, PDO::PARAM_STR);
    //$array=array($empID, $startDate,$endDate);

    $stmt->execute(); // call the stored procedure

【问题讨论】:

  • 无效参数号好像很清楚...为什么要准备两次stmt?而且,顺便说一句,你为什么不保留你的第一个 stmt 并在执行中使用一个数组而不是三次 bindParam 呢? + 注意你的“spAddNewHoliday”看起来不对……(holoday)
  • 您致电prepare 两次。如果你像第一次一样打电话给prepare,你必须打电话给bindParam(':StartDate'....)(:,最后没有1);如果你像第二种方式那样调用它,你必须调用bindParam(1, $empID,...); bindParam(2, $startDate...) etc

标签: php mysql stored-procedures


【解决方案1】:

去掉第二个prepare(),占位符要匹配同名

$startDate="2017-05-23";
$endDate="2017-05-23";
$empID= "2";

$sql='CALL spAddNewHoliday(:EmployeeID,:StartDate,:EndDate)';
$stmt = $conn->prepare($sql);

$stmt->bindParam('EmployeeID',$empID, PDO::PARAM_STR);
$stmt->bindParam('StartDate',$startDate, PDO::PARAM_STR);
$stmt->bindParam('EndDate',$endDate, PDO::PARAM_STR);

$stmt->execute(); // call the stored procedure

【讨论】:

    【解决方案2】:

    更改自:

    $sql='CALL spAddNewHoliday(:EmployeeID,:StartDate,:EndDate)';
    $stmt = $conn->prepare($sql);
    

    收件人:

    $sql='CALL spAddNewHoliday(:EmployeeID,:StartDate,:EndDate)';
    $stmt = $conn->prepare($sql);
    $stmt->execute(array(':EmployeeID'=>$empID, ':StartDate'=>$startDate, ':EndDate'=>$endDate));
    

    【讨论】:

      【解决方案3】:

      我会这样做:

      $stmt = $conn->prepare("CALL spAddNewHoliday(:emp,:start,:end)");
      $stmt->execute([':emp'=>$empID,':start'=>$startDate,':end'=>$endDate]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        • 2016-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多