BindParam плевать хотел на PDO::PARAM_INT

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
MozgoEd
Сообщения: 31
Зарегистрирован: 2012.06.18, 10:51

BindParam плевать хотел на PDO::PARAM_INT

Сообщение MozgoEd » 2012.09.19, 19:23

Необъяснимо, но факт
Пишу такой код:

Код: Выделить всё

$sql = 'SELECT vizit_time FROM users WHERE id = :id';
$cmd = Yii::app()->db->createCommand($sql);
$cmd->bindPararm(':id', $id, PDO::PARAM_INT);
$v_time = $cmd->queryScalar();
 
И что же я вижу при просмотре лога запросов MySQL:
SELECT vizit_time FROM users WHERE id = '28'
Вопрос - Какого лешего значение id в кавычках, ведь мы передали PDO::PARAM_INT?????
Отсюда же попутный вопрос, почему при считывании записи через DAO у нас все поля модели имеют тип данных string? Как с этим бороться? Спасибо!

DropSQL
Сообщения: 102
Зарегистрирован: 2010.02.19, 22:20
Откуда: Киев

Re: BindParam плевать хотел на PDO::PARAM_INT

Сообщение DropSQL » 2012.09.26, 18:56

тема поднималась, это бага/фича самого PDO, а не Yii, так что нужно там копать. Если найдете ответ, отпишите плз

Denyii
Сообщения: 147
Зарегистрирован: 2012.02.13, 14:55

Re: BindParam плевать хотел на PDO::PARAM_INT

Сообщение Denyii » 2012.11.06, 16:40

Задайте принудительно тип переменной, мне помогло)

Код: Выделить всё

settype($id, 'int');
$sql = 'SELECT vizit_time FROM users WHERE id = :id';
$cmd = Yii::app()->db->createCommand($sql);
$cmd->bindPararm(':id', $id, PDO::PARAM_INT);
$v_time = $cmd->queryScalar(); 
http://php.net/manual/ru/function.settype.php

Аватара пользователя
desc
Сообщения: 58
Зарегистрирован: 2014.02.27, 18:28

Re: BindParam плевать хотел на PDO::PARAM_INT

Сообщение desc » 2014.04.22, 12:15

почему то в queryScalar ошибка

Код: Выделить всё

$count=$connection->createCommand("SELECT COUNT(*) FROM post WHERE cat_link=:link ")->queryScalar();
$sql = "SELECT id, title, link, short FROM post WHERE cat_link=:link AND status=1 ORDER BY datetime DESC";
...
    $post=new CSqlDataProvider($sql, array(
            

            'totalItemCount'=>$count,
            'params'=>array(':link'=>$_GET['link']),
 
CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound. The SQL statement executed was: SELECT COUNT(*) FROM post WHERE cat_link=:link

что не так?

Shoe123
Сообщения: 1
Зарегистрирован: 2014.12.11, 20:00

Re: BindParam плевать хотел на PDO::PARAM_INT

Сообщение Shoe123 » 2014.12.11, 20:01

почему при считывании записи через DAO у нас все поля модели имеют тип данных string? Как с этим бороться? Спасибо!
Are you interested in OG0-091 - vce exams Get our self paced 650-987 - actual tests - braindumps.com and rasmussen itil study packages to pass your www.stevenson.edu without any difficulty in Hobe Sound Bible College

Аватара пользователя
yiijeka
Сообщения: 2965
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь

Re: BindParam плевать хотел на PDO::PARAM_INT

Сообщение yiijeka » 2015.11.19, 10:59

Shoe123 писал(а):почему при считывании записи через DAO у нас все поля модели имеют тип данных string? Как с этим бороться? Спасибо!
На yii2 правда тестировал:

Код: Выделить всё

sudo apt-get install php5-mysqlnd
sudo service apache2 restart

Код: Выделить всё

$ php -i | grep "Client API version"
Client API version => mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $
Client API version => mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $
 
а было

Код: Выделить всё

 $ php -i | grep "Client API version"
Client API version => 5.5.44
Client API version => 5.5.44
Далее:

Код: Выделить всё

  $pdo = Yii::$app->db->pdo;
        $pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);

        $row = $pdo->query(
            "SELECT * FROM indication"
        )->fetchAll(\PDO::FETCH_NUM);
        var_dump($row);die();
array (size=885)
  0 => 
    array (size=23)
      0 => int 6     
  1 =>

а было

 array (size=885)
  0 => 
    array (size=23)
      'id' => string '0' (length=1)


$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false); обязательно

Ответить