【问题标题】:pdo - Call to a member function prepare() on a non-object [duplicate]pdo - 在非对象上调用成员函数 prepare() [重复]
【发布时间】:2011-07-17 19:12:36
【问题描述】:

此代码得到错误

致命错误:在非对象上调用成员函数 prepare() C:\Users\fel\VertrigoServ\www\login\validation.php 在第 42 行

代码:

   function repetirDados($email) {
        if(!empty($_POST['email'])) {

            $query = "SELECT email FROM users WHERE email = ?";

            $stmt = $pdo->prepare($query); // error line: line 42

            $email = mysql_real_escape_string($_POST['email']);

            $stmt->bindValue(1, $email);

            $ok = $stmt->execute();

            $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

            if ($results == 0) {
                return true;
            } else {
                echo '<h1>something</h1>';
                return false;
            }
        }
    }

可能的原因是什么? 另一个问题mysql_num_rows 等价于什么?对不起,我是 pdo 的新手

【问题讨论】:

  • PDO 作为 quote 函数来转义值,是否打算使用 mysql_real_escape_string 代替?
  • 是的,这是本意。功能是什么?谢谢
  • 此外 - 我认为 PDOStatement::bindValue 会自动引用值(与 PDOStatement::execute 相同),所以我猜你不需要再次转义它?

标签: php pdo


【解决方案1】:

您也可能会从仍处于活动状态的活动、无缓冲查询中收到此错误。

所以,在第 41 行,

$stmt = null;

【讨论】:

    【解决方案2】:

    关于 PDO 中 mysql_num_rows 的等价物基本上是 FETCH_NUM 它返回所选行的索引号。

    【讨论】:

      【解决方案3】:

      您可以在同一个 php 页面中创建一个数据库连接函数并随时调用该函数。作为,

      public function connection()
      {
          $dbc = new PDO("mysql:host=localhost;dbname=chat","root","");
      } 
      public function1()
      {
         this->connection();
         // now you have the connection.. now, time for to do some query..
      }
      
      public function2()
      {
        this->connection();
      // now do query stuffs..
      }
      

      或者你可以简单地在每次需要时在该页面中编写数据库连接行。作为,

      public function a()
      { // connecting DB for this function a only...
        $dbc = new PDO("mysql:host=localhost;dbname=chat","root","");
        // bla bla bla...
      }
      public function b()
      {  // connecting DB for this function b only...
         $dbc = new PDO("mysql:host=localhost;dbname=chat","root","");
         // abra ke dabra... boom
      }
      

      【讨论】:

        【解决方案4】:

        $pdo 对象不在您的函数范围内。

        【讨论】:

          【解决方案5】:

          是的,我也学过这个,你需要在函数内部打开数据库连接。如果我在调用函数之前打开,我假设与数据库的连接将在函数内部打开,但不是。所以:

          function whatever(){ 
            //OPEN DB CONNECTION
          
            CODE
          
            //CLOSE DB
          return whateverValue;
          } 
          

          【讨论】:

            【解决方案6】:

            我遇到了同样的错误:然后我看到我在关闭 PDO 连接后打电话给我的班级。

            【讨论】:

              【解决方案7】:

              @Anvd 。我遇到了同样的问题,但我确实通过在同一页面中连接数据库来解决它,而不仅仅是包含连接页面。它对我有用

              <?php
              try {
              $pdo = new PDO('mysql:host=localhost;dbname=tish_database;charset=utf-8','root','');
              
              } catch(PDOException $e){
              echo 'Connection failed'.$e->getMessage();
              }
              
              ?>
              

              【讨论】:

              • @Your Common Sense 请用正确的方式联系我
              【解决方案8】:

              $pdo 未定义。您没有在函数内声明它,也没有作为参数传入。

              您需要将它传入(好),或者在全局命名空间中定义它并通过将global $pdo 放在顶部(坏)使其可用于您的函数。

              【讨论】:

              • 大部分示例总是放在顶部新的 pdo 和连接设置中,我认为这就是你所说的(坏的)。和替代方案?一个(好)
              • @Fel 使用全局变量通常被认为是一种不好的做法。可以这么说,它们导致代码极难维护且极易出错。任何建议使用全局$pdo 对象的代码都可能只是示例 代码。你当然不应该在设计你的程序时让一个全局的$pdo 对象代表你的代码中有多少不同的部分正在访问数据库。
              • @meagar 你有什么建议我不让它成为一个全局变量的例子会让我更容易理解你的意思
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-07-31
              • 1970-01-01
              • 2015-04-29
              • 1970-01-01
              • 2015-12-30
              相关资源
              最近更新 更多