Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou apanhando a duas semanas com este problema e já vasculhei toda a net e não encontro solução.
A única coisa que pretendo fazer é exibir os dados de uma tabela.
Ao executar o código abaixo recebo o erro "Fatal error: Class 'MDB2' not found in C:\xampp\htdocs\estudo\pear\mdb2.php on line 19"
<?php
# Inclue o arquivo MDB2.php responsável pela conexão
require_once 'MDB2.php';
# Dados da conexão
$bd = 'mysql';
$user = 'root';
$pass = '';
$host = 'localhost';
$db_name = 'MDB2_DB';
# Forma a string de conexão
$dsn = "$bd://$user:$pass@$host/$db_name";
# Conecta ao banco de dados
$mdb2 =& MDB2::factory($dsn);
$sql = "SELECT * FROM products";
$resultset = $mdb2->query($sql);
while($row = $resultset->fetchRow(MDB2_FETCHMODE_ASSOC)) {
$campo1 = $row["firstname"];
$campo2 = $row["mainname"];
echo "$campo1 $campo2 <br />";
}
?>
Obrigado pela atenção!
Wanderson, estou usando o XAMPP em minha máquina.
O pear não deveria ser carregado automaticamente o chamando assim?
require_once 'MDB2.php';
Bem, mesmo sem entender o porque não chamou, forcei o carregamento direcionando diretamente a biblioteca do Pear.
require_once '../../../php/PEAR/MDB2.php';
Agora encontrou a classe mas está me exibindo os seguintes erros
> Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\MDB2.php on line 390
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\MDB2.php on line 1885
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\MDB2.php on line 2572
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\MDB2.php on line 2595
Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\MDB2.php on line 2940
Strict Standards: Declaration of MDB2_Driver_Common::raiseError() should be compatible with that of PEAR::raiseError() in C:\xampp\php\PEAR\MDB2.php on line 990
Strict Standards: Non-static method MDB2::factory() should not be called statically in C:\xampp\htdocs\estudo\pear\mdb2.php on line 19
Strict Standards: Non-static method MDB2::parseDSN() should not be called statically in C:\xampp\php\PEAR\MDB2.php on line 376
Strict Standards: Non-static method MDB2::loadClass() should not be called statically in C:\xampp\php\PEAR\MDB2.php on line 385
Strict Standards: Non-static method MDB2::classExists() should not be called statically in C:\xampp\php\PEAR\MDB2.php on line 327
Strict Standards: Non-static method MDB2::fileExists() should not be called statically in C:\xampp\php\PEAR\MDB2.php on line 335
Strict Standards: Non-static method MDB2::raiseError() should not be called statically in C:\xampp\php\PEAR\MDB2.php on line 340
Strict Standards: Non-static method PEAR::raiseError() should not be called statically in C:\xampp\php\PEAR\MDB2.php on line 574
Strict Standards: Non-static method MDB2::errorMessage() should not be called statically, assuming $this from incompatible context in C:\xampp\php\PEAR\MDB2.php on line 972
Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\xampp\php\PEAR\MDB2.php on line 743
Strict Standards: Non-static method PEAR::getStaticProperty() should not be called statically, assuming $this from incompatible context in C:\xampp\php\PEAR\PEAR.php on line 871
Strict Standards: Non-static method PEAR::isError() should not be called statically in C:\xampp\php\PEAR\MDB2.php on line 386
Fatal error: Call to undefined method MDB2_Error::query() in C:\xampp\htdocs\estudo\pear\mdb2.php on line 23
...
Fiz novo teste aqui.
Em vez de usar a biblioteca MDB2 que vem instalada no XAMPP, baixei a mesma do site do PEAR "http://pear.php.net/package/MDB2/download/" e coloquei no diretório de minha aplicação.
Agora o erro exibido é outro.
Strict Standards: Non-static method MDB2::raiseError() should not be called statically in C:\xampp\htdocs\estudo\pear\lib_pear\MDB2.php on line 340
Strict Standards: Non-static method PEAR::raiseError() should not be called statically in C:\xampp\htdocs\estudo\pear\lib_pear\MDB2.php on line 577
Strict Standards: Non-static method MDB2::errorMessage() should not be called statically, assuming $this from incompatible context in C:\xampp\htdocs\estudo\pear\lib_pear\MDB2.php on line 977
Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\xampp\htdocs\estudo\pear\lib_pear\MDB2.php on line 746
Strict Standards: Non-static method PEAR::getStaticProperty() should not be called statically, assuming $this from incompatible context in C:\xampp\php\PEAR\PEAR.php on line 871
Strict Standards: Non-static method PEAR::isError() should not be called statically in C:\xampp\htdocs\estudo\pear\lib_pear\MDB2.php on line 381
Strict Standards: Only variables should be assigned by reference in C:\xampp\htdocs\estudo\pear\mdb2.php on line 20
Fatal error: Call to undefined method MDB2_Error::query() in C:\xampp\htdocs\estudo\pear\mdb2.php on line 24
Alguém já passou por isto?
Olá amigo, boa tarde. Esse seu MDB2 é responsável pela conexão com o banco de dados do seu site?
>
Olá amigo, boa tarde. Esse seu MDB2 é responsável pela conexão com o banco de dados do seu site?
Wanderson, estou usando este código para conectar com meu banco de dados sim.
Como já mencionei, estou usando o XAMPP localmente para isso.
O meu código é
<?php
# Inclue o arquivo MDB2.php responsável pela conexão
// require_once '../../../php/PEAR/MDB2.php';
require_once 'lib_pear/MDB2.php';
# Dados da conexão
$bd = 'mysql';
$user = 'root';
$pass = '';
$host = 'localhost';
$db_name = 'estudo_php_oo';
# Forma a string de conexão
$dsn = "$bd://$user:$pass@$host/$db_name";
# Conecta ao banco de dados
$mdb2 =& MDB2::factory($dsn);
$sql = "SELECT * FROM products";
$resultset = $mdb2->query($sql);
while($row = $resultset->fetchRow(MDB2_FETCHMODE_ASSOC)) {
$campo1 = $row["firstname"];
$campo2 = $row["mainname"];
echo "$campo1 $campo2 <br />";
}
?>O que me chama atenção é este erro
Strict Standards: Only variables should be assigned by reference in C:\xampp\htdocs\estudo\pear\mdb2.php on line 20
Que refere-se a este trecho do código
# Conecta ao banco de dados
$mdb2 =& MDB2::factory($dsn);
O erro não é referente a este trecho do código, o erro diz:
As variáveis não podem ser passadas por referência. Isso ocorre, pela razão de a sua versão do PHP ser mais de 5.3, daí ocorre este erro. O erro deve estar em algum lugar que você utilizar várias funções ao mesmo tempo em uma variável, por exemplo:
$extensao = strtolower(end(explode(".", $imagem['name'])));
O código acima, irá gerar o mesmo erro, e a solução para ele seria:
$extensao = explode(".", $imagem['name']);
$extensao = end($extensao);
$extensao = strtolower($extensao);@ezequielg, A PEAR está corretamente instalada???
Inicie um prompt de comando - Iniciar > digite cmd > clique em prompt de comando - e digite pear seguido de enter.
Verifique se há saída da ajuda da PEAR.
Wanderson, o código que estou usando está no post #5.
Note que não estou usando funções em cadeia.
Na verdade, não estou usando função alguma a não ser a do próprio PEAR.
Evandro, fiz conforme você falou
Inicie um prompt de comando - Iniciar > digite cmd > clique em prompt de comando - e digite pear seguido de enter.
Nada aconteceu.
Evandro, fiz conforme você falou porém direto no diretório do PEAR.
O caminho que usei foi esse
C:\xampp\php>
Dentro deste diretório digitei "pear" e pressionei "enter".
Aí sim me foi listado todos os comandos possíveis do pear via prompt de command
Era isso?
...
Estava lendo alguns artigos e encontrei outra forma de conectar ao bando de dados com o MDB2 do PEAR.
Segue código
<?php
# Inclue o arquivo MDB2.php responsável pela conexão
// require_once '../../../php/PEAR/MDB2.php';
require_once ('lib_pear/MDB2.php');
# Dados da conexão
$dsn = array(
'phptype' => 'mysql',
'username' => 'root',
'password' => '',
'hostspec' => 'localhost',
'database' => 'estudo_php_oo'
);
# Conecta ao banco de dados
$mdb2 = MDB2::factory($dsn);
if(PEAR::isError($mdb2)) {
die($mdb2->getMessage());
}
# ####
$mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);
# Executando a Query
$query = "SELECT * FROM products";
$result = $mdb2->query($query);
if(PEAR::isError($result)) {
die($result->getMessage());
}
# Exibindo resultados
while($row = $result->fetchRow()) {
$campo1 = $row["firstname"];
$campo2 = $row["mainname"];
echo "$campo1 $campo2 <br />";
}
# Fecha conexão
$result->free();
?>
Mesmo assim não funcionou, olha o erro que me retorna.
Strict Standards: Non-static method MDB2::raiseError() should not be called statically in C:\xampp\htdocs\estudo\pear\lib_pear\MDB2.php on line 340
Strict Standards: Non-static method PEAR::raiseError() should not be called statically in C:\xampp\htdocs\estudo\pear\lib_pear\MDB2.php on line 577
Strict Standards: Non-static method MDB2::errorMessage() should not be called statically, assuming $this from incompatible context in C:\xampp\htdocs\estudo\pear\lib_pear\MDB2.php on line 977
Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\xampp\htdocs\estudo\pear\lib_pear\MDB2.php on line 746
Strict Standards: Non-static method PEAR::getStaticProperty() should not be called statically, assuming $this from incompatible context in C:\xampp\php\PEAR\PEAR.php on line 871
Strict Standards: Non-static method PEAR::isError() should not be called statically in C:\xampp\htdocs\estudo\pear\lib_pear\MDB2.php on line 381
Strict Standards: Non-static method PEAR::isError() should not be called statically in C:\xampp\htdocs\estudo\pear\mdb2.php on line 21
MDB2 Error: not found
Deve ser algo muito simples, porém não estou encontrando a solução.
help me please
Não sei o motivo que você está se complicando para utilizar a MDB2, o que ela faz de mais? Faça uma conexão normal
Wanderson, estou iniciando no PEAR e a primeira função que peguei para aprender é fazer conexão com banco de dados MYSQL com a classe MDB2.
Sinceramente estou ficando frustado por não conseguir apenas conectar com o data base e listar o resultado.
Algo simples.
Bom dia!
Talvez isso ajude a entender o que acontece.
No link abaixo está o arquivo que estou usando para fazer a conexão.
www.outraleitura.com.br/mdb2.zip
Alguém consegue analisar o código e verificar o erro que está acontecendo?
@ezequielg, qual a versão do PHP?
Há duas formas: A primeira é suprimir os erros de Strict Standards. A segunda é migrar da MDB2 para PDO.
MDB não tem atualizações desde agosto de 2010!
Olá Evandro!
Esconder os erros não é uma boa ideia, vou mudar para o PDO mesmo.
Irei fazer novos testes com PDO e posto aqui se der certo.
Obrigado!
Olá Evandro, comecei a usar o PDO e já deu para notar como ele é ótimo.
Estou estudando sobre transações agora e ao testar recebi o seguinte erro.
Fatal error: Uncaught exception 'PDOException' with message 'There is no active transaction'
Isso significa que meu banco de dados não está configurado para aceitar transações?
>
Olá Evandro, comecei a usar o PDO e já deu para notar como ele é ótimo.
Estou estudando sobre transações agora e ao testar recebi o seguinte erro.
Isso significa que meu banco de dados não está configurado para aceitar transações?
Lembrou de iniciar a transação???
Qual é o SGDB usado??
>
Lembrou de iniciar a transação???
Qual é o SGDB usado??
Sim iniciei a transação e estou usando o SGDB Mysql do tipo InnoDB.
Segue o código
<?php
# Data e Hora atual
$data = date("Y/m/j");
$hora = date("H:i:s");
# Abre Conexão - Verificar o erro exibido quando a senha ou login está errado
$pdo = new PDO("mysql:host=localhost;dbname=seu banco", "seu login", "sua senha");
if(!$pdo){
die('Erro ao criar a conexão');
}
$pdo->beginTransaction();/* Inicia a transação */
# Insere dados preparados - evita SQL Injection
$nome = "Rafael Wendel Pinheiro";
try{
$stmte = $pdo->prepare("INSERT INTO cliente(nome, data, hora) VALUES (:nome, :data, :hora)");
$stmte->bindParam(":nome", $nome , PDO::PARAM_STR);
$stmte->bindParam(":data", $data , PDO::PARAM_STR);
$stmte->bindParam(":hora", $hora , PDO::PARAM_STR);
$executa2 = $stmte->execute();
if($executa2){
echo '02 - Dados inseridos com sucesso <br />';
}
else{
echo '02 - Erro ao inserir os dados <br />';
}
}
catch(PDOException $e){
echo $e->getMessage();
}
# Update dados com preparados - evita SQL Injection
$id_cliente = 1;
try{
// Aqui estou simulando um erro. O nome do banco é "cliente" e não "scliente"
$stmte = $pdo->prepare("UPDATE scliente SET nome=':nome' WHERE id=':id'");
$stmte->bindParam(":nome", $data, PDO::PARAM_STR);
$stmte->bindParam(":id", $id_cliente, PDO::PARAM_INT);
$executa3 = $stmte->execute();
if($executa3){
echo '03 - Dados atualizados com sucesso <br />';
}
else{
echo '03 - Erro ao atualizar dados <br />';
}
if(!$executa3){
$pdo->rollBack(); /* Desfaz o insert em caso de erro no update */
}
}
catch(PDOException $e){
echo $e->getMessage();
}
$pdo->commit(); /* Se não houve erro nas querys, confirma os dados no banco */
?>>
Sim iniciei a transação e estou usando o SGDB Mysql do tipo InnoDB.
Estranho. Montei um teste, verifique a saída:
<?php
$hostname = 'localhost';
$username = 'root';
$password = 'root';
$database = 'teste';
$table = 'teste';
$new_line = "INSERT INTO ${table} VALUES(NULL, ?, ?);";
$get_rows = "SELECT * FROM ${table};";
$DSN = "mysql:hostname={$hostname}";
$connection = new PDO($DSN, $username, $password);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$DB = <<<SQL
DROP DATABASE IF EXISTS ${database};
CREATE DATABASE ${database};
USE ${database};
CREATE TABLE {$table}(
id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(20) NOT NULL UNIQUE,
hora TIME
);
SQL;
foreach (explode(';', $DB) as $sql) {
if (!trim($sql)) {
break;
}
$connection->exec($sql);
}
$connection->beginTransaction();
$statement = $connection->prepare($new_line);
$statement->execute(array('teste1', date('H:i:s')));
$connection->commit();
echo $connection->query($get_rows)->rowCount(), PHP_EOL;
$connection->beginTransaction();
$statement = $connection->prepare($new_line);
$statement->execute(array('teste2', date('H:i:s')));
$connection->rollBack();
$connection->beginTransaction();
$statement = $connection->prepare($new_line);
$statement->execute(array('teste3', date('H:i:s')));
$connection->commit();
var_dump($connection->query($get_rows)->fetchAll(PDO::FETCH_ASSOC));
1
array(2) {
[0] =>
array(3) {
'id' =>
string(1) "1"
'nome' =>
string(6) "teste1"
'hora' =>
string(8) "16:05:25"
}
[1] =>
array(3) {
'id' =>
string(1) "3"
'nome' =>
string(6) "teste3"
'hora' =>
string(8) "16:05:25"
}
}
EDIT:
Encontrei o erro: Quando a segunda consulta (executa3) falha, você chama o rollback, encerrando a transaction!
>
Encontrei o erro: Quando a segunda consulta (executa3) falha, você chama o rollback, encerrando a transaction!
Entendi Evandro.
Então o rollback encerra a transação fazendo-se desnecessário o commit.
Desculpe pelo erro besta e muito obrigado pela ajuda.
Assim que finalizar os scripts aqui posto para a galera que assim como eu está entrando no mundo PDO.
Boa noite galera!
Como prometi aqui está o que aprendi no estudo de PDO.
Ainda é muito pouco sei disso, mas quem sabe esse pouco pode ajudar aqueles que assim como eu estão começando.
Script para criar a tabela usada no exemplo
CREATE TABLE `cliente` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(255) DEFAULT NULL,
`data` date DEFAULT NULL,
`hora` time DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
Código php gerado no estudo
<?php
# Manual: http://www.php.net/manual/pt_BR/book.pdo.php
# Constantes pré-definidas: http://www.php.net/manual/pt_BR/pdo.constants.php
# http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use
# http://www.diogomatheus.com.br/blog/php/trabalhando-com-pdo-no-php
# http://www.infoaqui.com.br/2012/01/php-oo-implementando-o-padrao-de.html
# http://www.diogomatheus.com.br/blog/php/trabalhando-com-pdo-no-php
# http://www.rafaelwendel.com/2011/12/tutorial-pdo-php-data-object
# http://www.rafaelwendel.com/2011/12/controle-de-transacoes-no-pdo
# Data e Hora atual
$data = date("Y/m/j");
$hora = date("H:i:s");
# Abre Conexão - Verificar o erro exibido quando a senha ou login está errado
$pdo = new PDO("mysql:host=localhost;dbname=estudo_php_oo", "ezequiel", "123");
if(!$pdo){
die('Erro ao criar a conexão');
}
$pdo->beginTransaction();/* Inicia a transação */
# Insere dados preparados - evita SQL Injection
$nome = "Rafael Wendel Pinheiro";
try{
$stmte = $pdo->prepare("INSERT INTO cliente(nome, data, hora) VALUES (:nome, :data, :hora)");
$stmte->bindParam(":nome", $nome , PDO::PARAM_STR);
$stmte->bindParam(":data", $data , PDO::PARAM_STR);
$stmte->bindParam(":hora", $hora , PDO::PARAM_STR);
$executa2 = $stmte->execute();
if($executa2){
echo '02 - Dados inseridos com sucesso <br />';
}
else{
echo '02 - Erro ao inserir os dados <br />';
}
}
catch(PDOException $e){
echo $e->getMessage();
}
# Update dados com preparados - evita SQL Injection
$id_cliente = 1;
try{
$stmte = $pdo->prepare("UPDATE cliente SET nome=':nome' WHERE id=':id'");
$stmte->bindParam(":nome", $data, PDO::PARAM_STR);
$stmte->bindParam(":id", $id_cliente, PDO::PARAM_INT);
$executa3 = $stmte->execute();
if($executa3){
echo '03 - Dados atualizados com sucesso <br />';
}
else{
echo '03 - Erro ao atualizar dados <br />';
}
}
catch(PDOException $e){
echo $e->getMessage();
}
# Desfaz o insert em caso de erro no update */
if(!$executa3){
$pdo->rollBack();
//die('Erro ao atualizar saldo'); // Exibe erro didático e para a execução do script
} else {
$pdo->commit(); /* Se não houve erro nas querys, confirma os dados no banco */
}
# Seleciona dados com sentença preparada
echo "<p> </p><b>Recuperando dados com Sentenca parametrizada</b>";
$nome = "Rafael Wendel Pinheiro";
try{
$stmte = $pdo->prepare("SELECT id, nome, data, hora FROM cliente WHERE (nome=:nome) ORDER BY id DESC");
$stmte->bindParam(':nome', $nome , PDO::PARAM_STR);
$executa4 = $stmte->execute();
if($executa4){
while($reg = $stmte->fetch(PDO::FETCH_OBJ)){ /* Para recuperar um ARRAY utilize PDO::FETCH_ASSOC */
echo '<br />-------------------------------------------------------------------------------------------------- <br />';
echo 'Codigo: ' . $reg->id . '<br />';
echo 'Nome: ' . $reg->nome . '<br />';
echo 'Data: ' . $reg->data . '<br />';
echo 'Hora: ' . $reg->hora . '<br />';
}
}
else{
echo '04 - Erro ao selecionar dados <br />';
}
}
catch(PDOException $e){
echo $e->getMessage();
}
?>
Abri um novo tópico para quem quiser indicar livros e artigos sobre PDO + DAO.
Para ver Clique Aqui.
require_once 'MDB2.php';
Provavelmente, o caminho está errado. Verifique os níveis de pasta.