web-dev-qa-db-fra.com

Requête de recherche à partir de plusieurs champs MySQL

Tout le monde peut m'aider ... Voici deux champs, l'un est le nom et un autre, l'adresse e-mail. Je souhaite effectuer une recherche par nom ou par e-mail, mais cela ne fonctionne pas, il recherche uniquement par nom.

<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("chinmay", $con) or die("ERROR");


if(isset($_REQUEST['submit'])){
    $name=$_POST['name'];
    $email=$_POST['email'];
    $sql=" SELECT * FROM users WHERE fname like '%".$name."%' OR user_email ='%".$email."%'";
    $q=mysql_query($sql);
}
else{
    $sql="SELECT * FROM users";
    $q=mysql_query($sql);
}
?>
<form method="post">
    <table width="200" border="1">
  <tr>
    <td>Name</td>
    <td><input type="text" name="name" value="<?php echo $name;?>" /></td>
    <td>Email</td>
    <td><input type="text" name="email" value="<?php echo $email;?>" /></td>
    <td><input type="submit" name="submit" value=" Find " /></td>
  </tr>
</table>
</form>
<table>
    <tr>
        <td>Name</td>
        <td>Email</td>
        <td>Address</td>
    </tr>
    <?php
    while($res=mysql_fetch_array($q)){
    ?>
    <tr>
        <td><?php echo $res['fname'].' '.$res['lname'];?></td>
        <td><?php echo $res['user_email'];?></td>
        <td><?php echo $res['address'];?></td>
    </tr>
    <?php }?>
</table>

Comment obtenir les données lorsque je recherche à la fois le nom et l'adresse de messagerie?

4
Chinmay235

Vous avez = pour votre email

$sql=" SELECT * FROM users WHERE fname like '%".$name."%' OR user_email ='%".$email."%'";

Devrait être

$sql=" SELECT * FROM users WHERE fname like '%".$name."%' OR user_email like '%".$email."%'";

Autrement, sans le même effet sur les courriers électroniques, il essaie littéralement (=) de faire correspondre les courriers électroniques de votre base de données qui sont% ". $ Email."%

8
James

il existe une différence majeure entre AND- et OR- statement. Si vous souhaitez utiliser à la fois l'adresse électronique et le nom, utilisez AND. De même, si vous utilisez des variables%, utilisez LIKE au lieu de l'opérateur =, car le dernier compare les valeurs pour l'égalité, tandis que LIKE compare en faisant correspondre les valeurs.

$sql=" SELECT * FROM users WHERE fname like '%".$name."%' AND user_email LIKE '%".$email."%'";

La différence entre AND et OR réside dans leurs champs de valeur. 

 b1  |  b2  |  OR  |  AND
****************************
true | true | true | true
true | false| true | false
false| true | true | false
false| false| false| false

(b1 = appuyez sur le nom d'utilisateur, b2 = appuyez sur le courrier électronique) c'est pourquoi vous ne sélectionnez que le nom d'utilisateur à l'aide d'une instruction OR- car elle correspond déjà.

3
KarelG
$sql=" SELECT * FROM users WHERE fname like '%".$name."%' 
        OR user_email ='%".$email."%'";

Vous ne pouvez pas utiliser = et emballer votre variable in%

essaye ça:

$sql=" SELECT * FROM users WHERE fname like '%".$name."%' 
       OR user_email like '%".$email."%'";

ou ca:

$sql=" SELECT * FROM users WHERE fname like '%".$name."%' 
       OR user_email ='".$email."'";

Soit on devrait travailler. Si vous changez simplement la OR en une AND comme le suggère l'autre réponse, cela ne fonctionnera toujours pas correctement. user_email = '%".$email."%'" will find email addresses that start and end with% `. 

2
wesleywmd

Idéal pour beaucoup de colonnes/geeignet pour se vanter de Spalten/dla wielu kolumny 

  <?php


            //YOUR TABLE/DEINE TABELLE/TWOJA TABELA
            $table="table";
            //YOUR SEARCHSTRING/DEIN SUCHSTRING/SlOWO DO WYSZUKIWANIA
            $nichtsichererstring="searchstring";
            $suchstring=mysql_real_escape_string($nichtsichererstring);
            $query = "SELECT * from ".$table." where ( ";
            $results = mysql_query("DESCRIBE ".$table);
            $zaehler=mysql_num_rows($results);
            $x=1;
            while($row = mysql_fetch_array($results)) {
            $query = $query.$row["Field"]." LIKE '%".$suchstring."%' ";
            if($x<$zaehler){
            $query = $query." OR ";
            }
            $x++;
            }
            $query =$query.")";
            $result = mysql_query($query); 
            while ($row = mysql_fetch_array($result)) 
            { 
            //YOUR RESULTS!/DEINE ERGEBNISE/TWOJE WYNIKI
            echo $row["titel"];
            }

?>
0
xxxxxx

Chinmay, je n'ai pas de serveur SQL disponible pour effectuer des tests, mais voici certaines choses à essayer qui pourraient nous aider à mieux comprendre la cause.

Que se passe-t-il si vous permutez l'expression SQL pour qu'elle teste d'abord user_email?
Ou cherchez UNIQUEMENT user_email?
Pouvez-vous vous connecter le code SQL pour confirmer qu'il est correct?
Et comme le dit James, avez-vous l’intention de faire une recherche de type LIKE ou d’égalité dans le courrier électronique?

En outre, puisque vous construisez le code SQL directement à partir de l'entrée (et que BTW le laisse ouvert pour une attaque par injection SQL), le caractère "@" est-il un caractère spécial dans les expressions MS SQL?

0
Michael Lemaire