Таблица БД не получает данные
Вопрос по добавлению данных в таблицу БД. Задача следующая. Пользователь на странице dashboard вносит в форму результаты своего взвешивания и измерений(кг, содержание жира, объемы груди, талии и т.д.). Эти данные должны записываться в таблицу БД. Я создал таблицу parametrs. По логике, которую я прописал в коде, после нажатия на кнопку "Отправить" на той же странице должна происходить обработка формы и методом Post передаваться данные. Контроллер UserWeight принимает данные из формы, передает в WeightModel, где функция addParametrs добавляет значения в соответствующие ячейки таблицы parametrs. Однако кто-то в этой цепочке не может понять эту логику и данные в таблицу не приходят. Пробовал без проверки формы, и в execute принудительно цифры задавал, все равно не доходят до таблицы. ((( Уточнения: 1. Обработка формы происходит, т.к. страница обновляется; 2. Подключение к БД вынесено в отдельный файл, через который другие формы успешно взаимодействуют с другими таблицами БД. Контроллер:
<?php
class UserWeight extends Controller {
public function userWeight() {
$data = [];
if(isset($_POST['weight'])) {
$user = $this->model('WeightModel');
$user->setData($_POST['weight'], $_POST['fat'], $_POST['visceral'], $_POST['bone'], $_POST['water'],
$_POST['muscles'], $_POST['physical'], $_POST['metabolism'], $_POST['age'], $_POST['breast'],
$_POST['waist'], $_POST['hips']);
// $isValid = $user->validForm();
// if($isValid == "Верно")
$user->addParametrs();
// else
// $data['message'] = $isValid;
}
$this->view('user/dashboard', $data);
}
}
Модель:
<?php
require 'DB.php';
class WeightModel
{
private $weight;
private $fat;
private $visceral;
private $bone;
private $water;
private $muscles;
private $physical;
private $metabolism;
private $age;
private $breast;
private $waist;
private $hips;
private $_db = null;
public function __construct()
{
$this->_db = DB::getInstence();
}
public function setData($weight, $fat, $visceral, $bone, $water, $muscles, $physical, $metabolism, $age, $breast,
$waist, $hips)
{
// $this->date = $date;
$this->weight = $weight;
$this->fat = $fat;
$this->visceral = $visceral;
$this->bone = $bone;
$this->water = $water;
$this->muscles = $muscles;
$this->physical = $physical;
$this->metabolism = $metabolism;
$this->age = $age;
$this->breast = $breast;
$this->waist = $waist;
$this->hips = $hips;
}
public function addParametrs()
{
$sql = 'INSERT INTO parametrs (weight, fat, visceral, bone, water, muscles, physical, metabolism, age, breast, waist, hips)
VALUES(:weight, :fat, :visceral, :bone, :water, :muscles, :physical, :metabolism, :age, :breast, :waist, :hips)';
$query = $this->_db->prepare($sql);
$query->execute(['weight' => $this->weight, 'fat' => $this->fat, 'visceral' => $this->visceral, 'bone' => $this->bone,
'water' => $this->water, 'muscles' => $this->muscles, 'physical' => $this->physical, 'metabolism' => $this->metabolism,
'age' => $this->age, 'breast' => $this->breast, 'waist' => $this->waist, 'hips' => $this->hips]);
}
}
Ответы (3 шт):
Помоему Вы неправильно именовали параметры
$query->execute(['weight' => $this->weight, 'fat' => $this->fat, 'visceral' => $this->visceral, 'bone' => $this->bone,
'water' => $this->water, 'muscles' => $this->muscles, 'physical' => $this->physical, 'metabolism' => $this->metabolism,
'age' => $this->age, 'breast' => $this->breast, 'waist' => $this->waist, 'hips' => $this->hips]);
думаю должно быть так:
$query->execute([':weight' => $this->weight, ':fat' => $this->fat, ':visceral' => $this->visceral, ':bone' => $this->bone,
':water' => $this->water, ':muscles' => $this->muscles, ':physical' => $this->physical, ':metabolism' => $this->metabolism,
':age' => $this->age, ':breast' => $this->breast, ':waist' => $this->waist, ':hips' => $this->hips]);
Позволю себе немного упорядочить Ваш код.
class WeightModel
{
private $weight;
private $fat;
private $visceral;
private $bone;
private $water;
private $muscles;
private $physical;
private $metabolism;
private $age;
private $breast;
private $waist;
private $hips;
private $_db = null;
public function __construct( $params = array() )
{
if ( isset( $params ) && is_array( $params ) && count( $params ) > 0 ) {
foreach( $params as $key => $value) {
if ( trim( $key ) != '' && property_exists( $this, $key ) ) {
$this->$key = $value;
}
}
}
/** А точно `Instence`? А не `Instance` ? может тут собака и зарыта? */
$this->_db = DB::getInstence();
}
public function setPropVal( $prop = null, $val = null ) {
if ( !is_null( $prop ) && trim( $prop ) != '' && property_exists( $this, $prop) ) {
$this->$prop = $val;
}
return $this;
}
public function getPropVal( $prop = null, $defaultVal = null ) {
$result = $defaultVal;
if ( !is_null( $prop ) && trim( $prop ) != '' && property_exists( $this, $prop) ) {
$result = $this->$prop;
}
return $result;
}
public function save() {
$sql = 'INSERT INTO parametrs (weight, fat, visceral, bone, water, muscles, physical, metabolism, age, breast, waist, hips)
VALUES(:weight, :fat, :visceral, :bone, :water, :muscles, :physical, :metabolism, :age, :breast, :waist, :hips)';
$query = $this->_db->prepare($sql);
/** @SanyaH прав, если у Вас модуль DB работает через PDO то ключ передается именно так как Вы его указали в запросе т.е с ":" но без кода класса DB это трудно утверждать */
$query->execute([':weight' => $this->weight, ':fat' => $this->fat, ':visceral' => $this->visceral, ':bone' => $this->bone,
':water' => $this->water, ':muscles' => $this->muscles, ':physical' => $this->physical, ':metabolism' => $this->metabolism,
':age' => $this->age, ':breast' => $this->breast, ':waist' => $this->waist, ':hips' => $this->hips]);
}
}
Вызов с установкой параметров
$model = new WeightModel(['weight' => 100, 'fat' => 200, ... ]);
$model->save();
или вот так
$model = ( new WeightModel())->setPropVal('weight', 100)->setPropVal('fat', 100) ... ->save();
А вообще судя по коду либо у Вас какая-то самописная движка с претензией на фреймворк. Либо фреймворк а-ля Yii2 или Laravel который Вы неправильно используете.
Причину нашел, ошибку исправил, все заработало четко. Если кому интересно узнать, как я на это вышел и какие симптомы указали на ошибку, напишу в конце. А сейчас непосредственно о самой ошибке. Наверное стоит упомянуть, что проект создается по схеме MVC. Итак, часть кода, который работает правильно: Вот параметры формы:
<form action="/basket/order" method="post" class="form-control">
Вот имя класса и метода в контроллере, который принимает и обрабатывает данные формы:
class Basket extends Controller
{
public function order()
{
$data = [];
if (isset($_POST['nameArr'])) {
Имя метода (order) указывает на тот файл страницы (order.php), от которого контроллер принимает данные. Имя класса (Basket) указывает на папку (basket), в которой этот файл находится. Поэтому имя класса должно соответствовать имени папки, а имя метода - имени файла в папке. Тогда весь код работает четко. В моем коде с ошибкой ни имя класса, ни имя метода не совпадали с адресом формы. Поэтому контроллер не реагировал на ее вопли.
Теперь, как я это обнаружил. Данные из любой формы с любой страницы без проблем передавались в БД только тогда, когда форма обрабатывалась на странице регистрации (views/user/reg.php). С любой другой страницы данные не передавались, хотя никаких ошибок не выдавалось, вызывалась одна и та же модель, одним и тем же методом контроллера, применялся один и тот же код обработки. Однако работал он только в классе User контроллера User в методе reg, который желает работать только со страницей user/reg.php. Все другие аналогичные классы напрочь игнорили данные. Обратив внимание на совпадения имени класса с именем папки и имени метода с именем файла, я попробовал все привести в соответствие и тогда все заработало шикарно.