Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 19 апр 2024, 05:53

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: работа с базой данных
СообщениеДобавлено: 26 июл 2012, 06:08 
Не в сети
Зеленый

Зарегистрирован: 17 июл 2012, 00:17
Сообщения: 1
Доброго времени суток)

Вопрос по базе данных:
при вот таком запросе:
Код:
DB::query(DATABASE::SELECT,$sql)
         ->param(':id',$id)
         ->execute();

Какими функциями проверяется переменная $id, стоил ли беспокоиться об sql-инъекциях??
и проходил ли переменная $id проверку mysql_real_escape_string??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с базой данных
СообщениеДобавлено: 27 июл 2012, 19:57 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 12 фев 2012, 01:02
Сообщения: 462
Читайте
http://kohanaframework.su/database/query_types

_________________
kohanaframework.su - обучение фреймворку Kohana


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с базой данных
СообщениеДобавлено: 11 сен 2012, 23:27 
Не в сети
Новичок

Зарегистрирован: 03 сен 2012, 11:38
Сообщения: 11
Добрый вечер!

Как можно получить результат в виде массива с такого запроса (пример):
Код:
$query = DB::query(Database::SELECT, 'SELECT * FROM users WHERE username = :user AND status = :status') 
            ->parameters(array(   
                ':user' => 'john',   
                ':status' => 'active',
        ));

У меня почему то $query возвращается сам запрос в виде "SELECT * FROM users WHERE username = 'john' AND status = 'active'"
Код:
$result = $query->as_array();

А это я так понял нельзя прописать при использовании parameters

А такой запрос вообще не чего не возвращает:
Код:
$sql = "SELECT * FROM ". $this->_table ." WHERE `positions` = :positions AND 'user_id' = :user_id";
 
        $query = DB::query(Database::SELECT, $sql, FALSE)
                ->parameters(array(':positions' => $positions))
                ->parameters(array(':user_id' => $pers['user_id']))
                ->execute();


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с базой данных
СообщениеДобавлено: 12 сен 2012, 00:00 
Не в сети
Новичок

Зарегистрирован: 03 сен 2012, 11:38
Сообщения: 11
Все разобрался, нужно было название полей без кавычек написать :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с базой данных
СообщениеДобавлено: 06 дек 2012, 12:39 
Не в сети
Новичок

Зарегистрирован: 06 ноя 2012, 23:36
Сообщения: 10
Дорого времени суток.
Вопрос по работе с базой данных. Пробовал разобраться сам, но не получилось. На форуме похожего сообщения не нашел.

делаю insert в базу данных. данные из POST получаю - это проверил. по какой-то причине insert не отрабатывает и ошибок не выдает.
Вот код модели
Код:
class Model_Attention extends Model {
       
    public function addlostdoc()
    {
        $query = DB::insert('attentions', array('name', 'sirname', 'fathername', 'id_doctype', 'status', 'information'))
                            ->values(array($name, $sirname, $fathername, $id_doctype, $status, $information));

        return $query->execute();
    }
}

И код контроллера, action_index отправляет данные в action_add
Код:
<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Lostdoc extends Controller_Base {

   public function action_index()
    {
        $block_center = View::factory('v_addlostdoc');       
        $styles = 'media/css/style.css';
       
       
        $this->template->page_title = 'Добавить объявление об утре';
        $this->template->block_center = array($block_center);
       
        $this->template->styles = array($styles);
    }
   
    public function action_addlost($status = 0)
    {
        if (isset($_POST['submit']))
        {
            $att = Arr::extract($_POST, array('name', 'sirname', 'fathername', 'id_doctype', 'information'));
           
            Model::factory('Attention')->addlostdoc($att['name'],
                    $att['sirname'],
                    $att['fathername'],
                    $att['id_doctype'],
                    $att['information']);
        }       
    }
}

заранее спасибо за совет или помощь!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с базой данных
СообщениеДобавлено: 06 дек 2012, 23:37 
Не в сети
Бывалый

Зарегистрирован: 29 сен 2012, 00:30
Сообщения: 65
Откуда: Рига, Латвия
Mett писал(а):
Код:
    public function addlostdoc()


