sipmann 2 Denunciar post Postado Agosto 11, 2009 OPa... beleza??? Tava eu aqui falando com meus botões... bahhh vo tenta faze uma classe de conexão com mysqli... <? class Conexao { public static $instancia = null; public static function PegaInstancia() { if(null === self::$instancia) { self::$instancia = new mysqli("localhost","root","","sipmannc_sipmanns"); } return self::$instancia; } } $te = Conexao::PegaInstancia(); $resultado = $te->query("insert into ind_niveis values (4,'asd','asd')"); echo $te->affected_rows(); echo mysqli_affected_rows($te); ?> beleza fiz um pedacinho e fui testa no que dava... Opa inseriu.... bahhh "echo $te->affected_rows();" == erro........ Fatal error: Call to undefined method mysqli::affected_rows() in C:\xamp\xampp\htdocs\gerproj\index\classes\conexao.class.php on line 19 mas o de baixo deste funciona... alguem poderia me ajudar no por que??? Obrigado e até VLwwww Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Agosto 11, 2009 Acho que é assim... $resultado->affected_rows; Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
sipmann 2 Denunciar post Postado Agosto 11, 2009 opa... ai temos isto aqui Fatal error: Call to a member function affected_rows() on a non-object in C:\xamp\xampp\htdocs\gerproj\index\classes\conexao.class.php on line 19 Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Agosto 11, 2009 Acho que você colocou errado... é sem os parênteses. Não é assim... $resultado->affected_rows(); É assim $resultado->affected_rows; Ou no máximo assim $te->affected_rows; http://br.php.net/mysqlihttp://br.php.net/manual/pt_BR/mysqli.affected-rows.php Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
sipmann 2 Denunciar post Postado Agosto 11, 2009 opa... grannddddeeeeeee eu mereço 1 R$... tomei tufo de um parenteses..... mas vlww a tentativa... muito obrigado... funfo vlwwww até Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Agosto 11, 2009 Beleza... Uma dica, principalmente com o mysqli... leia o manual... eu comecei uns 15 dias atrás e me batia direto... Na dúvida, check the manual Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
sipmann 2 Denunciar post Postado Agosto 11, 2009 Pode dexa ^^... eu até olhei mas n me deparei com os parenteses ^^ vlww abraço.... FUIII Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Agosto 11, 2009 <? class Conexao { public static $instancia = null; public static function PegaInstancia() { if(null === self::$instancia) { self::$instancia = new mysqli("localhost","root","","sipmannc_sipmanns"); } return self::$instancia; } } $te = Conexao::PegaInstancia(); $resultado = $te->query("insert into ind_niveis values (4,'asd','asd')"); echo $te->affected_rows(); echo mysqli_affected_rows($te); ?> Bom amigão, uma vez que o problema já foi resolvido vou apenas fazer um comentário sobre sua classe: class Conexao { public static $instancia = null; ... Não tem sentido você utilizar o pattern singleton se você deixar a propriedade $instancia pública, troque para private ou protected (dependendo do seu caso). Agora você também pode utilizar singleton sem precisar chamar um método PegaInstancia toda vez que precisar acessar seu objeto, por exemplo: class Conexao { const DBHOST = "localhost"; const DBUSER = "root"; const DBPSWD = ""; const DBNAME = "sipmannc_sipmanns"; static private $instancia; public function __construct(){ $this->start(); } public function __call( $method , $args ){ return( call_user_func_array( array( self::$instancia , $method ) , $args ) ); } public function __get( $name ){ return( self::$instancia->$name ); } private function start(){ if ( !( self::$instancia instanceOf mysqli ) ){ self::$instancia = new mysqli( self::DBHOST , self::DBUSER , self::DBPSWD , self::DBNAME ); } } } Para usar isso ai é só fazer o seguinte: $teste = new Conexao(); if ( $teste->query( "INSERT INTO `teste`(`A`,`B`,`C`) VALUES( 'D' , 'E' , 'F' ),('G' , 'H' , 'I' );" ) ){ var_dump( $teste->affected_rows ); //int(2) } E viva a mágica dos métodos mágicos !!! Compartilhar este post Link para o post Compartilhar em outros sites
sipmann 2 Denunciar post Postado Agosto 13, 2009 OOOHHHHHOOOOOOOOOoo ai pego pesado comigo =] eu falei que tava brincando um poco ^^.... entendi quase metade do que você me passo João Batista Neto ^^ axo que vou dar uma estudada um pouco sobre estes outros metodos que você utilizou :lol: vlww mesmo pela dica da classe ps:: Se puder me dar umas dicas (eu fique moh tempo sem mexe com php)... esses métodos que você utilizou __call.... eu agradeceria... vlw gurizada... to indo pro meu amigo Google =] té... abração Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Agosto 13, 2009 ps:: Se puder me dar umas dicas (eu fique moh tempo sem mexe com php)... esses métodos que você utilizou __call.... eu agradeceria... vlw gurizada... to indo pro meu amigo Google =] Bom, eu sempre desenvolvi em C e C++, porém, por volta de 2002 conheci a ECMA Script e simplesmente apaixonei, a possibilidade de modificar um comportamento em tempo de execução me fez pensar um pouco sobre como desenvolver uma aplicação. Assim como a ECMA Script 262, o PHP é também uma linguagem dinâmica e isso significa que você pode criar uma função ou método em tempo de execução, pode instanciar classes diferentes para necessidades diferentes e até mudar o comportamento de algo previamente definido. O PHP, por ser uma linguagem dinâmica define uma série de funções e métodos especiais (métodos mágicos) para permitir essa mudança em tempo de execução, aqui vai alguns: Para saber os argumentos que foram passados para uma função Em alguns casos existirá a necessidade de se ter uma função que poderá receber um número N de argumentos. Esse número N é tão variável que é impossível você prever quantos serão exatamente durante a análise da aplicação. Para isso o PHP oferece a função func_get_args(), func_get_arg( $arg_num ) e func_num_args(); function somaPreDef( $a , $b , $c , $d , $e , $f , $g , $h , $i , $j , $k , $l , $m , $n , $o , $p , $q , $r , $s , $t , $u , $w , $v , $x , $y , $z ){ return( $a + $b + $c + $d + $e + $f + $g + $h + $i + $j + $k + $l + $m + $n + $o + $p + $q + $r + $s + $t + $u + $w + $v + $x + $y + $z ); } function somaDin(){ for ( $i = 0 , $soma = 0 , $argv = func_get_args() , $argc = func_num_args() ; $i < $argc ; $i++ ) $soma += $argv[ $i ]; return( $soma ); } echo somaPreDef( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 ); //351 echo somaDin( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 ); //351 Como pode ser visto, a função func_get_args() retorna uma matriz com todos os argumentos passados para sua função e func_num_args() retorna o número de argumentos passados. a função func_get_arg( $arg_num ) acessa diretamente o argumento especificado por $arg_num (0 para o primeiro argumento e N - 1 para o último). Uma outra possibilidade é criar em tempo de execução uma função anônima (ou lambda) e passá-la como argumento para outra função: function each_arg(){ $argv = func_get_args(); $argc = func_num_args(); $func = $argv[ $argc - 1 ]; for ( $i = 0 ; $i < $argc - 1 ; $i++ ){ call_user_func( $func , $argv[ $i ] ); } } each_arg( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , create_function( '$arg' , ' if ( ( $arg % 2 ) == 0 ) printf( "O número %d é parn" , $arg ); else printf( "O número %d é imparn" , $arg ); ' ) ); A saída disso será: O número 1 é impar O número 2 é par O número 3 é impar O número 4 é par O número 5 é impar O número 6 é par O número 7 é impar O número 8 é par O número 9 é impar O número 10 é par Nesse caso, temos create_function( $arg_list , $function_body ) que criará a função anônima e depois call_user_func( $function_name , $arg1 , ... , $argN ) que irá chamar a função passada como argumento, além de call_user_func temos também call_user_func_array( $function_name , $array_of_arguments ) que fará a mesma coisa, com a diferença que passamos uma matriz com os argumentos em vez de passar cada argumento separadamente. Além dessas funções o PHP também oferece alguns recursos para se trabalhar com classes, que são os métodos mágicos. Os métodos mágicos permitem que você possa acessar propriedades que não foram definidas, métodos que não existem, converter objetos em strings, serializar, construir e destruir os objetos: class Magica { public function __construct(){ printf( "Construindo a %sn" , get_class( $this ) ); } public function __destruct(){ printf( "acabou" ); } public function __get( $name ){ printf( "Recuperando o valor da propriedade %sn" , $name ); } public function __set( $name , $value ){ printf( "Atribuindo o valor %s para a propriedade %sn" , $value , $name ); } public function __call( $name , $argv ){ printf( "Chamando o método %s::%s( %s )n" , get_class( $this ) , $name , implode( " , " , $argv ) ); } public function __toString(){ return( sprintf( "objeto[%s] convertido em stringn" , get_class( $this ) ) ); } } $teste = new Magica(); $teste->abra = 10; $teste->cadabra = 20; $teste->abra_cadabra( "abra" , "cadabra" ); echo $teste; A saída disso será: Construindo a Magica Atribuindo o valor 10 para a propriedade abra Atribuindo o valor 20 para a propriedade cadabra Chamando o método Magica::abra_cadabra( abra , cadabra ) objeto[Magica] convertido em string acabou Isso porque: $teste = new Magica(); O uso da palavra chave new causou a chamada do método mágico __construct $teste->abra = 10; $teste->cadabra = 20; Quando atribuímos valores à propriedades que não estão declaradas na definição da classe ou quando tentamos definir propriedades protegidas ou privadas (que não são acessíveis fora do escopo da classe) o método mágico __set( $name , $value ) é chamado e recebe como argumento o nome da propriedade que está sendo definida e o valor que está sendo atribuído. Se além da definição tentássemos utilizar esses valores (ex: echo $teste->abra) o método mágico __get( $name ) seria chamado e receberia como argumento o nome da propriedade. $teste->abra_cadabra( "abra" , "cadabra" ); Quando chamamos um método que não está declarado na definição da classe ou quando tentamos chamar um método privado ou protegido, o método mágico __call( $name , $argv ) é chamado e recebe como argumento o nome do método e uma matriz com todos os argumentos passados para ele, essa matriz de argumentos tem os mesmos valores que a função func_get_args retorna. echo $teste; String é string, Objeto é objeto, porém algumas vezes precisamos, por qualquer motivo, converter um objeto em string. Sempre que damos um echo, print, printf ou concatenamos o objeto com uma string ou qualquer ação que faça o objeto ser tratado como uma string o método mágico __toString é chamado. É essa dinamicidade do PHP que faz dele uma linguagem tão poderosa, onde o limite é a própria imaginação. Com eles podemos criar aplicações abstratas, portáveis e totalmente reutilizáveis, sem precisar modificar uma única linha de código ou então utilizar designs patterns como Factory, Lazzy Initialization, Observer, Singleton e conseguir uma execução limpa e um código elegante. Na thread http://forum.imasters.com.br/index.php?/topic/356252-metodos-magicos/page__p__1350952__hl__ValueObject__fromsearch__1entry1350952 eu coloquei um código de uma classe, ValueObject e falei um pouco sobre esse mesmo tema, de uma olhada lá e se ainda tiver alguma dúvida é só dar um toque. Compartilhar este post Link para o post Compartilhar em outros sites