2011-03-17 120 views
14

此代码得到错误上:PDO - 调用一个成员函数准备()非对象

Fatal error: Call to a member function prepare() on a non-object in C:\Users\fel\VertrigoServ\www\login\validation.php on line 42

CODE:

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新手

+0

'PDO'作为'quote'函数来转义值,它是否打算使用'mysql_real_escape_string'来代替? – Laimoncijus 2011-03-17 22:46:46

+0

是的意图。有什么功能?谢谢 – anvd 2011-03-17 22:48:10

+1

此外 - 我认为'PDOStatement :: bindValue'确实会自动引用值(与'PDOStatement :: execute'一样),所以我的猜测是你不需要再次转义它? – Laimoncijus 2011-03-17 22:54:29

回答

20

$pdo未定义。你没有在函数内部声明它,并且它没有被作为参数传入。

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

+1

大部分的例子总是放在顶部的新的pdo和连接​​设置,我认为这就是你所说的(坏)。而替代方案?一个(好的) – anvd 2011-03-17 22:50:11

+1

@Fel使用全局变量通常被认为是一种不好的做法。只要说一句,它们就会导致代码难以维护,而且很容易出错。任何建议使用全局'$ pdo'对象的代码可能仅仅是* sample *代码。你当然不应该设计你的程序,以便全局'$ pdo'对象是你的代码有多少不同的部分访问数据库。 – meagar 2012-09-05 20:16:08

+0

@meagar你建议我做什么不要让它成为一个全局变量一个例子会让我更容易理解你的意思 – Giant 2014-10-07 04:29:50

2

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

0

您还可能会从活动的,未缓冲的查询仍然有效。

所以,在线41上,

$stmt = null; 
0

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

<?php 
try { 
$pdo = new PDO('mysql:host=localhost;dbname=tish_database;charset=utf-8','root',''); 

} catch(PDOException $e){ 
echo 'Connection failed'.$e->getMessage(); 
} 

?> 
+1

所以你做错了 – 2013-02-15 08:36:43

+0

@你的常识请用正确的方式勾搭我 – humphrey 2013-02-15 08:54:25

0

我得到了同样的错误:然后,我看到我关闭PDO连接后打电话给我的课。

0

是的,我也学会了这个难题,你需要在函数内部打开DB连接。如果我在调用该函数之前打开了该函数,我认为与该数据库的连接将在函数内部打开,但不会。所以:

function whatever(){ 
    //OPEN DB CONNECTION 

    CODE 

    //CLOSE DB 
return whateverValue; 
} 
4

您可以在同一& 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 
} 
-1

试试这个代码

$query =$pdo->prepare("SELECT email FROM users WHERE email = ?"); 

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

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

$ok = $stmt->execute(); 

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

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

+ 3票对这个答案看起来很可疑。 – 2016-03-08 06:02:24

1

问候mysql_num_rows的PDO相当于基本上FETCH_NUM它返回选定行的索引号。

相关问题