Ir para o conteúdo

Publicidade

 Estatísticas do Fórum

  • 0 Usuários ativos

    0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

Cursos Online iMasters
Foto:

consulta duas tabelas ao mesmo tempo

  • Por favor, faça o login para responder
5 respostas neste tópico

#1 Francisco Leal

Francisco Leal
  • Membros
  • 48 posts

Postado 12 abril 2011 - 21:59

gostaria de saber o seguinte eu to cadastrando no bd no campo telresidencial varchar = (11)3124-5678, o problema é na hora de consultar, por exemplo: eu criei um campo de texto e la eu digito 3 ou 31245678, só que ele não encontra agora se eu digitar ( ou (12)3124-5678 completo ele encontra como faco para que não tenha a necessidade de digitar (11)<<<-- isso gostaria que na consulta ele conseguisse encontrar por pelo menos os 4 primeiros numeros ou pelo numero completo sem a necessidade de digitar o ddd (11) e o - << , outra duvida é tipo esse campo tem numa tabela cadaluno e cadcontratante, ao digitar o telefone no campo de texto gostaria que ele buscasse nas duas tabelas apresentando todos os dados da tabela cadalunos e cadcontratante, como faria isso? consultar duas tabelas ao mesmo tempo verificando o telefone digitado e apresentar os dados das duas tabelas.. eu tava usando inner join mas acho que não montei direito.. portanto não funcionou.. alguem ae manja disso?

Editado por Mário Monteiro, 13 abril 2011 - 17:16 .
Retirada a palavra "DÚVIDA" do Titulo ou Descrição

  • 0

#2 mangakah

mangakah

    "L"

  • Membros
  • 1.856 posts

Postado 12 abril 2011 - 22:59

Você nem disse que banco de dados está usando nem como é a sua consulta. Vou supor que seja algo como:
SELECT * FROM clientes WHERE telresidencial = "(11)3124-5678"

O que você deve fazer quando não ter certeza se o valor da consulta não é exatamente igual ao que está armazenado no banco de dados é usar Expressões Regulares (RegExp).
Referência: http://dev.mysql.com.../pt/regexp.html

Para usar RegExp troque o operador = pelo operador REGEXP e coloque uma expressão regular

Exemplo para quatro primeiros números:
SELECT * FROM clientes WHERE telresidencial REGEXP "\([0-9][0-9]\)(3124)\-([0-9][0-9][0-9][0-9])"

Exemplo para todos os números exceto DDD:
SELECT * FROM clientes WHERE telresidencial REGEXP "\([0-9][0-9]\)(3124\-5678)"



Se você não entende de RegExp, vai um resumo rápido:
[0-9] -- significa qualquer número de 0 á 9
() -- parentesis servem para agrupar caracteres.
Os seguintes carecteres são especiais(tem significado) e precisam ser escapados por uma barra invertida '\': ( ) [ ] . * ? ^ $ \ /
Para saber mais: http://aurelio.net/er/
  • 0

#3 Francisco Leal

Francisco Leal
  • Membros
  • 48 posts

Postado 12 abril 2011 - 23:35

ah verdade, uso o mysql. entao fica assim eu digito no input e pego via post guardo dentro da variavel $texto e determino que ele pegue pelo primeiro numero usando like
$texto = $_POST['consultar'];
$texto = $texto{0}; //aqui determina que ele pegue o primeiro digito
$sql= "select * FROM cadcontratante WHERE telresidencial like '".$texto."%' GROUP BY telresidencial ASC";
$result=mysql_query($sql);
while ($dados=mysql_fetch_array($result, MYSQL_ASSOC)){
echo "<table>";
echo "<tr><td bgcolor=#F3F3F3>".$dados['telresidencial']."</td>";
echo "<td bgcolor=#F3F3F3>".$dados['nascimento']."</td>";
echo "<td bgcolor=#F3F3F3>".$dados['cpf']."</td>";
echo "<td bgcolor=#F3F3F3>".$dados['rg']."</td>";
echo "<td><a href=../editar/aluno.php?codigo=".$dados['cod'].">EDITAR</a></td>";
echo "</table>";
}
}

SELECT * FROM cadcontratante inner join cadalunos on cadalunos.telresidencial = cadcontratante.telresidencial
WHERE cadcontratante.telresidencial= $texto <<<< testei mas num funcionou...


nesse exemplo que você cita, você determina 3124 pq te passei um numero mas e se fosse outro , desculpe mas nao sei mexer com isso, vou ler os links que você me passou, obrigado desde ja..

Exemplo para quatro primeiros números:
SELECT * FROM clientes WHERE telresidencial REGEXP "\([0-9][0-9]\)(3124)\-([0-9][0-9][0-9][0-9])"

