#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. Спасибо за помощь и указание на ошибку, которую я допустил.