За последние 24 часа нас посетили 23676 программистов и 1599 роботов. Сейчас ищет 821 программист ...

Затык с pdo

Тема в разделе "PHP для новичков", создана пользователем machetero, 20 окт 2016.

  1. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    У меня проблемы с элементарными вещами. И мне стыдно, что я сам не могу их разрешить.
    Вообщем вот код класса Db
    Код (Text):
    1. class Db
    2. {
    3.  
    4.     public $pdo;
    5.    
    6.     public function __construct()
    7.     {
    8.      
    9.         $settings = $this->getPDOSettings();
    10.         $this->pdo = new \PDO($settings['dsn'], $settings['user'], $settings['pass'], null);
    11.        
    12.     }
    13.    
    14.     public function execute($query, array $params=null)
    15.     {
    16.        
    17.         if(is_null($params)){
    18.             $stmt = $this->pdo->query($query);
    19.             return $stmt->fetchAll();
    20.         }
    21.         $stmt = $this->pdo->prepare($query);
    22.         $stmt->execute($params);
    23.         return $stmt->fetchAll();
    24.        
    25.     }  
    26. }
    Когда вызываю метод execute так, то всё работает:
    $content = App::$db->execute('SELECT * FROM blog_posts WHERE id = :id', ['id' => $params[0]]);
    А вот когда вызываю так, то возвращается пустой результат:
    $content['posts'] = App::$db->execute('SELECT * FROM blog_posts ORDER BY id DESC LIMIT 5 OFFSET :eek:ffset', ['offset' => $_GET['offset']]);
    Отображение ошибок включено, ничего не выводиться.
    Пробовал вызывать print_r(App::$db->pdo->errorInfo()); выводиться код ошибки 00000, что типа всё в порядке.
    Почему в первом случае всё работает и аргумент передаётся, а во втором случае оффсет не передаётся ? Помогите плз, очень надо решить проблему.
    --- Добавлено ---
    В phpmyadmin запрос работает
     
  2. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Это какая-то жесть. Вот так работает:
    Код (Text):
    1. <?php
    2. $pdo = new PDO('mysql:host=localhost;dbname=gotlib;charset=utf8', 'root', '', null);
    3. $stmt = $pdo->query('SELECT * FROM blog_posts ORDER BY id DESC LIMIT 5 OFFSET 5');
    4. var_dump($stmt->fetchAll());
    А вот так уже нет:
    Код (Text):
    1. <?php
    2. $pdo = new PDO('mysql:host=localhost;dbname=gotlib;charset=utf8', 'root', '', null);
    3. $stmt = $pdo->prepare('SELECT * FROM blog_posts ORDER BY id DESC LIMIT 5 OFFSET :offset');
    4. $stmt->execute(['offset' => 5]);
    5. var_dump($stmt->fetchAll());
     
  3. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Вообщем на тостере дали ссылку http://phpfaq.ru/pdo#limit
    Вопрос решён
    Так жёстко я уже давно не ипался
     
  4. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Эм, я может опоздал и может я буду не прав, но
    PHP:
    1. $stmt->execute([':offset' => 5]);
    И, offset необязательный параметр
    SELECT * FROM tbl LIMIT 0,100;
     
  5. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Abyss в процессе решения проблемы, я пробовал ставить двоеточие, но всё равно не помогало
     
  6. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Как такое может быть ?
    PHP:
    1. public function run(string $sql, array $bind = []){
    2. //...
    3. $pdostmt = $this->prepare($this->sql);
    4. if($pdostmt->execute($this->bind) !== false) {
    5. //...
    6.  
    7. $this->db->run("select * from tbl where somecolumn = :somevalue",[":somevalue"=>1]);
    Все работает отлично.

    PHP:
    1.         $options = array(
    2.             PDO::ATTR_PERSISTENT => false,
    3.             PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    4.         );
    PHP 7.1.0RC4