fiz assim ele emite os dados das duas tabelas.. claro que ha outro jeito em apenas uma linha de sql mas nem imagino como... agora mangakah eu só tenho que mudar como faco a busca eliminando o ddd do jeito que você me mostrou nessa linha

SELECT * FROM clientes WHERE telresidencial REGEXP "\([0-9][0-9]\)(3124)\-([0-9][0-9][0-9][0-9])"


no caso onde você colocou (3124) eu poderia colocar $texto????? e se eu digitar menos que 4 digitos digtasse 1 ou 2 funcionaria???



$sql= "SELECT * FROM cadcontratante WHERE telresidencial like '".$texto."%' GROUP BY telresidencial ASC";
$result=mysql_query($sql);
while ($dados=mysql_fetch_array($result, MYSQL_ASSOC)){
echo "<table>";
echo "<tr><td bgcolor=#F3F3F3>".$dados['telresidencial']."</td>";
echo "<td bgcolor=#F3F3F3>".$dados['nascimento']."</td>";
echo "<td bgcolor=#F3F3F3>".$dados['cpf']."</td>";
echo "<td bgcolor=#F3F3F3>".$dados['rg']."</td>";
echo "<td><a href=../editar/aluno.php?codigo=".$dados['cod'].">EDITAR</a></td>";
echo "</table>";
}

$sql= "SELECT * FROM cadalunos WHERE telresidencial like '".$texto."%' GROUP BY telresidencial ASC";
$result=mysql_query($sql);
while ($dados=mysql_fetch_array($result, MYSQL_ASSOC)){
echo "<table>";
echo "<tr><td bgcolor=#F3F3F3>".$dados['telresidencial']."</td>";
echo "<td bgcolor=#F3F3F3>".$dados['nascimento']."</td>";
echo "<td bgcolor=#F3F3F3>".$dados['cpf']."</td>";
echo "<td bgcolor=#F3F3F3>".$dados['rg']."</td>";
echo "<td><a href=../editar/aluno.php?codigo=".$dados['cod'].">EDITAR</a></td>";
echo "</table>";
}
}

  • 0

#4 mangakah

mangakah

    "L"

  • Membros
  • 1.856 posts

Postado 13 abril 2011 - 08:33

Opa Francisco, essa variável $texto tem número de telefone?

Me parece que o seu problema é que o usuário desse programa que você está escrevendo pode consultar um número de telefone usando apenas 2, 3 ou 5 (para dar apenas exemplos) e você quer que o seu programa se vire pra procurar os números que casem (usa-se esse termo quando uma string é equivalente uma RegExp) com a consulta do usuário e mostre os resultados encontrados.

Bom, você já entendeu que a expressão "[0-9]" irá casar qualquer número de 0 á 9. Então basta identificar quantos números falta pra completar o telefone e gerar uma sequencia de "[0-9]" igual a esse número.

Escrevi uma classizinha que dá um jeito no problema do número de telefone. Ela tenta identificar as partes do número (DDD, Prefixo e Sufixo) e substitui o que está faltando por "[0-9]" para ser usado com o operador REGEXP da SQL. O formato correto é esse "(11)1234-5678 mas se você mandar por exemplo "(11)" apenas ele irá retornar "(11)[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]", se mandar "1234-5678" ele retorna "([0-9][0-9])1234-5678". Não é a prova de pentelhos, mas eu testei várias combinações e ele funcionou em todas. Segue o código:

 class NumeroTelefone {
	 
	public $numeroSugerido;
	public $numeroValido = false;
	public $numeroTelefone;
	public $ddd;
	public $prefixo;
	public $sufixo;
	
	
	public function __construct($tel)
	{
		$this->numeroValido = $this->verificaNumeroTelefone($tel);		
		$this->numeroTelefone = $this->completaNumeroTelefone( $this->numeroValido ? $tel : $this->numeroSugerido );
	}
	
	public function numeroValido() {
		return $this->numeroValido;
	}
	
	public function pegaNumeroSugerido() {
		return $this->numeroSugerido;
	}
	
	public function pegarNumeroTelefone() {
		return $this->numeroTelefone;
	}
	
	public function pegarDdd() {
		return $this->ddd;	
	}
	
	public function pegarPrefixo() {
		return $this->prefixo;	
	}
	
	public function pegarSufixo() {
		return $this->sufixo;
	}


	private function verificaNumeroTelefone($tel)
	{	
		$temDdd = false;
		
		if(preg_match("/\((\d{2}\))/", $tel, $temddd) !== false) {
			if(!empty($temddd)) {
     			$temDdd = true;
			}
		} else {
			trigger_error("PREG Error<br />", E_USER_WARNING);
		}
	
		if(preg_match("/(?:\((\d{2})\))?(\d{1,4})(?:\-(\d{1,4}))?/", $tel, $casamentos) !== false) {
			$partes = array_slice($casamentos, 1);
			
			if($temDdd) {
				foreach($partes as $k => $v) {
					if(empty($v)) { unset($partes[$k]); }
				}
			}
			
			$numPartes = count($partes);
			$vars = array("ddd","prefixo","sufixo");
			
			$partes = array_combine(array_slice($vars, 0, $numPartes), $partes);
			
			foreach($partes as $var => $parte) {
				$this->$var = trim($parte);	
			}			
			
			if(!empty($casamentos)) {
				if($casamentos[0] == $tel) {
					return true;
				} else {
					$this->numeroSugerido = $casamentos[0];	
				}
			}
		} else {
			trigger_error("PREG Error<br />", E_USER_WARNING);
		}
		return false;
	}
	
	private function completaNumeroTelefone() {
		
		$p = "[0-9]";
		$n1 = strlen($this->ddd);
		$n2 = strlen($this->prefixo);
		$n3 = strlen($this->sufixo);
		
		if($n1 < 2) {
			$this->ddd .= str_repeat($p, (2 - $n1) );
		}
		if($n2 < 4) {
			$this->prefixo .= str_repeat($p, (4 - $n2) );
		}
		if($n3 < 4) {
			$this->sufixo .= str_repeat($p, (4 - $n3) );
		}
		
		return sprintf("(%s)%s-%s", $this->ddd, $this->prefixo, $this->sufixo);
	}
 }


