#php #arrays #pdo
Вопрос:
Я пытаюсь создать повторно используемую функцию, которая будет работать практически с любой таблицей, но у меня возникли проблемы с созданием массива значений, которые будут передаваться для подготовленных параметров.
function insertInto($data, $table) {
foreach($data as $key => $val) {
if($key !== 'submit') {
$tableFields .= "{$key},";
$tablePrepare .= ":{$key},";
$tableValues[] .= ${$key};
${$key} = "{$val}";
echo "<br>${$key} = ${$key}";
}
}
$tableFields = substr($tableFields, 0, -1);
$tablePrepare = substr($tablePrepare, 0, -1);
print_r($tableValues);
$sql = "INSERT INTO $table($tableFields) VALUES($tablePrepare)";
echo "<br>$sql = $sql";
$stmt = DB::prepare($sql);
$stmt->execute($tableValues);
echo "<br>Record inserted successfully";
}
Все работает, кроме значений $tableValues. Когда я отправляю некоторые тестовые данные, операторы echo отображают следующее:
$player = Muller
$era = 1.58
$baa = .225
$whip = 0.78
$win = 36
$innings = 98.2
Array ( [0] => [1] => [2] => [3] => [4] => [5] => )
$sql = INSERT INTO clash_pitchers(player,era,baa,whip,win,innings)
VALUES(:player,:era,:baa,:whip,:win,:innings)
Record inserted successfully
Это раздел, который работает неправильно
Array ( [0] => [1] => [2] => [3] => [4] => [5] => )
Я подумывал о создании bindParam/bindValue для каждой переменной, но столкнулся с аналогичной проблемой. Я уверен, что в моем подходе есть недостатки, поэтому я определенно готов выслушать предложения о лучшем способе достижения моей цели, если это вообще возможно.
Заранее спасибо!
Комментарии:
1. Я бы подумал, что вам не нужно ничего делать с массивом значений, просто передайте его прямо
$stmt->execute($data);
2. Что здесь делает точка
$tableValues[] .= ${$key};
?3. Кроме того, вам нужны
key => value
пары дляexecute()
того, чтобы изменить его в$tableValues[$key] = $val;
4. @NigelRen Когда я передаю $данные напрямую (что является массивом $_POST), я получаю следующую ошибку: Неперехваченное исключение «PDOException» с сообщением «SQLSTATE[HY093]: Недопустимый номер параметра: параметр не был определен» в /<путь>/функции.php:211 Трассировка стека: #0 /<путь><путь>/functions.php(211): PDOStatement-<путь>>выполнить(массив) #1 /<путь>><путь>/index.php(5): insertInto(Массив, ‘clash_pitchers’) #2 {основной} , введенный в /<путь><путь>/functions.php в строке 211 <путь><= Строка 211 — $stmt->выполнить($данные); Я изменил ввод «Отправить» на кнопку, чтобы, надеюсь, исключить его из массива $_POST, но ошибка указывает на обратное.
5. @Michel Удаление точки приводит к следующей ошибке: «Нарушение ограничения целостности: столбец 1048 «игрок» не может быть пустым» »
Ответ №1:
@Michel смог ответить на этот вопрос за меня. Как только он опубликует ответ, я отдам ему должное за это. Тем временем я хотел опубликовать ответ за пределами наших комментариев туда и обратно, потому что в настоящее время он скрыт, и вам нужно просмотреть дополнительные комментарии, чтобы увидеть его.
Итак, меняем эту строку:
$tableValues[] .= ${$key};
К этому:
$tableValues[$key] = $val;
вот что все исправило.
Комментарии:
1. Таким образом , это выглядит так, как будто вы копируете данные из
$data
в$tableValues
, единственное, что вы делаете, это удаляете отправку (unset($data['submit');
)