0

Вопрос по добавлению данных в таблицу БД. Задача следующая. Пользователь на странице 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-&gt;model('WeightModel');
                $user-&gt;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-&gt;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]);

        }

    }
u_mulder
  • 3,602

3 Answers3

0

Помоему Вы неправильно именовали параметры

$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]);
Sanya H
  • 1,379
0

Позволю себе немного упорядочить Ваш код.

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 ) &amp;&amp; is_array( $params ) &amp;&amp; count( $params ) &gt; 0 ) {
        foreach( $params as $key =&gt; $value) {
            if ( trim( $key ) != '' &amp;&amp; property_exists( $this, $key ) ) {
                $this-&gt;$key = $value;
            }
        }
    }
    /** А точно `Instence`? А не `Instance` ? может тут собака и зарыта? */
    $this-&gt;_db = DB::getInstence();
}

public function setPropVal( $prop = null, $val = null ) {
    if ( !is_null( $prop ) &amp;&amp; trim( $prop ) != '' &amp;&amp; property_exists( $this, $prop) ) {
        $this-&gt;$prop = $val;
    }
    return $this;
}

public function getPropVal( $prop = null, $defaultVal = null ) {
    $result = $defaultVal;
    if ( !is_null( $prop ) &amp;&amp; trim( $prop ) != '' &amp;&amp; property_exists( $this, $prop) ) {
        $result = $this-&gt;$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-&gt;_db-&gt;prepare($sql);
    /** @SanyaH прав, если у Вас модуль DB работает через PDO то ключ передается именно так как Вы его указали в запросе т.е с &quot;:&quot; но без кода класса DB это трудно утверждать */ 
    $query-&gt;execute([':weight' =&gt; $this-&gt;weight, ':fat' =&gt; $this-&gt;fat, ':visceral' =&gt; $this-&gt;visceral, ':bone' =&gt; $this-&gt;bone,
        ':water' =&gt; $this-&gt;water, ':muscles' =&gt; $this-&gt;muscles, ':physical' =&gt; $this-&gt;physical, ':metabolism' =&gt; $this-&gt;metabolism,
        ':age' =&gt; $this-&gt;age, ':breast' =&gt; $this-&gt;breast, ':waist' =&gt; $this-&gt;waist, ':hips' =&gt; $this-&gt;hips]);

}

}

Вызов с установкой параметров

$model = new WeightModel(['weight' => 100, 'fat' => 200, ... ]);
$model->save();

или вот так

$model = ( new WeightModel())->setPropVal('weight', 100)->setPropVal('fat', 100) ... ->save();

А вообще судя по коду либо у Вас какая-то самописная движка с претензией на фреймворк. Либо фреймворк а-ля Yii2 или Laravel который Вы неправильно используете.

  • Код пишу по образцам с курсов itProger. И что удивительно, по сути эта форма полностью аналогична форме регистрации нового пользователя. Разница только в количестве передаваемых параметров и их именах. Ну, насколько я разбираюсь в апельсинах. При всем этом форма регистрации работает четко, а эта форма не работает. И никаких ошибок не выдает. ((( Правда xdebug еще не применял, как тут рекомендовали выше. Надо попробовать. Может он что подскажет. – Сергей Nov 10 '21 at 09:42
  • Так может Вам взять готовый фреймворк и не изобретать велосипед? –  Nov 10 '21 at 10:49
0

Причину нашел, ошибку исправил, все заработало четко. Если кому интересно узнать, как я на это вышел и какие симптомы указали на ошибку, напишу в конце. А сейчас непосредственно о самой ошибке. Наверное стоит упомянуть, что проект создается по схеме 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. Все другие аналогичные классы напрочь игнорили данные. Обратив внимание на совпадения имени класса с именем папки и имени метода с именем файла, я попробовал все привести в соответствие и тогда все заработало шикарно.