Не выполняется запрос

Аватар пользователя dennis60 dennis60 6 апреля 2012 в 14:23

Написал запрос проще не бывает:

<?php
$nodes 
db_select('node''n')
  ->
fields('n', array('nid''title'))
  ->
condition('n.type''page')
  ->
condition('n.uid'1)
  ->
execute();

print_r($nodes);
?>

В итоге вместо результата получаю следующее:

<?php
DatabaseStatementBase Object
(
    [
dbh] => DatabaseConnection_mysql Object
        
(
            [
shutdownRegistered:protected] => 
            [
target:protected] => default
            [
key:protected] => default
            [
logger:protected] => 
            [
transactionLayers:protected] => Array
                (
                )

            [

driverClasses:protected] => Array
                (
                    [
SelectQuery] => SelectQuery
                
)

            [

statementClass:protected] => DatabaseStatementBase
            
[transactionSupport:protected] => 1
            
[transactionalDDLSupport:protected] => 
            [
temporaryNameIndex:protected] => 0
            
[connectionOptions:protected] => Array
                (
                    [
database] => prices
                    
[username] => IShop
                    
[password] => 
                    [
host] => localhost
                    
[port] => 
                    [
driver] => mysql
                    
[prefix] => Array
                        (
                            [default] => 
                        )

                )

            [

schema:protected] => 
            [
prefixes:protected] => Array
                (
                    [default] => 
                )

            [

prefixSearch:protected] => Array
                (
                    [
0] => {
                    [
1] => }
                )

            [

prefixReplace:protected] => Array
                (
                    [
0] => 
                    [
1] => 
                )

        )

    [

queryString] => SELECT n.nid AS nidn.title AS title
FROM 
node n
WHERE  
(n.type = :db_condition_placeholder_0) AND (n.uid = :db_condition_placeholder_1
)
?>

Кто знает, почему не выполняется запрос?

Комментарии

Аватар пользователя drupby drupby 6 апреля 2012 в 14:51

"Shok211" wrote:
<?php

  ->........
  ->execute();
  ->fetchAllAssoc('uid');

?>


<?php

  ->........
  ->execute();
  ->fetchAllAssoc('nid');

?>

Аватар пользователя drupby drupby 6 апреля 2012 в 15:12

$nodes = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->condition('n.type', 'page')
->condition('n.uid', 1);
$result=$nodes->execute()->fetchAllAssoc('nid');

print_r($result);

А у вас есть вообще ноды типа "page" созданные uid=1 ?

Аватар пользователя drupby drupby 6 апреля 2012 в 15:18

А вообще в данном случае более правильно

$nodes = db_select('node', 'n')
  ->fields('n', array('nid', 'title'))
  ->condition('n.type', 'page')
  ->condition('n.uid', 1)
  ->execute()
  ->fetchAllKeyed();
print_r($nodes);
Аватар пользователя dennis60 dennis60 6 апреля 2012 в 15:24

"drupby" wrote:
А у вас есть вообще ноды типа "page" созданные uid=1 ?

Одна есть точно.

"drupby" wrote:
$nodes = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->condition('n.type', 'page')
->condition('n.uid', 1)
->execute()
->fetchAllKeyed();
print_r($nodes);

Так тоже пустой массив.

Аватар пользователя dennis60 dennis60 6 апреля 2012 в 15:39

"drupby" wrote:
SELECT nid,title
FROM node
WHERE type='page' AND uid=1

С таким запросом одна запись нашлась.

Аватар пользователя dennis60 dennis60 6 апреля 2012 в 15:48

Через класс EntityFieldQuery запросы работают, через db_select нет.

Что-то глобально сделано не так. В запросе все правильно. Записи такие в базе есть...

Аватар пользователя drupby drupby 6 апреля 2012 в 15:50

"dennis60" wrote:
Что-то глобально сделано не так.

А запрос в функции находится или отдельно?

Аватар пользователя dennis60 dennis60 6 апреля 2012 в 15:57
<?php
$nodes 
db_select('node''n')
->
fields('n', array('nid''title'))
->
condition('n.type''page')
->
condition('n.uid'1)
;
print_r($nodes);
?>

Если сделать так, то создается объект SelectQuery. В нем заданная структура.
Получается, что не выполняется execute().

Аватар пользователя drupby drupby 6 апреля 2012 в 16:55

"Chyvakoff" wrote:

$nodes = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->condition('n.type', 'page')
->condition('n.uid', 1);
$res=$nodes->execute();
 
while($rec=$res->fetchAssoc()){
echo $rec['nid'].'-'.$rec['title'];
}

$nodes = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->condition('n.type', 'page')
->condition('n.uid', 1)
->execute()
->fetchAllKeyed();
print_r($nodes);

в таком случае тоже выполнилось бы - здесь не в этом дело

Аватар пользователя dennis60 dennis60 6 апреля 2012 в 19:31

"Chyvakoff" wrote:

<?php
$nodes 
db_select('node''n')
  ->
fields('n', array('nid''title'))
  ->
condition('n.type''page')
  ->
condition('n.uid'1);
$res=$nodes->execute();
?>

После выполнения этого кода в переменной $res у меня вместо результата следующее:

<?php
DatabaseStatementBase Object
(
    [
dbh] => DatabaseConnection_mysql Object
        
(
            [
shutdownRegistered:protected] => 
            [
target:protected] => default
            [
key:protected] => default
            [
logger:protected] => 
            [
transactionLayers:protected] => Array
                (
                )

            [

driverClasses:protected] => Array
                (
                    [
SelectQuery] => SelectQuery
                
)

            [

statementClass:protected] => DatabaseStatementBase
            
[transactionSupport:protected] => 1
            
[transactionalDDLSupport:protected] => 
            [
temporaryNameIndex:protected] => 0
            
[connectionOptions:protected] => Array
                (
                    [
database] => ****
                    [
username] => ****
                    [
password] => ****
                    [
host] => localhost
                    
[port] => 
                    [
driver] => mysql
                    
[prefix] => Array
                        (
                            [default] => 
                        )

                )

            [

schema:protected] => 
            [
prefixes:protected] => Array
                (
                    [default] => 
                )

            [

prefixSearch:protected] => Array
                (
                    [
0] => {
                    [
1] => }
                )

            [

prefixReplace:protected] => Array
                (
                    [
0] => 
                    [
1] => 
                )

        )

    [

queryString] => SELECT n.nid AS nidn.title AS title
FROM 
node n
WHERE  
(n.type = :db_condition_placeholder_0) AND (n.uid = :db_condition_placeholder_1
)
?>
Аватар пользователя Chyvakoff Chyvakoff 6 апреля 2012 в 20:55

dennis60 wrote:
"Chyvakoff" wrote:

<?php
$nodes 
db_select('node''n')
  ->
fields('n', array('nid''title'))
  ->
condition('n.type''page')
  ->
condition('n.uid'1);
$res=$nodes->execute();
?>

После выполнения этого кода в переменной $res у меня вместо результата следующее:

<?php
DatabaseStatementBase Object
(
    [
dbh] => DatabaseConnection_mysql Object
        
(
            [
shutdownRegistered:protected] => 
            [
target:protected] => default
            [
key:protected] => default
            [
logger:protected] => 
            [
transactionLayers:protected] => Array
                (
                )

            [

driverClasses:protected] => Array
                (
                    [
SelectQuery] => SelectQuery
                
)

            [

statementClass:protected] => DatabaseStatementBase
            
[transactionSupport:protected] => 1
            
[transactionalDDLSupport:protected] => 
            [
temporaryNameIndex:protected] => 0
            
[connectionOptions:protected] => Array
                (
                    [
database] => ****
                    [
username] => ****
                    [
password] => ****
                    [
host] => localhost
                    
[port] => 
                    [
driver] => mysql
                    
[prefix] => Array
                        (
                            [default] => 
                        )

                )

            [

schema:protected] => 
            [
prefixes:protected] => Array
                (
                    [default] => 
                )

            [

prefixSearch:protected] => Array
                (
                    [
0] => {
                    [
1] => }
                )

            [

prefixReplace:protected] => Array
                (
                    [
0] => 
                    [
1] => 
                )

        )

    [

queryString] => SELECT n.nid AS nidn.title AS title
FROM 
node n
WHERE  
(n.type = :db_condition_placeholder_0) AND (n.uid = :db_condition_placeholder_1
)
?>

Я же дописал ниже следующее

while($rec=$res->fetchAssoc()){
        echo $rec['nid'].'-'.$rec['title'];
}
Аватар пользователя andreypaa andreypaa 6 апреля 2012 в 22:06

может попробовать в условия прописать в виде: ->condition('n.uid', 1, '=');
т.е. задать явно аргумент какое именно условие и все должно получиться

Аватар пользователя dennis60 dennis60 8 апреля 2012 в 12:06

"andreypaa" wrote:
может попробовать в условия прописать в виде: ->condition('n.uid', 1, '=');
т.е. задать явно аргумент какое именно условие и все должно получиться

Спасибо огромное!!! Все получилось!

Хотя странно все это. В доке написано, что если в condition нет третьего аргумента, то он по умолчанию "=".

Аватар пользователя Chyvakoff Chyvakoff 9 апреля 2012 в 9:08

"dennis60" wrote:
В доке написано, что если в condition нет третьего аргумента, то он по умолчанию "="

Совершенно верно..

Аватар пользователя Chyvakoff Chyvakoff 1 июня 2012 в 9:08

Ну если вы в condition третьим аргументом ничего не введете-то там будет null

public function condition($field, $value = NULL, $operator = NULL) {
  $this->where->condition($field, $value, $operator);
  return $this;
}

Да,вот этот код,и null в нём не имеет прямого отношения к знаку равенства.
А вот тут написано:

public function condition($field, $value = NULL, $operator = NULL) {
  if (!isset($operator)) {
    if (is_array($value)) {
      $operator = 'IN';
    }
    elseif (!isset($value)) {
      $operator = 'IS NULL';
    }
    else {
      $operator = '='; //вот тут ставится дефолтный знак =
    }
  }
  $this->conditions[] = array(
    'field' => $field,
    'value' => $value,
    'operator' => $operator,
  );

  $this->changed = TRUE;

  return $this;
}