【问题标题】:Prepared statement with many variables does not match number of parameters具有许多变量的准备语句与参数数量不匹配
【发布时间】:2014-06-18 14:24:13
【问题描述】:

尽管我多次检查参数,但我仍然收到异常。我将如何清理这个烂摊子并解决错误?

mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement

这是我的代码,基本上它不是那么多代码,而是 33 个变量/参数。它与 INSERT 语句的工作方式相同:

public function update($assetId, $genericAssetId, $umdns, $assetFullName, $manufacturerId, $model, $serialNumber,
                            $internaliventoryNumber, $locationId, $responsiblePers, $assetStatusId, $assetUtilizationId, $purchaseDate,
                            $installationDate, $lifeTime, $purchasePrice, $currentValue, $warrantyContractId, $agentId, $warrantyContractExp,
                            $warrantyContractNotes, $employeeId, $supplierId, $donorId, $serviceManual, $notes, $picture, $lastmodified,
                            $by_user, $URL_Manual, $metrologyDocument, $metrologyDate, $metrology)
{

    $sql = "UPDATE assets SET GenericAssetID = '$genericAssetId', UMDNS = '$umdns', AssetFullName = '$assetFullName',
     ManufacturerID = '$manufacturerId', Model = '$model', SerialNumber = '$serialNumber',
      InternalIventoryNumber = '$internaliventoryNumber', LocationID = '$locationId',
       ResponsiblePers = '$responsiblePers', AssetStatusID = '$assetStatusId',
       AssetUtilizationID = '$assetUtilizationId', PurchaseDate = '$purchaseDate',
        InstallationDate = '$installationDate', Lifetime = '$lifeTime', PurchasePrice = '$purchasePrice',
         CurrentValue = '$currentValue', WarrantyContractID = '$warrantyContractId', AgentID = '$agentId',
          WarrantyContractExp = '$warrantyContractExp', WarrantyContractNotes = '$warrantyContractNotes',
           EmployeeID = '$employeeId', SupplierID = '$supplierId', DonorID = '$donorId',
            ServiceManual = '$serviceManual', Notes = '$notes', Picture = '$picture', lastmodified = '$lastmodified',
             by_user = '$by_user', URL_Manual = '$URL_Manual', MetrologyDocument = '$metrologyDocument',
              MetrologyDate = '$metrologyDate', Metrology = '$metrology' WHERE AssetID = '$assetId'";

    if ($stmt = $this->db->prepare($sql)) {
        $stmt->bind_param("siisssssssiissiddisssssssssssssss", $assetId, $genericAssetId, $umdns, $assetFullName,
            $manufacturerId, $model, $serialNumber, $internaliventoryNumber, $locationId, $responsiblePers,
            $assetStatusId, $assetUtilizationId, $purchaseDate, $installationDate, $lifeTime, $purchasePrice,
            $currentValue, $warrantyContractId, $agentId, $warrantyContractExp, $warrantyContractNotes, $employeeId,
            $supplierId, $donorId, $serviceManual, $notes, $picture, $lastmodified, $by_user, $URL_Manual,
            $metrologyDocument, $metrologyDate, $metrology);
    }
    $stmt->execute();
    $num_affected_rows = $stmt->affected_rows;
    $stmt->close();
    return $num_affected_rows > 0;
}

【问题讨论】:

  • 我不会数这些哈哈
  • 所以,我停止计数:D
  • 不是答案,而是重新考虑你的方法。 33个参数...
  • 将数据对象视为参数,也可能是具有名称到类型映射的数组。
  • 嗯,它不是那么漂亮,但它有效。

标签: php mysql sql mysqli prepared-statement


【解决方案1】:

您有 个绑定。您将变量放在查询中,而不是绑定运算符 ?

$sql = "UPDATE assets SET GenericAssetID = ?, UMDNS = ?, 

等等……

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 2022-12-21
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2016-05-02
    • 1970-01-01
    • 2022-12-05
    相关资源
    最近更新 更多