Ir para o conteúdo
  • 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

Mensagens Recomendadas

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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.