Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Vamos ver os experts daqui.
Minha pergunta é: Esse select está correto?
$registro = $this->con->query('SELECT id, estado, sigla FROM estados WHERE id = '.$this->getId().' OR sigla = "'.strtoupper($this->getSigla()).'"')->fetch();
Abraços
Para que o id ? O campo sigla poderia ser a pk.
UEUHEUHeuHE ^^
Valew Matias, eu estava utilizando assim:
$registro = $this->con->query('SELECT id, estado, sigla FROM estados WHERE id = "'.$this->getId().'" OR sigla = "'.strtoupper($this->getSigla()).'"')->fetch();
Vamos supor que não tem nada no getId() e tem "SP" no getSigla().
Ele iria SELECIONAR as linhas ONDE id = "" OU sigla = "SP"
Beleza aí funcionou legal... mas o jeito que você (Matias) colocou foi melhor ainda... eu acho :mellow:!
Agora este jeito que eu postei inicialmente aí ele iria fazer isso:
SELECIONAR as linhas ONDE id = OU sigla = "SP"
Era nisso que eu estava me F*dend0 aqui sozinho...
Para que o id ? O campo sigla poderia ser a pk.
É pq peguei um script sql que cria os estados e cidades e ele já estava assim, nem alterei nem nada :D
Abraços!!! VALEW!!!
$registro = $this->con->query('SELECT id, estado, sigla FROM estados WHERE id = '.$this->getId().' OR sigla = "'.strtoupper($this->getSigla()).'"')->fetch();
Amigão, uma outra forma de se fazer isso é:
$registro = $this->con->query( sprintf( 'SELECT id, estado, sigla FROM estados WHERE id = %d OR sigla = "%s"', $this->getId(), strtoupper( $this->getSigla() ) ) )->fetch();
Veja o %d no WHERE, ele trata a entrada como um inteiro:
printf( '%d' , 'foo' ); //0
printf( '%d' , 12.33 ); //12
printf( '%d' , 12345 ); //12345
Sei que está resolvido.
Mas queria agradecer pela dica do João Batista, é uma alternativa interessante também... mas para este caso, acho que vou utilizar a dica do Matias mesmo.
Abrção galera!
Eu achei isso 'estranho'.
(int)$this->getId()é um método get.Ele te retorna alguma coisa certo?
Então quem deveria fazer o cast é o set, ne?!
Se o dado entrar corretamente na classe, não tem como sair errado..
E outra... ID é um INTEIRO ? então não use aspas, e não faz sentido o casting, pois você vai mandar uma string pra executar:
WHERE id = "'.$this->getId().'" não use aspas, e {} é mais rápido para concatenar do que o ponto, para isso use aspas duplas para começar a string.
>
Eu achei isso 'estranho'.
(int)$this->getId()é um método get.Ele te retorna alguma coisa certo?
Então quem deveria fazer o cast é o set, ne?!
Se o dado entrar corretamente na classe, não tem como sair errado..
Então William, é que é uma função que filtrará os resultados ou pela ID do estado, ou pela sigla...
veja como está:
no Controller:
function Filtrar() {
$estado = new EstadosDAO;
$estado->setId($_POST['id']);
$estado->setSigla($_POST['sigla']);
return $estado->Filtrar();
}
no DAO:
function Filtrar() {
$registro = $this->con->query('SELECT id, estado, sigla FROM estados WHERE id = '.(int)$this->getId().' OR sigla = "'.strtoupper($this->getSigla()).'"')->fetch();
return $registro;
}
E não é obrigatório que tenha os dois campos preenchidos...
O que eu estou fazendo aqui é uma chamada num webservice para me retornar o endereço pelo CEP, via JSON.
Ele me retorna a sigla do estado.
Então eu fiz uma requisição ajax num arquivo que preparei, que filtrara o estado pela sigla e me retorna o ID para que eu possa dar um "selected" na option que tem a value="ID_DO_ESTADO" no select do form.
Entendeu?
Abraçãoo!!
Eu acho que o que o Willian está falando faz sentido. Veja.
>
Eu achei isso 'estranho'.
(int)$this->getId()
é um método get.Ele te retorna alguma coisa certo?
Então quem deveria fazer o cast é o set, ne?!
Se o dado entrar corretamente na classe, não tem como sair errado..
Eu não tinha me atentado a este detalhe.
O cast deve ser feito no método setId, e não na hora de fazer a consulta.
Se não entender, poste aqui o método setId.
Carlos Eduardo
>
Eu acho que o que o Willian está falando faz sentido. Veja.
Eu não tinha me atentado a este detalhe.
O cast deve ser feito no método setId, e não na hora de fazer a consulta.
Se não entender, poste aqui o método setId.
Carlos Eduardo
Opaaaa, opaa, opa!!!!
Me desculpem pela falta de atenção tbm http://forum.imasters.com.br/public/style_emoticons/default/blush.gif.
Agora fiz o certo:
No Controller:
function Filtrar() {
$estado = new EstadosDAO;
$estado->setId((int)$_POST['id']);
$estado->setSigla(strtoupper($_POST['sigla']));
return $estado->Filtrar();
}
e
No DAO:
function Filtrar() {
$registro = $this->con->query('SELECT id, estado, sigla FROM estados WHERE id = '.$this->getId().' OR sigla = "'.$this->getSigla().'"')->fetch();
return $registro;
}
Valew Willian huehuehue http://forum.imasters.com.br/public/style_emoticons/default/kiss.gif
Cara.. a idéia é 'quase essa'.. veja... você terá que ficar fazendo (int) toda vez que chamar o método ?? a mesma coisa vale pra sigla ali
public function setId( $id ){
$this->id = (int)$id;
}entendeu? assim fica mais fácil ^_^
Eu não costumo fazer 'tudo numa tacada só'.. mas tá beleza.. oq eu disse de concatenar é o seguinte:
"SELECT id, estado, sigla FROM estados WHERE id = {$this->getId()} OR sigla = '{$this->getSigla()}'" pra mim fica bem mais legível do que ficar fazendo o: 'aspa ponto' -- 'ponto aspa'..>
Cara.. a idéia é 'quase essa'.. veja... você terá que ficar fazendo (int) toda vez que chamar o método ?? a mesma coisa vale pra sigla ali
public function setId( $id ){
$this->id = (int)$id;
}entendeu? assim fica mais fácil ^_^
Eu não costumo fazer 'tudo numa tacada só'.. mas tá beleza.. oq eu disse de concatenar é o seguinte:
"SELECT id, estado, sigla FROM estados WHERE id = {$this->getId()} OR sigla = '{$this->getSigla()}'" pra mim fica bem mais legível do que ficar fazendo o: 'aspa ponto' -- 'ponto aspa'..
Certo, mas acho que vou deixar assim pq este é um caso mto específico na minha aplicação toda... o controlador dos estados é o único que precisa fazer essa filtragem com a sigla.
E sobre a concatenação, não costumo fazer assim... costumo sempre utilizar "." (pontos).
Segundo este blog: http://progtuts.info...imization-tips/ e muitos especialistas por aí, citam que a leitura da variavel dentro de uma string com aspas duplas, é mais lento do que concatenando com . (ponto) e aspas simples.
Mesmo assim, vlw ^^
Abraços!
>
e a leitura da variavel dentro de uma string com aspas duplas, é mais lento do que concatenando com . (ponto) e aspas simples.
Isso se você não concatenar ela.E eu concatenei com o {}
Mas a chamada ao método nativo de concatenar (ponto) . é mais lenta que a chamada às aspas http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Enfim, o teu id sempre vai ser um INT, não vai?
Por isso que eu disse para você fazer logo na definição do método..
>
>
e a leitura da variavel dentro de uma string com aspas duplas, é mais lento do que concatenando com . (ponto) e aspas simples.
Isso se você não concatenar ela.E eu concatenei com o {}
Mas a chamada ao método nativo de concatenar (ponto) . é mais lenta que a chamada às aspas http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Enfim, o teu id sempre vai ser um INT, não vai?
Por isso que eu disse para você fazer logo na definição do método..
Sempre vai sim :rolleyes:!!
E pelo que vi em vários sites e blogs por aí:
$concatena = 'O Lula é um '.$adjetivo.'';
é mais rápido que:
$concatena = "O Lula é um $adjetivo";
Agora se é mais rápido que...
$concatena = "O Lula é um {$adjetivo}";
.... eu não sei... analisando logicamente, pode ser q sim http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif...
(não liguem não, hehehe, é q eu gosto de otimizar o código)
Abraços!
Lucas, no caso que você mostrou, a última concatenação é desnecessária.
$concatena = 'O Lula é um '.$adjetivo.'';é o mesmo que: $concatena = 'O Lula é um '.$adjetivo; não tem sentido concatenar o 'vazio'. http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif
'Desculpa' reviver o tópico.. mas só para justificar oque eu disse:
http://br.php.net/manual/en/language.operators.string.php#60035
As chamadas ao . são lentas, pois se você precisar fazer algo como:
$var = $var1.$var2.$var3;
serão feitas 2 concatenações, mas se você fizer:
$var = "{$var1}{$var2}{$var3}";
Será feita apenas uma concatenação, e por isso será mais rápida.
Exemplo:
quando fazemos isso:
$nome = 'Lula';
$adjetivo = 'xxx';
echo 'O ' . $nome . ' é um ' . $adjetivo . '.';
//é mais lento que:
echo "O {$nome} é um {$adjetivo}."
De fato, quando você for fazer uma única concatenação, o operador . é mais rápido, porém para o caso de várias, se aplica que aspas duplas não farão chamadas ao método nativo . (ponto), e por isso serão mais rápidas.>
Lucas, no caso que você mostrou, a última concatenação é desnecessária.
$concatena = 'O Lula é um '.$adjetivo.'';é o mesmo que: $concatena = 'O Lula é um '.$adjetivo; não tem sentido concatenar o 'vazio'. http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif
Eu sei, eu concatenei o vazio, supondo que tenha mais algo na frente ao invez do vazio, mas tudo bem.
>
'Desculpa' reviver o tópico.. mas só para justificar oque eu disse:
http://br.php.net/ma...tring.php#60035
De fato, quando você for fazer uma única concatenação, o operador . é mais rápido, porém para o caso de várias, se aplica que aspas duplas não farão chamadas ao método nativo . (ponto), e por isso serão mais rápidas.
Faz sentido, legal... faz muito tempo não utilizo este tipo de concatenação única q você mostrou... tanto é que até me esqueci dela :D
Vou passar a prestar mais atenção nas minhas concatenações =P
Obrigado William Bruno =)
Carlos Eduardo