как отправить данные в mysqli с индексным номером (подготовленная инструкция)

#php #mysqli #foreach

#php #mysqli #foreach

Вопрос:

Я создаю массив из динамически создаваемых полей ввода, а затем отправляю массив на php, в php я создаю цикл foreach и пытаюсь вставить его в свою базу данных.

Я создал цикл foreach для своего массива и вставил подобные значения в свою базу данных, однако моя проблема в том, что вы не можете привязать переменную с индексным номером к строке вашего запроса. Я уже проверил, действительно ли это массив, который я отправляю, и ответ: Да. это массив.

 $stmt = $conn->prepare('INSERT INTO vv(event_id, vvType, vvCosting) VALUES (?, ?, ?)');
foreach ($example as $index => $value) {
    $stmt->bind_param('iss', $id, $example, $example_costs);

    $id = $id;
    $example = $value;
    $example_costs = example_costs[$index]; //this DOES NOT work
    $stmt->execute();
}
  

Итак, чего я хочу, было бы следующее: Создайте один цикл foreach для моей $example переменной и, основываясь на номерах индексов, также вставьте данные из переменной example_costs и вставьте их также в базу данных. Вам не следует беспокоиться о том, существует или нет значение индекса в моей example_costs переменной, поскольку они являются «парами».

Я знаю, что проблема в том, что я не могу связать свою переменную таким образом:

 $example_costs[$index]
  

Итак, теперь мой вопрос: как я могу привязать свою переменную, как указано выше? Но каким-то образом php принимает? Или мне нужно создать 2 цикла foreach? —> То, чего я бы предпочел НЕ делать.

Ответ №1:

Вы не указали, что именно вы подразумеваете под «не работает» (т. Е. вы не описали, что происходит не так или какое поведение вы видите), но вот что я могу наблюдать только из кода:

1) У вас есть (то, что кажется) опечатка: я ожидаю, что example_costs[$index]; действительно должно быть $example_costs[$index]; .

2) Предполагая, что значение 1 фиксировано, вы также перезаписываете значения переменных $example и $example_costs , которые вы пытаетесь выполнить в цикле, пока цикл все еще продолжается. Очевидно, что это уничтожит исходные массивы и сделает невозможным их повторное использование при следующей попытке цикла.

В этой ситуации и в качестве общего правила хорошего программирования не используйте повторно имена переменных для представления двух разных вещей в коде — особенно когда вы все еще используете их по их первоначальному назначению!

На самом деле вам все равно не нужны эти отдельные переменные в инструкции bind. Это должно выполнить задание:

 $stmt = $conn->prepare('INSERT INTO vv(event_id, vvType, vvCosting) VALUES (?, ?, ?)');
foreach ($example as $index => $value) {
    $stmt->bind_param('iss', $id, $value, $example_costs[$index]);
    $stmt->execute();
}
  

Остальное либо неверно (например, перезапись $example массива), либо избыточно ( $id = $id например, присвоение переменной собственного значения по самому определению бессмысленно).

Комментарии:

1. Ну, я бы предпочел иметь бессмысленную переменную на данный момент, а затем мгновенно перейти к практике, где я предполагаю. Скорее, некоторое разъяснение для себя, так сказать. Однако я заметил, что вы указали следующее: $example_costs[$index]. но допустимо ли это? Учитывая, что я все еще применяю к нему номер индекса, верно?

2. Я попробовал ваш код, и он работает, но это потому, что я перезаписывал старое значение (массив) из переменной во что-то новое?

3. example_costs[$index]. совершенно допустимо, если example_costs предположить, что это массив. Это верно в любом месте PHP, это вообще не имеет никакого отношения к привязке параметров. метод bind_param не является специальным, вы можете передать ему любое значение, точно так же, как вы можете с любой другой функцией. Я не совсем понимаю, в чем ваша путаница, на самом деле? Ваша предыдущая проблема заключалась в том, что вы забывали $ в начале имени переменной.

4. «это потому, что я перезаписывал старое значение (массив) из переменной во что-то новое?» ДА. Это моя точка зрения. Допустим, $example был array(0 => "Value 0", 1 => "Value 1"); . Если во время цикла вы делаете то, что делали, и пишете $example = $value; … затем в этот момент $example становится строкой, содержащей «Значение 0». Итак, когда вы затем снова переходите к началу foreach цикла, и он пытается найти следующее значение в массиве $ example, он обнаруживает, что массив фактически теперь является строкой, и, следовательно, очевидно, что он не может выбрать следующее значение массива … потому что оно больше не существует.

5. Я заметил, как вы указали, я уничтожил переменную, которая содержала массив, присвоив ей новое значение. Поэтому он превратился в строку, а затем попытался найти индекс символа, который я предполагаю. Указанная ошибка была: Обратите внимание: смещение неинициализированной строки: 1. Спасибо за помощь и указание на ошибку, которую я допустил.