web-dev-qa-db-ja.com

複数のフィールドからクエリを検索するMySQL

誰でも私を助けることができます...ここに2つのフィールドがあります。1つは名前で、もう1つは電子メールです。名前またはメールで検索したいのですが、機能せず、名前で検索するだけです

<?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>

名前とメールアドレスの両方を検索するときにデータを取得するにはどうすればよいですか?

4
Chinmay235

あなたが持っている=あなたの電子メールのために

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

する必要があります

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

それ以外の場合、電子メールに同様のものがない場合、文字通り(=)DB内の% "。$ email。"%の電子メールと一致させようとします。

8
James

AND-ステートメントとOR-ステートメントには大きな違いがあります。メールアドレスと名前の両方をヒットさせたい場合は、ANDを使用してください。また、%変数を使用している場合は、=演算子の代わりにLIKEを使用します。これは、最後に値が等しいかどうかを比較し、LIKEが値を照合して比較するためです。

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

ANDORの違いは、値フィールドにあります。

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

(b1 =ユーザー名にヒット、b2 =電子メールにヒット)そのため、すでに一致するものがあるため、ORステートメントを使用してユーザー名のみを選択しています。

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

=を使用して変数を%でラップすることはできません

これを試して:

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

またはこれ:

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

どちらかが機能するはずです。他の回答が示唆するように、ORANDに単純に変更した場合でも、正しく機能しません。 user_email = '%".$email."%'" will find email addresses that start and end with% `。

2
wesleywmd

多くのカラムに最適/geeignetfürsehrvieleSpalten/ 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、テストできるSQL Serverがありませんが、原因を明らかにするために試すべきことがいくつかあります。

SQL式を入れ替えてuser_emailを最初にテストするとどうなりますか?
またはuser_emailのみを検索しますか?
SQLをログに記録して、正しいことを確認できますか?
そして、ジェームズが言うように、あなたは電子メールでLIKEまたは平等検索をするつもりですか?

また、入力から直接SQLを構築しているので(そして、SQLインジェクション攻撃のためにSQLを開いたままにしているので)、「@」はMS SQL式の特殊文字ですか?

0
Michael Lemaire