【问题标题】:MySQL Query error - no data supplied for parameters in prepared statementMySQL 查询错误 - 没有为准备好的语句中的参数提供数据
【发布时间】:2018-11-05 00:50:56
【问题描述】:

我对 MySQL 比较陌生,我正在尝试结合我在其他地方看到的插入和更新语句。对于以下代码,

$query = "this is not the problem";
$ora_stmt = oci_parse($conn, $query);
$result = oci_execute($ora_stmt);
$stmt1 = $mysqli1->prepare("INSERT INTO na_dslam_card (n_alias, shelf_pt_num, card_pt_num, card_pt_description)
                            VALUES (?, ?, ?, ?)
                            ON DUPLICATE KEY UPDATE n_alias=?, shelf_pt_num=?, card_pt_num=?, card_pt_description=?");

while($row = oci_fetch_array($ora_stmt, OCI_ASSOC+OCI_RETURN_NULLS)) {
    print  $row['DSLAM'] . "," . $row['MODEL']  . "," . $row['VENDOR'] . "," . $row['BROADBAND_CIRCUIT_ID'] . "," . $row['SVC_N'] . "," . $row['PORT_ADDR_STATUS']. "," . $row['BROADBAND_CIRCUIT_ID'] . "," . $row['RACK'] . "," . $row['SHELF'] . "," .  $row['SLOT'] . "," . $row['PORT'] . "," . $row['SHELF_PT_NUMBER'] . "," .  $row['CARD_PT_NUMBER'] . "," . $row['CARD_PT_DESCRIPTION'] . "\n";
    $stmt1->bind_param("ssss", $row['DSLAM'],$row['SHELF_PT_NUMBER'],$row['CARD_PT_NUMBER'],$row['CARD_PT_DESCRIPTION']); 
    if(!$stmt1->execute())
    { 
      $tempErr = "Error setting card info: " . $stmt1->error;
      printf($tempErr . "\n");  //show mysql execute error if exists  
      $err->logThis($tempErr);
    } 
} //while

我收到此错误消息:

错误设置卡信息:没有为准备好的参数提供数据 声明

我使用了 bind_parameters,所以不应该说我没有提供参数数据。我知道 rack 有时可以为空,但在这种情况下它不会将其设置为空吗?我知道 oracle 查询有效,因为 print 语句显示了这一点:

CNVLDAT00,TA12,Ad,196,641,服务中,196,,2,,7,117,115,11L5

那么为什么没有正确提供参数?我觉得没问题。

我查看了insert values,我认为我做得很好。

我的桌子是这样的:

na_dslam_card: 指数 n_alias 货架_pt_num card_pt_num card_pt_description

感谢您的帮助...

【问题讨论】:

    标签: php mysql insert insert-update


    【解决方案1】:

    SQL 文本中有八个绑定占位符。我们需要提供八个值。

    bind_param 只提供四个值。

    但我们可以修改 SQL 文本,用 VALUES() 函数替换 UPDATE 子句中的占位符,而不是提供八个值,以引用本应插入列中的值。

    INSERT INTO na_dslam_card
    ( n_alias
    , shelf_pt_num
    , card_pt_num
    , card_pt_description
    )  
    VALUES (?, ?, ?, ?)
    ON DUPLICATE KEY
    UPDATE n_alias             = VALUES(alias)
         , shelf_pt_num        = VALUES(shelf_pt_num)
         , card_pt_num         = VALUES(card_pt_num)
         , card_pt_description = VALUES(card_pt_description)
    

    现在只有四个占位符需要值。


    摘自 MySQL 参考手册:

    ON DUPLICATE KEY UPDATE 子句的赋值表达式中,您可以使用VALUES(col_name) 函数来引用INSERT ... ON DUPLICATE KEY UPDATE 语句的INSERT 部分中的列值。换句话说,ON DUPLICATE KEY UPDATE 子句中的VALUES(col_name) 是指将插入的col_name 的值,没有发生重复键冲突。

    参考资料:

    https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

    https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values

    【讨论】:

    • 所以我觉得 UPDATE n_alias = VALUES(alias) ,shelf_pt_num = VALUES(shelf_pt_num) ,card_pt_num = VALUES(card_pt_num) ,card_pt_description = VALUES(card_pt_description) 在两者上都有相同的变量等号的两边。那正确吗?摘录确实说 col_name,所以我想是对的。
    • 这不是VALUES() 函数中的变量...它是对列的引用。它引用了将被插入到列中的值。如果这些列中的任何一个是主键或唯一键的一部分,我们可能不需要更新它。例如,如果 n_alias 是表上的 PRIMARY KEY,我们可以在 UPDATE 子句中省略对 n_alias 的赋值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多