代码之家  ›  专栏  ›  技术社区  ›  sqram

PDO对两个非常相似的查询的作用不同

  •  2
  • sqram  · 技术社区  · 15 年前

    以下代码块工作正常(无错误)

    $query = "select * from users where username = ?";
    $statement = $sql->prepare($query);
    echo gettype($statement); // -- This returns 'object'
    $statement->bindParam(1, $username);
    

    以下给出: 致命错误:在/file.php第39行的非对象上调用成员函数bindparam()。

    $email = 'fake@email.com';
    $query = "select * from users where email = ?";
    $statement = $sql->prepare($query);
    echo gettype($statement); // -- this returns 'boolean'
    $statement->bindParam(1, $email); // -- this is line 39.
    

    现在这很奇怪。

    在我的本地机器和远程主机上,这从来都不是问题。

    这个错误只会出现在这个月我正在尝试的新托管公司上。当他们编译PHP时,它可以是配置参数吗?

    --------编辑------- 当我还在努力找出问题所在时,我发现了这一点。

    $query = "select userID, username from users";
    $statement = $sql->prepare($query);    
    $statement->execute();
    $r = $statement->fetchAll(PDO::FETCH_ASSOC);
    
    // display # of rows
    echo "Rows returned: " . $statement->rowCount();
    
    // display results array
    echo '<pre>'; print_r($r); echo '</pre>'; 
    

    在服务器上,我

    Rows returned: 4
    
    Array
    (
        [0] => Array
            (
                [userID] => 1
                [username] => lyrae
            )
    
        [1] => Array
            (
                [userID] => 2
                [username] => jproffer
            )
    
        [2] => Array
            (
                [userID] => 3
                [username] => king
            )
    
        [3] => Array
            (
                [userID] => 4
                [username] => gergy
            )
    
    )
    

    这是正确的。表示返回4行并显示结果数组。但是在另一台服务器上,我

    Rows returned: 0
    
    Array
    (
        [0] => Array
            (
                [userID] => 1
                [username] => lyrae
            )
    
        [1] => Array
            (
                [userID] => 2
                [username] => jproffer
            )
    
        [2] => Array
            (
                [userID] => 3
                [username] => king
            )
    
        [3] => Array
            (
                [userID] => 4
                [username] => gergy
            )
    
    )
    

    因此,PDostatement::RowCount()似乎在服务器上不起作用,但在另一个服务器上起作用。

    6 回复  |  直到 15 年前
        1
  •  2
  •   jmucchiello    15 年前

    阅读此: $statement->closeCursor()

    pdoStatement::closeCursor()释放到服务器的连接,以便可以发出其他SQL语句

    您在服务器上使用的数据库是否与您所说的没有此问题的数据库相同?

        2
  •  1
  •   sqram    15 年前

    找到了问题的解决方案。

    这是整个代码块。

    // check if username exists
    $query = "select * from users where username = ?";
    $statement = $sql->prepare($query);
    $statement->bindParam(1, $username);
    $statement->execute();
    
    
    // check if email exists
    $sql2 = new PDO('mysql:host=localhost; dbname=db', 'username', 'pw');
    $query = "select * from users";
    $statement = $sql2->prepare($query);
    echo gettype($statement);
    #$statement->bindParam(1, $email);
    

    所以出于某种原因,我必须创建一个新的PDO实例。奇怪的是,在另外两台服务器上,我不必这样做。

    在进一步研究之后,我发现pdo::prepare引发了pdoexecution。

    这里是:

    SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
    
    Array
    (
        [0] => HY000
        [1] => 2014
        [2] => Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
    )
    

    也许它将来会帮助别人:)

        3
  •  0
  •   Jon Onstott    15 年前

    $email未定义吗?你也可以试试var-dump($email),看看它说了什么。祝你好运。

        4
  •  0
  •   DisgruntledGoat    15 年前

    你试过把 $email= 线以下 bindParam (但在执行之前)? 宾德帕兰 通过引用传递参数,以便可以作为查询执行、更改变量的值并再次执行。

    我认为这可能是一个PHP设置错误。我听过有人说PDO在php 5.3之前有很多bug,所以也许你可以看看是否可以让php升级到最新版本?

    您是否还尝试交换这两个查询?在运行一个查询后,可能有什么东西中断了。

        5
  •  0
  •   Vladislav Rastrusny    15 年前

    我建议您使用:

    $email = 'fake@email.com';
    $query = "select * from users where email = ?";
    $statement = $sql->prepare($query);
    $statement->execute(array($email));
    

    此处不需要使用bindparam。

        6
  •  0
  •   user185673    15 年前

    我也有同样的问题 echo“返回的行:”。$statement->rowcount();

    我有-1行,lol。我的数据库是Informix和搜索我找到的网络 rowCount();只返回由相应pDestatement对象执行的delete、insert或update语句中受影响的行。

    对于select语句,您需要使用函数 $statement->fetchcolumn();

    在这里阅读: http://www.phpbuilder.com/manual/en/function.pdostatement-rowcount.php

    推荐文章