как использовать обычный pdo в CI - PullRequest
1 голос
/ 04 декабря 2011

я привык писать обычные операторы pdo в php, как я могу продолжать делать это без необходимости изучать активные записи или использовать какой-либо другой метод, который есть в CI

я сделал что-то подобное

$sql = "select column1,column2 from table where column_id = :column_id and column_2 = :something"
$query = $db->query($sql);
$query->bindParam(":column_id", $_GET['value'], PDO::PARAM_INT);
$query->bindParam(":something", $_GET['something'], PDO::PARAM_STR);
$query->execute();

while($row = $query->fetch(PDO::FETCH_OBJ)
{
   print $row->data;
}

вместо использования $ _GET я могу использовать $ this-> uri-> сегмент () который, надеюсь, работает с этим ...

Я посмотрел на активную запись, и это похоже на огромную плохую идею, я не знаю, о чем думал Эллислаб. Понятия не имею, как сложные запросы могут идти в них. Я новичок, учусь на Nettuts, я могу ошибаться, и, пожалуйста, покажите мне, если я. просто говоря из того, что я узнал до сих пор.

написание статистики запроса, например,

$ query = $ this-> db-> query ("мой оператор sql") мне нужно было бы экранировать каждое значение, которое я запрашиваю с помощью escape-методов codeigniters, или просто использовать mysql_real_escape_string. это то, что я мог бы сделать, прежде чем погрузиться в мир MVC, но я выбрал pdo, потому что это то, что уже хорошо работает.

как я могу реализовать то, к чему я уже привык ?? Я не возражаю против изменения основных файлов, я надеюсь, что в итоге я изучу все классы, чтобы перепроектировать их, но до этого дня я надеюсь написать свой собственный mvc.

спасибо

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Извините, я не вижу, как это:

$query = $this->db->select('column1,column2')
                 ->from('table')
                 ->where('column_id',$this->input->get('value'))
                 ->where('column_2',$this->input->get('something'))
                 ->get();
return $query->results();

"выглядит как много дополнительной работы", а не это:

$sql = "select column1,column2 from table where column_id = :column_id and column_2 = :something"
$query = $db->query($sql);
$query->bindParam(":column_id", $_GET['value'], PDO::PARAM_INT);
$query->bindParam(":something", $_GET['something'], PDO::PARAM_STR);
$query->execute();

Имейте в виду, что AR автоматически экранируется , поэтому вам не нужно беспокоиться об SQL-инъекциях.

Если вы более привыкли запрашивать привязки, вы также можете сделать

$sql = "select column1,column2 from table where column_id = ? and column_2 = ?";
$query = $this->db->query($sql, array($this->uri->segment(3), $something);

и использовать параметризацию без использования класса Active Record.

Ничто не мешает вам использовать PDO или даже mysql_ * для того, что это имеет значение, вместо класса Active Record. И в вашем запросе нет ничего, что мешало бы CI использовать его - кроме массива $_GET, который вы должны включить, но он может легко заменить $this->input->get() или вручную извлечь сегмент URI или автоматически передать его в метод контроллера, как обычно случается.

Вы говорите: «Я новичок в изучении сетей», но все же говорите, что Эллислабс не знает, что делает; хотя легкий и далеко не идеальный КИ имеет солидное сообщество, активно развивается и его общий консенсус довольно высок; и если он решит, что Active Record будет таким, какой он есть, есть причина.

Также учтите, что другие более правильные и настоящие ORM, такие как Propel или Doctrine, используют аналогичный стиль при выполнении запросов (и вы можете использовать их также вместо AR, если вам нравится), используя преимущества конкатенации PHP5. Пример, взятый прямо с главной страницы propel:

$books = BookQuery::create()  // retrieve all books...
  ->filterByPublishYear(2009) // ... published in 2009
  ->orderByTitle()            // ... ordered by title
  ->joinWith('Book.Author')   // ... with their author
  ->find();

Так что я не вижу ничего странного в том, как CI Active Record реализован или структурирован. Если ваш код не работает, пожалуйста, предоставьте более подробную информацию, такую ​​как коды ошибок и т. Д., Чтобы мы могли понять, , почему не работает.

ВАЖНО:

Я только что прочитал список изменений из последней версии; попробуйте загрузить его (версия 2.10), так как там указано:

Добавлен драйвер PDO в драйвер базы данных.

0 голосов
/ 04 декабря 2011

Вы ничего не получите, используя класс DB CI, если вы не используете ActiveRecord или другие функции.Почему бы просто не использовать PDO изначально?

Кстати, вы можете сделать то же самое следующим образом:

$result = $this->db->
    select(array('column1', 'column2'))->
    where(array(
        'column1' => $this->input->get('value'),
        'column2' => $this->input->get('something')
    ))->get('table')->result();

print_r($result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...