Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ezequielg

Pear - MDB2

Recommended Posts

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 />";

		}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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??

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 */


?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

# FIM DA PREPARAÇÃO DO BANCO

$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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.