Ошибка MySQL Query - данные не предоставлены для параметров в подготовленном выражении - PullRequest
0 голосов
/ 25 мая 2018

Я относительно новичок в 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 может быть иногда нулевым, но не установит ли он в этом случае значение null?Я знаю, что запрос оракула работает, потому что оператор печати показывает это:

CNVLDAT00, TA12, Ad, 196,641, In Service, 196,, 2,, 7,117,115,11L5

Так почему же параметры поставляются неправильно?Это выглядит нормально для меня.

Я посмотрел на Вставить значения , и я думаю, что я делаю это хорошо.

Моя таблица выглядит так:

na_dslam_card: index n_alias shelf_pt_num card_pt_num card_pt_description

Спасибо за любую помощь ...

1 Ответ

0 голосов
/ 25 мая 2018

В тексте SQL есть восемь заполнителей связывания.Нам нужно предоставить восемь значений.

bind_param предоставляет только четыре значения.

Но вместо того, чтобы предоставлять восемь значений, мы можем изменить текст SQL, чтобы заменить заполнители в предложении UPDATE наVALUES() функция, чтобы ссылаться на значение, которое было бы вставлено в столбец.

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 оператора INSERT ... ON DUPLICATE KEY UPDATE.Другими словами, VALUES(col_name) в предложении ON DUPLICATE KEY UPDATE относится к значению 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...