ezequielg 1 Denunciar post Postado Julho 20, 2012 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 Valerio 102 Denunciar post Postado Julho 20, 2012 require_once 'MDB2.php'; Provavelmente, o caminho está errado. Verifique os níveis de pasta. Compartilhar este post Link para o post Compartilhar em outros sites
ezequielg 1 Denunciar post Postado Julho 23, 2012 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
Wanderson Valerio 102 Denunciar post Postado Julho 23, 2012 Olá amigo, boa tarde. Esse seu MDB2 é responsável pela conexão com o banco de dados do seu site? Compartilhar este post Link para o post Compartilhar em outros sites
ezequielg 1 Denunciar post Postado Julho 23, 2012 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
ezequielg 1 Denunciar post Postado Julho 23, 2012 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
Wanderson Valerio 102 Denunciar post Postado Julho 23, 2012 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
Evandro Oliveira 331 Denunciar post Postado Julho 23, 2012 @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
ezequielg 1 Denunciar post Postado Julho 23, 2012 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 Valerio 102 Denunciar post Postado Julho 23, 2012 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 Compartilhar este post Link para o post Compartilhar em outros sites
ezequielg 1 Denunciar post Postado Julho 23, 2012 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 1 Denunciar post Postado Julho 24, 2012 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? Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Julho 24, 2012 @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
ezequielg 1 Denunciar post Postado Julho 24, 2012 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
ezequielg 1 Denunciar post Postado Julho 31, 2012 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
Evandro Oliveira 331 Denunciar post Postado Julho 31, 2012 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
ezequielg 1 Denunciar post Postado Julho 31, 2012 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
Evandro Oliveira 331 Denunciar post Postado Julho 31, 2012 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
ezequielg 1 Denunciar post Postado Julho 31, 2012 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
ezequielg 1 Denunciar post Postado Agosto 2, 2012 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