Vitinhu 0 Denunciar post Postado Agosto 1, 2012 Prezados, Estive acompanhando o livro do Pablo Dall'Oglio (PHP Programando com Orientação a Objetos) e cheguei a um ponto onde não consigo mais continuar devido um erro no método query() do PDO. Situação: Arquivo TRecord.class.php <?php abstract class TRecord { protected $data; // array contendo os dados do objeto public function __construct($id = null) {...} public function __clone() {...} private function __set($prop, $value) {...} private function __get($prop){...} private function getEntity(){...} public function fromArray($data){...} public function toArray(){...} public function store(){...} /** * método load() * recupera (retorna) um objeto da base de dados * através de seu ID e instancia ele na memória * @param $id = ID do objeto */ public function load($id){ // instancia a instrução de SELECT $sql = new TSqlSelect(); $sql->setEntity($this->getEntity()); $sql->addColumn('*'); // cria o critério de seleção baseado no ID $criteria = new TCriteria(); $criteria->add(new TFilter('id', '=', $id)); $sql->setCriteria($criteria); // obtem transação ativa if($conn = TTransaction::get()){ // faz o log e executa o SQL TTransaction::log($sql->getInstruction()); $result = $conn->query("SELECT * FROM aluno"); //- ERRO AQUI //$result = $conn->query($sql->getInstruction()); // se retorna algum resultado if($result){ // retorna os dados em forma de objeto $object = $result->fetchObject(get_class($this)); } return $object; } else { // se não tiver transação, retorna uma exceção throw new Exception('Não há transação ativa!'); } } } ?> Arquivo model_get.php <?php function __autoload($classe){...} class AlunoRecord extends TRecord {} class CursoRecord extends TRecord {} try { TTransaction::open('banco_my'); $aluno = new AlunoRecord(1); echo "obtendo aluno 1<br>\n"; echo "==============<br>\n"; echo 'Nome : '. $aluno->nome . "<br>\n"; echo 'Endereço : '. $aluno->endereco . "<br>\n"; TTransaction::close(); } catch (Exception $e) { echo 'Erro: '.$e->getMessage(); TTransaction::rollback(); } ?> Quando executo o arquivo model_get.php no browser o apache cai. Porém, quando altero a linha $result = $conn->query("SELECT * FROM aluno"); para $result = $conn->query("SELECT nome FROM aluno"); o script me traz o resultado, mas não é o que preciso, pois necessito de todas as colunas da tabela aluno. Estive lendo algo sobre o erro 'SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)', porém não encontrei uma solução para mim. Desde já agradeço a ajuda. Att, Victor. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Agosto 1, 2012 Andei pesquisando, e esse erro foi relatado quando não existe nenhuma coluna como chave primária da tabela. Verifique a integridade da tabela se: - Existe chave primária (simples ou composta); - Existe chaves únicas (se existir, tente remover); - Relacionamento com outras tabelas. Vou pesquisar mais sobre isso, mas em primeira instância, é isso. Sobre o apache cair, não vi ainda. Eu li uma boa parte do livro do Pablo Dall'Oglio, ele é professor aonde eu fazia faculdade. Como professor, é excelente. Mas não gostei muito do livro. Comete alguns erros e uns trechos possui certa ambiguidade que pode levar ao erro. Ai eu mudei para o livro do Matt Zandstra. Compartilhar este post Link para o post Compartilhar em outros sites
Vitinhu 0 Denunciar post Postado Agosto 1, 2012 Andei pesquisando, e esse erro foi relatado quando não existe nenhuma coluna como chave primária da tabela. Verifique a integridade da tabela se: - Existe chave primária (simples ou composta); - Existe chaves únicas (se existir, tente remover); - Relacionamento com outras tabelas. Vou pesquisar mais sobre isso, mas em primeira instância, é isso. Sobre o apache cair, não vi ainda. Eu li uma boa parte do livro do Pablo Dall'Oglio, ele é professor aonde eu fazia faculdade. Como professor, é excelente. Mas não gostei muito do livro. Comete alguns erros e uns trechos possui certa ambiguidade que pode levar ao erro. Ai eu mudei para o livro do Matt Zandstra. @Gabriel Heming Realmente minha tabela não possuia primary key definida, foi então que, exclui ela e criei novamente, restartei o apache e o mysql e ao executar o fonte via browser o apache caiu novamente e não houve tempo de exibir sequer um erro. O mais cruel é que ao alterar a query de (SELECT * FROM aluno) para (SELECT nome FROM aluno) o script é executado normalmente. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Agosto 1, 2012 Bom, vamos por partes então. Qual é o servidor que você está utilizando? Wamp, Xampp, Lampp, "instalado na unha"... Passe o código da instância da PDO, pode ser alguma coisa nas opções. Ou melhor, passe todo o código das classes, para eu testar aqui. Utilize o BBCode Spoiler, que você encontra no combobox (select) do editor de texto. Ai o post não fica tão extenso para o código completo. Compartilhar este post Link para o post Compartilhar em outros sites
Vitinhu 0 Denunciar post Postado Agosto 1, 2012 Estou utilizando o XAMPP (instalado no braço - muitos nexts (rsrsrs)). PHP version 5.2.8 Apache version 2.2.11 Vamos aos fontes. Pacote ado: ado/TConnection.class.php <?php /** * classe TConnection * gerencia conexões com banco de dados através de arquivos de configuração */ final class TConnection { /** * método __construct() * não existirão instâncias de TConnection, por isso estamos marcando-o como private */ private function __construct() {} /** * método open() * recebe o nome do banco de dados e instancia o objeto PDO correspondente * @param $name = nome do banco de dados */ public static function open($name) { // verifica se existe arquivo de configuração para este banco de dados if(file_exists("../config/{$name}.ini")) { // lê o arquivo.ini e retorna um array $db = parse_ini_file("../config/{$name}.ini"); } else { // se não existir, lança um erro throw new Exception("Arquivo '$name' não encontrado"); } // lê as informações contidas no arquivo $user = $db['user']; $pass = $db['pass']; $name = $db['name']; $host = $db['host']; $type = $db['type']; // descobre qual o tipo (drive) de banco de dados a ser utilizado switch ($type) { case 'pgsql': $conn = new PDO("pgsql:dbname={$name}; user={$user}; password={$pass}; host=$host"); break; case 'mysql': $conn = new PDO("mysql:host={$host};dbname={$name}", $user, $pass); break; case 'oci8': $conn = new PDO("oci:dbname={$name}", $user, $pass); break; } // define para que o PDO lance exceções na ocorrência de erros $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // retorna o objeto instanciado return $conn; } } ?> ado/TCriteria.class.php <?php /** * classe TCriteria * Esta classe provê uma interface para definição de critérios */ class TCriteria extends TExpression { private $expressions; // armazena a lista de expressões private $operators; // armazena a lista de operadores private $properties; // propriedades do critério /** * método add() * adiciona uma expressão ao critério * @param $expression = expressão (objeto TExpression) * @param $operator = operador lógico de comparação */ public function add(TExpression $expression, $operator = self::AND_OPERATOR) { // na primeira vez não precisa operador lógico para concatenar if(empty($this->expressions)) { unset($operator); } // agrega o resultado da expressão à lista de expressões $this->expressions[] = $expression; $this->operators[] = $operator; } /** * método dump() * retorna a expressão final */ public function dump() { // concatena a lista de expressões if(is_array($this->expressions)) { foreach ($this->expressions as $i => $expression) { $operador = $this->operators[$i]; // concatena o operador com a respectiva expressão $result .= $operador . $expression->dump() . ' '; } $result = trim($result); return "({$result})"; } } /** * método setProperty() * define um valor de uma propriedade * @param $property = propriedade * @param $value = valor */ public function setProperty($property, $value) { $this->properties[$property] = $value; } /** * método getProperty() * retorna o valor de uma propriedade * @param $property = propriedade */ public function getProperty($property) { return $this->properties[$property]; } } ado/TExpression.class.php <?php /** * classe TExpression * classe abstrata para gerenciar expressões */ abstract class TExpression { // operadores lógicos const AND_OPERATOR = 'AND '; const OR_OPERATOR = 'OR '; // marca método dump como obrigatório abstract public function dump(); } ?> ado/TFilter.class.php <?php /** * classe TFilter * Esta classe provê uma interface para definição de filtros de seleção */ class TFilter extends TExpression { private $variable; // variável private $operator; // operador private $value; // valor /** * método __construct * @param $variable = variável * @param $operator = operador (>,<) * @param $value = valor a ser comparado */ public function __construct($variable, $operator, $value) { // armazena as propriedades $this->variable = $variable; $this->operator = $operator; // transforma o valor de acordo com certas regras // antes de atribuir à propriedade $this->value $this->value = $this->transform($value); } /** * método transform() * recebe um valor e faz modificações necessárias * para ele ser interpretado pelo bando de dados * podendo ser um integer/string/boolean ou array * @param $value = valor a ser transformado */ private function transform($value) { // caso seja um array if(is_array($value)) { // percorre os valore foreach ($value as $x) { // se for um inteiro if(is_integer($x)) { $foo[] = $x; } else if(is_string($x)) { // adiciona aspas $foo[] = "'$x'"; } } // converte o array em string separada por virgula ',' $result = '(' . implode(',', $foo) . ')'; } // caso seja uma string else if(is_string($value)) { // adiciona aspas $result = "'$value'"; } // caso seja um valo nulo else if(is_null($value)) { $result = 'NULL'; } // case seja booleano else if(is_bool($value)) { // armazena TRUE ou FALSE $result = $value ? 'TRUE' : 'FALSE'; } else { $result = $value; } // retorna o valor return $result; } /** * método dump() * retorna o filtro em forma de expressão */ public function dump() { // concatena a expressão return "{$this->variable} {$this->operator} {$this->value}"; } } ?> ado/TLogger.class.php <?php /** * classe TLogger * Esta classe prove uma interface abstrata para definição de algoritimo de LOG */ abstract class TLogger { protected $filename; // local do arquivo de LOG /** * método __construct() * instancia de um logger * @param $filename = local do arquivo de LOG */ public function __construct($filename) { $this->filename = $filename; // reseta o conteudo do arquivo file_put_contents($filename, ''); } // define o método write como obrigatório abstract function write($message); } ?> ado/TLoggerTXT.class.php <?php /** * classe TLoggerTXT * implementa o algoritmo de LOG em TXT */ class TLoggerTXT extends TLogger { /** * método write() * @param $message = mensagem a ser escrita */ public function write($message) { $time = date('Y-m-d H:i:s'); // monta a string $text = "$time :: $message\n"; // adiciona ao final do arquivo $handler = fopen($this->filename, 'a'); fwrite($handler, $text); fclose($handler); } } ado/TRecord.class.php <?php /** * classe TRecord * esta classe prove os metodos necessários para persistir e * recuperar objetos da base de dados (Active Record) */ abstract class TRecord { protected $data; // array contendo os dados do objeto /** * método __construct() * instancia de um Active Record. Se passado o $id, já carrega o objeto * @param [$id] = ID do objeto */ public function __construct($id = null) { // se o ID for informado if($id) { // carrega o objeto correspondente $object = $this->load($id); if($object) { $this->fromArray($object->toArray()); } } } /** * método __clone() * executa quando o objeto for clonado. * limpa o ID para que seja gerado um novo ID para o clone. */ public function __clone() { unset($this->id); } /** * método __set() * executado sempre que uma propriedade for atribuida * @param $prop = propriedade * @param $value = valor atribuido a propriedade */ private function __set($prop, $value) { //verifica se existe o método set_<propriedade> if(method_exists($this, 'set_'.$prop)){ // executa o método set_<propriedade> call_user_func(array($this, 'set_'.$prop), $value); } // se não existe atribui o valor da propriedade else { // atribui o valor da propriedade $this->data[$prop] = $value; } } /** * método __get() * executado sempre que uma propriedade for requirida * @param $prop = propriedade requirida */ private function __get($prop){ // verifica se existe método get_<propriedade> if(method_exists($this, 'get_'.$prop)){ // executa o método get_<propriedade> return call_user_func(array($this, 'set_'.$prop)); } // se não existe retorna o valor da propriedade else { // retorna o valor da propriedade return $this->data[$prop]; } } /** * método getEntity() * retorna o nome da entidade (tabela) */ private function getEntity(){ // obtem o nome da classe $classe = strtolower(get_class($this)); // retorna o nome da classe - "Record" return substr($classe, 0, -6); } /** * método fromArray() * preenche os dados do objeto com um array * @param $data = array de dados */ public function fromArray($data){ $this->data = $data; } /** * método toArray() * retorna os dados do objeto como array */ public function toArray(){ return $this->data; } /** * método store() * armazena o objeto na base de dados e retorna o número de * linha afetadas pela inserção SQL (zero ou um) */ public function store(){ // verifica se tem ID ou se existe o registro na base de dados if(empty($this->data['id']) or (!$this->load($this->id))){ // incrementa o ID $this->id = $this->getLast() +1; // cria uma instrução INSERT $sql = new TSqlInsert(); $sql->setEntity($this->getEntity()); // perforre os dados do objeto foreach ($this->data as $key => $value) { // passa os dados do objeto para o SQL $sql->setRowData($key, $this->$key); } } else { // instancia uma instrução UPDATE $sql = new TSqlUpdate(); $sql->setEntity($this->getEntity()); // cria um critério de seleção baseado no ID $criteria = new TCriteria(); $criteria->add(new TFilter('id', '=', $this->id)); $sql->setCriteria($criteria); // perforre os dados do objeto foreach ($this->data as $key => $value) { // o ID não precisa ir no update if($key !== 'id'){ // passa os dados do objeto para o SQL $sql->setRowData($key, $this->$key); } } } // obtem transação ativa if($conn = TTransaction::get()){ // faz o log e executa o SQL TTransaction::log($sql->getInstruction()); $result = $conn->exec($sql->getInstruction()); // retorna o resultado return $result; } else { // se não tiver transação, retorna uma exceção throw new Exception('Não há transação ativa!'); } } /** * método load() * recupera (retorna) um objeto da base de dados * através de seu ID e instancia ele na memória * @param $id = ID do objeto */ public function load($id){ // instancia a instrução de SELECT $sql = new TSqlSelect(); $sql->setEntity($this->getEntity()); $sql->addColumn('*'); // cria o critério de seleção baseado no ID $criteria = new TCriteria(); $criteria->add(new TFilter('id', '=', $id)); $sql->setCriteria($criteria); // obtem transação ativa if($conn = TTransaction::get()){ // faz o log e executa o SQL TTransaction::log($sql->getInstruction()); $result = $conn->query("SELECT * FROM aluno"); //$result = $conn->query($sql->getInstruction()); // se retorna algum resultado if($result){ // retorna os dados em forma de objeto $object = $result->fetchObject(get_class($this)); } return $object; } else { // se não tiver transação, retorna uma exceção throw new Exception('Não há transação ativa!'); } } /** * método delete() * exclui um objeto da base de dados através de seu ID. * @param $id = ID do objeto */ public function delete($id = NULL){ // o ID é o parametro ou a propriedade ID $id = $id ? $id : $this->id; // instancia a instrução de DELETE $sql = new TSqlDelete(); $sql->setEntity($this->getEntity()); // cria o critério de seleção baseado no ID $criteria = new TCriteria(); $criteria->add(new TFilter('id', '=', $id)); $sql->setCriteria($criteria); // obtem transação ativa if($conn = TTransaction::get()){ // faz o log e executa o SQL TTransaction::log($sql->getInstruction()); $result = $conn->query($sql->getInstruction()); // retorna o resultado return $result; } else { // se não tiver transação, retorna uma exceção throw new Exception('Não há transação ativa!'); } } /** * método getLast() * retorna o ultimo ID */ private function getLast(){ // obtem transação ativa if($conn = TTransaction::get()){ // instancia a instrução de SELECT $sql = new TSqlSelect(); $sql->addColumn('max(ID) as ID'); $sql->setEntity($this->getEntity()); // faz o log e executa o SQL TTransaction::log($sql->getInstruction()); $result = $conn->query($sql->getInstruction()); // retorna os dados do banco $row = $result->fetch(); return $row[0]; } else { // se não tiver transação, retorna uma exceção throw new Exception('Não há transação ativa!'); } } } ?> ado/TSqlInstruction.class.php <?php /** * classe TSqlInstruction * Esta classe provê os métodos em comum entre todas as instruções * SQL (SELECT, INSET, DELETE e UPDATE) */ abstract class TSqlInstruction { protected $sql; // armazena as instruções SQL protected $criteria; // armazena o objeto critério protected $entity; // armazena o nome da tabela /** * método setEntity() * define o nome da entidade (tabela) a ser manipulada pelas instruções SQL * @param $entity = tabela */ final public function setEntity($entity) { $this->entity = $entity; } /** * método getEntity() * retorna o nome da entidade (tabela) */ final public function getEntity() { return $this->entity; } /** * método setCriteria() * define um critério de seleção de dados através da combinação de um objeto * do tipo TCriteria, que oferece uma interface para definição de critérios * @param TCriteria $criteria */ public function setCriteria(TCriteria $criteria) { $this->criteria = $criteria; } /** * método abstrato getInstruction() * declarando como <abstract> obrigamos sua declaração nas classes filhas, * uma vez que seu comportamente será definido em cada uma delas (polimorfismo) */ abstract function getInstruction(); } ?> ado/TSqlSelect.class.php <?php /** * classe TSqlSelect * esta classe provê meios para manipulação de uma instrução SELECT no banco de dados */ final class TSqlSelect extends TSqlInstruction { private $columns; // armazena as colunas para montar a SQL /** * método addColumn() * adiciona uma coluna a ser retornada pelo SELECT * @param $column = coluna da tabela */ public function addColumn($column) { // adiciona a coluna no array $this->columns[] = $column; } /** * método getInstruction() * retorna a instrução SELECT em forma de string */ public function getInstruction() { $this->sql = 'SELECT '; // monta a string com os nomes de colunas $this->sql .= implode(', ', $this->columns); // adiciona a clausula FROM na string $this->sql .= " FROM {$this->entity}"; // retorna a clausula WHERE do objeto $this->criteria if($this->criteria) { $expression = $this->criteria->dump(); if($expression) { $this->sql .= ' WHERE ' . $expression; } // obtem as propriedades do critério $order = $this->criteria->getProperty('order'); $limit = $this->criteria->getProperty('limit'); $offset = $this->criteria->getProperty('offset'); // obtem a ordenação do select if($order) { $this->sql .= ' ORDER BY ' . $order; } if($limit) { $this->sql .= ' LIMIT ' . $limit; } if($offset) { $this->sql .= ' OFFSET ' . $offset; } } return $this->sql; } } ?> ado/TTransaction.class.php <?php /** * classe TTransaction * esta classe provê métodos necessários para manipulações de transações */ final class TTransaction { private static $conn; // conexão ativa private static $logger; // objeto de LOG /** * método __construct() * está declarado como private para impedir que se crie instância de TTransation */ private function __construct(){} /** * método open() * abre uma transação e uma conexão com o banco de dados * @param $database = nome do banco de dados */ public static function open($database) { // abre uma conexão e armazena na propriedade estática $conn if(empty(self::$conn)) { self::$conn = TConnection::open($database); // inicia a transação self::$conn->beginTransaction(); // desliga o log de SQL self::$logger = null; } } /** * método get() * retorna a conexão ativa da transação */ public static function get() { // retorna a conexão ativa return self::$conn; } /** * método rollback() * desfaz todas as operações realizada na transação */ public static function rollback() { if(self::$conn) { // desfaz as operações realizada durante a transação self::$conn->rollBack(); self::$conn = null; } } /** * método close() * aplica todas operações realizadas e fecha a transação */ public static function close() { if(self::$conn) { // aplica as operações realizadas durante a transação self::$conn->commit(); self::$conn = null; } } /** * metodo setLogger() * @param TLogger $logger = algoritimo de LOG a ser usado */ public static function setLogger(TLogger $logger) { self::$logger = $logger; } /** * método log() * armazena uma mensagem no arquivo de LOG * @param $message = mensagem a ser inserida no arquivo de LOG */ public static function log($message) { // verifica se existe um logger if(self::$logger) { // escreve a mensagem no arquivo self::$logger->write($message); } } } ?> Pacote config: config/banco_my.ini host = localhost name = sistema user = root pass = type = mysql Pacote examples: examples/model_get.php <?php function __autoload($classe){ if(file_exists("../ado/{$classe}.class.php")){ include_once "../ado/{$classe}.class.php"; } } /** * classe MenuRecord, filha de TRecord * persiste um menu no banco de dados */ class AlunoRecord extends TRecord {} /** * classe AreaRecord, filha de TRecord * persiste uma area no banco de dados */ class CursoRecord extends TRecord {} // insere novos objetos no banco de dados try { // abre a conexão com teste2 TTransaction::open('banco_my'); // define uma stratégia de LOG TTransaction::setLogger(new TLoggerTXT('../tmp/log.txt')); // escreve a mensagem de LOG // instancia de um novo menu $aluno = new AlunoRecord(1); echo "obtendo aluno 1<br>\n"; echo "==============<br>\n"; echo 'Nome : '. $aluno->nome . "<br>\n"; echo 'Endereço : '. $aluno->endereco . "<br>\n"; //instancia uma nova area $curso = new CursoRecord(2); echo "obtendo curso 2\n"; echo "==============<br>\n"; echo 'Nome : '. $curso->nome . "<br>\n"; echo 'Duração : '. $curso->duracao . "<br>\n"; // fecha conexão TTransaction::close(); } catch (Exception $e) { // exibe a mensagem gerada pela exceção echo 'Erro: '.$e->getMessage(); // desfaz as transações TTransaction::rollback(); } ?> E por ultimo o pacote tmp: tmp/log.txt Estão ae. Vamos ver se consegue reproduzir o erro. Abraço. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Agosto 1, 2012 Até estava esquecendo. Você olhou os logs do apache? Compartilhar este post Link para o post Compartilhar em outros sites
Vitinhu 0 Denunciar post Postado Agosto 1, 2012 Até estava esquecendo. Você olhou os logs do apache? Limpei o error.log do apache e reproduzi o erro. E fui deparado somente com isso: [Wed Aug 01 11:56:43 2012] [notice] Parent: child process exited with status 3958377386 -- Restarting. =/ Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Agosto 1, 2012 da uma olhada no access.log, e, pelo horário, veja o que foi acessado antes do erro. Saber o que foi acessado, pode ajudar. Como resposta a um bug parecido, veio essa aqui: http://www.java-samples.com/showtutorial.php?tutorialid=1050 Mas veja que o número do erro é outro. Compartilhar este post Link para o post Compartilhar em outros sites
Vitinhu 0 Denunciar post Postado Agosto 1, 2012 No access.log não me diz muita coisa. 127.0.0.1 - - [01/Aug/2012:11:59:06 -0300] "GET /app_oo/examples/ HTTP/1.1" 200 1957 Vou seguir as orientações do link que você passou. Conseguisse reproduzir o erro na sua máquina?? Copiei o arquivo libmysql.dll para o diretório System32 do windows e reiniciei o computador e o erro permanece. @Gabriel Heming conseguisse reproduzir o erro na sua máquina?? Desde já agradeço. Att, Victor. Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Agosto 1, 2012 Tudo indica que o problema está em TRecord::load() , mas não ficou claro exatamente onde. Experimente instalar a xDebug. Isso de "cair" o Apache aparenta ser algum tipo de loop infinito e como por padrão essas coisas não são automaticamente abortadas, vão sendo executadas até estourar tudo. Com a xDebug, não lembro se apenas com as configurações-padrão ou não, quando um loop infinito é detectado, ela aborta a execução por você, avisando que tal ação foi tomada e o porquê, isto é, qual arquivo em qual linha forçou ela a tomar essa atitude. Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Agosto 1, 2012 A modelagem do banco (as DDL's), por favor. Compartilhar este post Link para o post Compartilhar em outros sites
Vitinhu 0 Denunciar post Postado Agosto 3, 2012 A modelagem do banco (as DDL's), por favor. @Evandro Oliveira está é a modelagem.. Muito simples por sinal! heheh.. CREATE TABLE IF NOT EXISTS `aluno` ( `id` int(6) NOT NULL, `nome` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `endereco` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `aluno` (`id`, `nome`, `endereco`) VALUES (1, 'Victor Cardoso Higino', 'Rua das dores'); CREATE TABLE IF NOT EXISTS `curso` ( `id` int(6) NOT NULL, `nome` varchar(255) NOT NULL, `duracao` int(6) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `curso` (`id`, `nome`, `duracao`) VALUES (1, 'Sistemas de informação', 456); Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Agosto 3, 2012 @Evandro Oliveira está é a modelagem.. Muito simples por sinal! heheh.. CREATE TABLE IF NOT EXISTS `aluno` ( `id` int(6) NOT NULL, `nome` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `endereco` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `aluno` (`id`, `nome`, `endereco`) VALUES (1, 'Victor Cardoso Higino', 'Rua das dores'); CREATE TABLE IF NOT EXISTS `curso` ( `id` int(6) NOT NULL, `nome` varchar(255) NOT NULL, `duracao` int(6) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `curso` (`id`, `nome`, `duracao`) VALUES (1, 'Sistemas de informação', 456); Tirando os "undefined variable", acredito que meu output tenha sido satisfatório: <br /> <font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'> <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Notice: Undefined variable: operator in /home/evandro/Sites/imasters/forum/cardinality/ado/TCriteria.class.php on line <i>26</i></th></tr> <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr> <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr> <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0008</td><td bgcolor='#eeeeec' align='right'>245848</td><td bgcolor='#eeeeec'>{main}( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/examples/model_get.php' bgcolor='#eeeeec'>../model_get.php<b>:</b>0</td></tr> <tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.0049</td><td bgcolor='#eeeeec' align='right'>353480</td><td bgcolor='#eeeeec'>TRecord->__construct( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/examples/model_get.php' bgcolor='#eeeeec'>../model_get.php<b>:</b>29</td></tr> <tr><td bgcolor='#eeeeec' align='center'>3</td><td bgcolor='#eeeeec' align='center'>0.0049</td><td bgcolor='#eeeeec' align='right'>353544</td><td bgcolor='#eeeeec'>TRecord->load( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/ado/TRecord.class.php' bgcolor='#eeeeec'>../TRecord.class.php<b>:</b>20</td></tr> <tr><td bgcolor='#eeeeec' align='center'>4</td><td bgcolor='#eeeeec' align='center'>0.0066</td><td bgcolor='#eeeeec' align='right'>400368</td><td bgcolor='#eeeeec'>TCriteria->add( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/ado/TRecord.class.php' bgcolor='#eeeeec'>../TRecord.class.php<b>:</b>165</td></tr> </table></font> <br /> <font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'> <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Notice: Undefined variable: result in /home/evandro/Sites/imasters/forum/cardinality/ado/TCriteria.class.php on line <i>39</i></th></tr> <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr> <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr> <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0008</td><td bgcolor='#eeeeec' align='right'>245848</td><td bgcolor='#eeeeec'>{main}( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/examples/model_get.php' bgcolor='#eeeeec'>../model_get.php<b>:</b>0</td></tr> <tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.0049</td><td bgcolor='#eeeeec' align='right'>353480</td><td bgcolor='#eeeeec'>TRecord->__construct( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/examples/model_get.php' bgcolor='#eeeeec'>../model_get.php<b>:</b>29</td></tr> <tr><td bgcolor='#eeeeec' align='center'>3</td><td bgcolor='#eeeeec' align='center'>0.0049</td><td bgcolor='#eeeeec' align='right'>353544</td><td bgcolor='#eeeeec'>TRecord->load( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/ado/TRecord.class.php' bgcolor='#eeeeec'>../TRecord.class.php<b>:</b>20</td></tr> <tr><td bgcolor='#eeeeec' align='center'>4</td><td bgcolor='#eeeeec' align='center'>0.0073</td><td bgcolor='#eeeeec' align='right'>400960</td><td bgcolor='#eeeeec'>TSqlSelect->getInstruction( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/ado/TRecord.class.php' bgcolor='#eeeeec'>../TRecord.class.php<b>:</b>170</td></tr> <tr><td bgcolor='#eeeeec' align='center'>5</td><td bgcolor='#eeeeec' align='center'>0.0073</td><td bgcolor='#eeeeec' align='right'>401344</td><td bgcolor='#eeeeec'>TCriteria->dump( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/ado/TSqlSelect.class.php' bgcolor='#eeeeec'>../TSqlSelect.class.php<b>:</b>32</td></tr> </table></font> obtendo aluno 1<br> ==============<br> Nome : Victor Cardoso Higino<br> Endereço : Rua das dores<br> <br /> <font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'> <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Notice: Undefined variable: operator in /home/evandro/Sites/imasters/forum/cardinality/ado/TCriteria.class.php on line <i>26</i></th></tr> <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr> <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr> <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0008</td><td bgcolor='#eeeeec' align='right'>245848</td><td bgcolor='#eeeeec'>{main}( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/examples/model_get.php' bgcolor='#eeeeec'>../model_get.php<b>:</b>0</td></tr> <tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.0084</td><td bgcolor='#eeeeec' align='right'>401864</td><td bgcolor='#eeeeec'>TRecord->__construct( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/examples/model_get.php' bgcolor='#eeeeec'>../model_get.php<b>:</b>36</td></tr> <tr><td bgcolor='#eeeeec' align='center'>3</td><td bgcolor='#eeeeec' align='center'>0.0084</td><td bgcolor='#eeeeec' align='right'>401864</td><td bgcolor='#eeeeec'>TRecord->load( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/ado/TRecord.class.php' bgcolor='#eeeeec'>../TRecord.class.php<b>:</b>20</td></tr> <tr><td bgcolor='#eeeeec' align='center'>4</td><td bgcolor='#eeeeec' align='center'>0.0085</td><td bgcolor='#eeeeec' align='right'>403360</td><td bgcolor='#eeeeec'>TCriteria->add( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/ado/TRecord.class.php' bgcolor='#eeeeec'>../TRecord.class.php<b>:</b>165</td></tr> </table></font> <br /> <font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'> <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Notice: Undefined variable: result in /home/evandro/Sites/imasters/forum/cardinality/ado/TCriteria.class.php on line <i>39</i></th></tr> <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr> <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr> <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0008</td><td bgcolor='#eeeeec' align='right'>245848</td><td bgcolor='#eeeeec'>{main}( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/examples/model_get.php' bgcolor='#eeeeec'>../model_get.php<b>:</b>0</td></tr> <tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.0084</td><td bgcolor='#eeeeec' align='right'>401864</td><td bgcolor='#eeeeec'>TRecord->__construct( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/examples/model_get.php' bgcolor='#eeeeec'>../model_get.php<b>:</b>36</td></tr> <tr><td bgcolor='#eeeeec' align='center'>3</td><td bgcolor='#eeeeec' align='center'>0.0084</td><td bgcolor='#eeeeec' align='right'>401864</td><td bgcolor='#eeeeec'>TRecord->load( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/ado/TRecord.class.php' bgcolor='#eeeeec'>../TRecord.class.php<b>:</b>20</td></tr> <tr><td bgcolor='#eeeeec' align='center'>4</td><td bgcolor='#eeeeec' align='center'>0.0087</td><td bgcolor='#eeeeec' align='right'>403824</td><td bgcolor='#eeeeec'>TSqlSelect->getInstruction( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/ado/TRecord.class.php' bgcolor='#eeeeec'>../TRecord.class.php<b>:</b>170</td></tr> <tr><td bgcolor='#eeeeec' align='center'>5</td><td bgcolor='#eeeeec' align='center'>0.0087</td><td bgcolor='#eeeeec' align='right'>403864</td><td bgcolor='#eeeeec'>TCriteria->dump( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/ado/TSqlSelect.class.php' bgcolor='#eeeeec'>../TSqlSelect.class.php<b>:</b>32</td></tr> </table></font> obtendo curso 2 ==============<br> Nome : Victor Cardoso Higino<br> <br /> <font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'> <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Notice: Undefined index: duracao in /home/evandro/Sites/imasters/forum/cardinality/ado/TRecord.class.php on line <i>69</i></th></tr> <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr> <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr> <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0008</td><td bgcolor='#eeeeec' align='right'>245848</td><td bgcolor='#eeeeec'>{main}( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/examples/model_get.php' bgcolor='#eeeeec'>../model_get.php<b>:</b>0</td></tr> <tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.0096</td><td bgcolor='#eeeeec' align='right'>403408</td><td bgcolor='#eeeeec'>TRecord->__get( )</td><td title='/home/evandro/Sites/imasters/forum/cardinality/examples/model_get.php' bgcolor='#eeeeec'>../model_get.php<b>:</b>40</td></tr> </table></font> Duração : <br> Apenas peguei os códigos que você postou aqui e abri examples/model_get.php no navegador. Compartilhar este post Link para o post Compartilhar em outros sites
Vitinhu 0 Denunciar post Postado Agosto 14, 2012 Pessoal, Tive que atualizar o meu xampp. Com isso o erro foi resolvido. Obrigado pela atenção de todos. Compartilhar este post Link para o post Compartilhar em outros sites