Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

RuiGomes

PDO - Call to a member function prepare() on a non-object

Recommended Posts

RuiGomes

Estou a desenvolver um projecto e pela primeira vez aventurei-me no PDO (sempre usei mysql normal)..

No process.php (onde processo os dados de um form) faço:

<?php
require_once 'include/config.php';
require_once 'include/functions.php';

if($_POST['type']=='register') {
addUser($_POST['username'], $_POST['pass1'], $_POST['pass2'], $_POST['email']);
}
?>

No config.php só estão as variáveis da base de dados.

No functions.php tenho o seguinte:

try {
  # MySQL with PDO_MYSQL
  $DBH = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
}
catch(PDOException $e) {
    echo $e->getMessage();
}

function addUser($username, $pass1, $pass2, $email) {
$error = '';
'verificacoes e etc...'

$hash = hash('sha256', $pass1);
$salt = createSalt();
$hash = hash('sha256', $salt . $hash);

$STH = $DBH->prepare("INSERT INTO users (username, password, salt, email, registo) value (:username, :password, :salt, :email, :time)");  
$STH->bindParam(':username', $username);
$STH->bindParam(':password', $password);
$STH->bindParam(':salt', $salt);
$STH->bindParam(':email', $email);
$STH->bindParam(':time', time());
$STH->execute();

return $error;
}

Isto dá-me erro sempre que uso o $DBH->prepare Call to a member function prepare() on a non-object.

O $DBH está definido fora da função, por isso penso que seja acessível.. Se alguém me puder dar uma ajuda agradeço, para não ter que voltar ao mysql normal :wallbash:

Share this post


Link to post
Share on other sites
pmg

Com o PDO(, objectos, try/catch, &c) nao sei ... mas, dentro da funcao, precisas de globalizar as variaveis

http://pt2.php.net/manual/en/language.variables.scope.php

function addUser($username, $pass1, $pass2, $email) {
        global $DBH;

Ou, melhor ainda, usa um objecto passado como parametro ... ou faz a funcao ser um metodo duma classe que tem a ligacao que pretendes ... ...


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
RuiGomes

Muito obrigado, resolveu o problema. No entanto, agora estou com outro problema  :wallbash:

A função não faz nada :\

Isto é, está a fazer as verificações, não dá nenhum erro, corre a parte de introduzir na base de dados, mas vou à BD verificar e não está lá nada :\

O código que não funciona é o seguinte:

$STH = $DBH->prepare("INSERT INTO users (username, password, salt, email, time) value (:username, :password, :salt, :email, :time)");  
	$STH->bindParam(':username', $username);
	$STH->bindParam(':password', $password);
	$STH->bindParam(':salt', $salt);
	$STH->bindParam(':email', $email);
	$STH->bindParam(':time', $time);
	$STH->execute();
	return 'registado';

Agradeço qualquer ajuda!

Share this post


Link to post
Share on other sites
pmg

oops ... thanks mjamado

value
values

Até o GeSHi sabe que é values :-)

... mas foi preciso especificar a linguagem como "sql"

Além disso deves verificar o resultado to "prepare": http://pt.php.net/manual/en/pdo.prepare.php

Se o resultado for FALSE tens um erro de SQL

// ... prepare
if ($STH == false) /* erro de SQL */;
// ... execute


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
mjamado

value
values

Até o GeSHi sabe que é values :-)

... mas foi preciso especificar a linguagem como "sql"

Em MySQL, VALUE é válido. É um alias de VALUES.

RuiGomes, faz

print_r($STH->errorInfo());

... para veres que erro está a dar.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
RuiGomes

value
values

Até o GeSHi sabe que é values :-)

... mas foi preciso especificar a linguagem como "sql"

Além disso deves verificar o resultado to "prepare": http://pt.php.net/manual/en/pdo.prepare.php

Se o resultado for FALSE tens um erro de SQL

// ... prepare
if ($STH == false) /* erro de SQL */;
// ... execute

Obrigado pelos tips, já estou a usar essa verificação  :)

Em MySQL, VALUE é válido. É um alias de VALUES.

RuiGomes, faz

print_r($STH->errorInfo());

... para veres que erro está a dar.

Pensei que o PDO era como o MYSQL, se houvesse a falha ele notificava logo. Afinal foi nabice minha, enganei-me a escrever um variável nos binds. Obrigado pelo comando!  ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.