Para usa-la faça como no exemplo abaixo:

$telefone = new NumeroTelefone($_GET['tel']);

$out = array();
$out1 []= "Número de Telefone consultado: " . $tel;
$out1 []= "O número de telefone é válido? " . ($telefone->numeroValido()) ? "SIM" : "NÃO";
if($telefone->numeroValido()) {
	$out1 []= "Código DDD: " . $telefone->pegarDdd();
	$out1 []= "Prefixo: " . $telefone->pegarPrefixo();
	$out1 []= "Sufixo: " . $telefone->pegarSufixo();
} else {
	$out1 []= "Número sugerido: " . $telefone->pegaNumeroSugerido();
}
$out1 []= "RegExp/Número de telefone para consulta SQL: " . $telefone->pegarNumeroTelefone();

echo implode("<br />\n", $out1) . "<hr />";


--

Quanto às tabelas, elas são relacionadas pelo campo telresidencial?
  • 0

#5 Francisco Leal

Francisco Leal
  • Membros
  • 48 posts

Postado 14 abril 2011 - 21:55

nossa que doidera esses codigos, pega leve.. vo ver se entendo e testa-los.. coisa de profissional... vi que OO ta na praça e tenho que aprender na marra.. sou basic ainda mas chego la ... vlw vou ver o lance da tabela que tu falou.. Obrigado !
  • 0

#6 mangakah

mangakah

    "L"

  • Membros
  • 1.856 posts

Postado 14 abril 2011 - 22:37

Ixi... vi agora que tem um pequeno erro na antepenultima linha (tinha esquecido de escapar os caracteres especiais).
Corrija aí porque o fórum não permite editar:

Onde se está
                return sprintf("(%s)%s-%s", $this->ddd, $this->prefixo, $this->sufixo);
coloque
                return sprintf("\(%s\)%s\-%s", $this->ddd, $this->prefixo, $this->sufixo);

--------

Mas olha, você só precisa entender a classe, só parte abaixo:

Ela retorna o número de telefone "(11)1234-5678":
$telefone = new NumeroTelefone("(11)1234-5678");

$out = array();
$out1 []= "Número de Telefone consultado: " . $tel;
$out1 []= "O número de telefone é válido? " . ($telefone->numeroValido()) ? "SIM" : "NÃO";
if($telefone->numeroValido()) {
        $out1 []= "Código DDD: " . $telefone->pegarDdd();
        $out1 []= "Prefixo: " . $telefone->pegarPrefixo();
        $out1 []= "Sufixo: " . $telefone->pegarSufixo();
} else {
        $out1 []= "Número sugerido: " . $telefone->pegaNumeroSugerido();
}
$out1 []= "RegExp/Número de telefone para consulta SQL: " . $telefone->pegarNumeroTelefone();

echo implode("<br />\n", $out1) . "<hr />";


Se você entregar para ela:
"(11)1234-678" retorna "\(11\)1234\-[0-9]678"
"(11)" retorna "\(11\)[0-9][0-9][0-9][0-9]\-[0-9][0-9][0-9][0-9]"
etc.


Então você pode usar $telefone->pegarNumeroTelefone() para fazer a consulta SELECT REGEX:
$sql = "SELECT * FROM clientes WHERE telresidencial REGEXP '" . $telefone->pegarNumeroTelefone() . "'";

  • 0




Publicidade

/ins>