2011-03-17 18 views
14

Este código conseguir un error:DOP - Llamar a una función miembro prepare() en un no-objeto

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

CÓDIGO:

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; 
      } 
     } 
    } 

¿Cuál es la posible causa? Otra pregunta, ¿Cuál es el equivalente a mysql_num_rows? lo siento, soy novato con DOP

+0

'' PDO' como una función quote' para escapar de los valores, es la intención de que se utiliza 'mysql_real_escape_string' en su lugar? – Laimoncijus

+0

sí, es la intención. ¿Cuál es la función? Además, gracias – anvd

+1

- creo que 'PDOStatement :: bindValue' hace valor de cotización de forma automática (del mismo modo que' PDOStatement :: execute' hace), así que yo creo que no es necesario para escapar de nuevo? – Laimoncijus

Respuesta

20

$pdo no está definido. No lo está declarando dentro de la función, y no se está pasando como un argumento.

Debe pasarlo (bien) o definirlo en el espacio de nombre global y ponerlo a disposición de su función colocando global $pdo en la parte superior (incorrecta).

+1

la mayoría de los ejemplos siempre se ponen en la parte superior de la nueva pdo y la configuración de conexión, creo que esto es lo que usted llama (mal). Y la alternativa?a (bueno) – anvd

+1

@Fel El uso de variables globales generalmente se considera una mala práctica. Baste decir que conducen a un código que es extremadamente difícil de mantener y muy propenso a errores. Cualquier código que sugiera el uso de un objeto global '$ pdo' probablemente solo sea código de * muestra *. Ciertamente no deberías diseñar tu programa para que un objeto global '$ pdo' sea la cantidad de partes diferentes de tu código que están accediendo a la base de datos. – meagar

+0

@meagar, ¿qué sugieres que haga para no convertirlo en una variable global? Un ejemplo me haría más fácil entender lo que quieres decir – Giant

2

El objeto $pdo no está en su alcance dentro de su función.

0

También puede recibir este error de consultas activas, sin búfer todavía activos.

así, en la línea 41,

$stmt = null; 
0

@Anvd. Tuve el mismo problema pero lo resolví conectando la base de datos en la misma página no solo para incluir la página de coonnecting. Funcionó para mí

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

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

?> 
+1

Así que lo hiciste mal –

+0

@ Tu sentido común, por favor, conéctame de manera correcta – humphrey

0

Me estaba dando el mismo error: Entonces vi que llamé a mi clase después de haber cerrado la conexión PDO.

0

Sí, también he aprendido de la manera difícil, es necesario abrir la conexión de base de datos dentro de la función. Supuse que la conexión al DB se abriría dentro de la función si abría antes de llamar a la función, pero no. Por lo tanto:

function whatever(){ 
    //OPEN DB CONNECTION 

    CODE 

    //CLOSE DB 
return whateverValue; 
} 
4

Usted puede hacer una función de conexión de base de datos en la misma página php & llamada que funcione siempre que lo desee. Como,

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.. 
} 

O, simplemente, simplemente hay que escribir la línea de conexión de base de datos en esa página cada vez que lo necesite. Como,

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

probar este código

$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 votos para esta respuesta parecen muy sospechosos. –

1

En lo que respecta al equivalente de mysql_num_rows en DOP está básicamente FETCH_NUM que devuelve un número de índice de la fila seleccionada.

Cuestiones relacionadas