MySQL 查询错误 - 没有为准备好的语句中的参数提供数据
MySQL Query error - no data supplied for parameters in prepared statement
我对 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
我收到此错误消息:
Error setting card info: No data supplied for parameters in prepared
statement
我用的是bind_parameters,所以不能说我没有提供参数数据。我知道 rack 有时可以为 null,但在那种情况下它不会只是将它设置为 null 吗?我知道 oracle 查询有效,因为打印语句显示:
CNVLDAT00,TA12,Ad,196,641,In Service,196,,2,,7,117,115,11L5
那么为什么没有正确提供参数?我觉得还可以。
我看了 insert values,我觉得我做的还行。
我的 table 看起来像这样:
na_dslam_card:
指数
n_alias
shelf_pt_num
card_pt_num
card_pt_description
感谢您的帮助...
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参考手册:
In assignment value expressions in the ON DUPLICATE KEY UPDATE
clause, you can use the VALUES(col_name)
function to refer to column values from the INSERT
portion of the INSERT ... ON DUPLICATE KEY UPDATE
statement. In other words, VALUES(col_name)
in the ON DUPLICATE KEY UPDATE
clause refers to the value of col_name
that would be inserted, had no duplicate-key conflict occurred.
参考文献:
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
我对 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
我收到此错误消息:
Error setting card info: No data supplied for parameters in prepared statement
我用的是bind_parameters,所以不能说我没有提供参数数据。我知道 rack 有时可以为 null,但在那种情况下它不会只是将它设置为 null 吗?我知道 oracle 查询有效,因为打印语句显示:
CNVLDAT00,TA12,Ad,196,641,In Service,196,,2,,7,117,115,11L5
那么为什么没有正确提供参数?我觉得还可以。
我看了 insert values,我觉得我做的还行。
我的 table 看起来像这样:
na_dslam_card: 指数 n_alias shelf_pt_num card_pt_num card_pt_description
感谢您的帮助...
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参考手册:
In assignment value expressions in the
ON DUPLICATE KEY UPDATE
clause, you can use theVALUES(col_name)
function to refer to column values from theINSERT
portion of theINSERT ... ON DUPLICATE KEY UPDATE
statement. In other words,VALUES(col_name)
in theON DUPLICATE KEY UPDATE
clause refers to the value ofcol_name
that would be inserted, had no duplicate-key conflict occurred.
参考文献:
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