Это опечатка или у метода дейтвительно нет аргументов? Если нету, то как тогда передаються данные из $_POST?

Меня смущает (я понимаю, что этот код в принципе работает, но) и запутывает ваши манипуляции с массивами:
Снала выбираете данные из $_POST;
Потом каждый параметр передаете модели;
Затем в модели опять собираете параметры в массив.
Проще:
Код:
// Controller:
Model::factory('Attention')->addlostdoc( Arr::extract($_POST, array('name', 'sirname', 'fathername', 'id_doctype', 'information')));

//Model:
public function addlostdoc($data)
    {
        $query = DB::insert('attentions', array('name', 'sirname', 'fathername', 'id_doctype', 'status', 'information'))
                            ->values($data);
        return $query->execute();
    }

Если не работает, проверьте:
Включен ли показ ошибок в bootstrap.php;
Оберните код метода addlostdoc в try {} catch, возможно база данных выдает исключение, которые вы не ловите.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с базой данных
СообщениеДобавлено: 06 дек 2012, 23:42 
Не в сети
Бывалый

Зарегистрирован: 29 сен 2012, 00:30
Сообщения: 65
Откуда: Рига, Латвия
А еще лучше, изменить код примерно так:
Код:
// Controller:
Model::factory('Attention')->addlostdoc($_POST);

//Model:
public function addlostdoc($data)
    {
        $query = DB::insert('attentions', array('name', 'sirname', 'fathername', 'id_doctype', 'status', 'information'))
                            ->values(Arr::extract($data, array('name', 'sirname', 'fathername', 'id_doctype', 'information')));
        return $query->execute();
    }

Объясню: если вам позже понадобить изменить массив
Код:
array('name', 'sirname', 'fathername', 'id_doctype', 'status', 'information')

то изменять его надо будет только в одном месте - в данном методе. Не надо будет скакать по всему приложению и искать где еще забыли поменять порядок аргументов или т.п.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с базой данных
СообщениеДобавлено: 07 дек 2012, 09:23 
Не в сети
Новичок

Зарегистрирован: 06 ноя 2012, 23:36
Сообщения: 10
Перепробовал все предложенные Вами варианты - не помогло.
В таблице attentions есть поле ID, но если я правильно понял, в явном виде его можно не вводить, так как это PK и Autoincrement. думаю ошибка не из-за этого


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с базой данных
СообщениеДобавлено: 07 дек 2012, 10:21 
Не в сети
Новичок

Зарегистрирован: 06 ноя 2012, 23:36
Сообщения: 10
Спасибо! нашел механическую ошибку в SQL запросе - не было поля status.
Все работает. Одного не понял - как пользоваться блоком try-catch и что за показ ошибок в bootstrap.php


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с базой данных
СообщениеДобавлено: 08 дек 2012, 00:46 
Не в сети
Бывалый

Зарегистрирован: 29 сен 2012, 00:30
Сообщения: 65
Откуда: Рига, Латвия
Mett писал(а):
как пользоваться блоком try-catch и что за показ ошибок в bootstrap.php

Если вкратце, то исключения
Про ошибки:
Код:
/**
 * Initialize Kohana, setting the default options.
 *
 * The following options are available:
 *
 * - string   base_url    path, and optionally domain, of your application   NULL
 * - string   index_file  name of your index file, usually "index.php"       index.php
 * - string   charset     internal character set used for input and output   utf-8
 * - string   cache_dir   set the internal cache directory                   APPPATH/cache
 * - boolean  errors      enable or disable error handling                   TRUE
 * - boolean  profile     enable or disable internal profiling               TRUE
 * - boolean  caching     enable or disable internal caching                 FALSE
 */
Kohana::init(array(
   'base_url'   => 'http://localhost/my-project/'
        'index_file' => FALSE,
   'profile' => (Kohana::$environment === Kohana::DEVELOPMENT),
   'caching' => (Kohana::$environment === Kohana::PRODUCTION),
   'errors'  => TRUE //(Kohana::$environment === Kohana::DEVELOPMENT),
));

фрагмент кода, ключ 'errors' отвечает за вывод ошибок - в данном случае ошибки будут отображаться.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group