PHP/PDO: Проблемы с программным созданием массива значений для инструкции Insert

#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'); )