Jump to content
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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

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.