0

私はまだPHPにかなり慣れていないので、簡単なことを見落としている場合はご容赦ください。名またはユーザー名、都市、州、国、または電子メールアドレスの1つ以上の基準を入力して、メンバーを検索できるメンバー検索フォームを作成しようとしています。フォームは、単一のフィールドが入力された場合、または名前/ユーザー名フィールドに値がある場合にのみ複数のフィールドが入力された場合に機能します。それが論理的な問題だと仮定します。前もって感謝します。

if (!isset($_POST['fname']))
{
//If not isset -> set with dummy value
$_POST['fname'] = "undefine";
} 
if (!isset($_POST['city']))
{
//If not isset -> set with dummy value
$_POST['city'] = "undefine";
} 
if (!isset($_POST['state']))
{
//If not isset -> set with dummy value
$_POST['state'] = "undefine";
} 
if (!isset($_POST['country']))
{
//If not isset -> set with dummy value
$_POST['country'] = "undefine";
} 
if (!isset($_POST['email']))
{
//If not isset -> set with dummy value
$_POST['email'] = "undefine";
} 

// DEFAULT QUERY STRING
$queryString = '';

if ($_POST['fname'] != '') {
  $fname = $_POST['fname'];
  $fname = stripslashes($fname); 
  $fname = strip_tags($fname);
  $fname = preg_replace('#[^A-Za-z 0-9]#i', '', $fname);
  $fname = mysql_real_escape_string($fname);
  $queryString = "(firstname LIKE '%$fname%' OR username LIKE '%$fname%')";
} else {
  $queryString = '';
} 

if ($_POST['city'] != '') {

    if (($_POST['fname'] != '') || ($_POST['state'] != '') || ($_POST['country'] != '') || ($_POST['email'] != '')){
        $city = $_POST['city'];
        $city = stripslashes($city); 
        $city = strip_tags($city);
        $city = preg_replace('#[^A-Za-z 0-9]#i', '', $city);
        $city = mysql_real_escape_string($city);
      $queryString .= " AND city='$city'";
    }  else {
  $city = $_POST['city'];
        $city = $_POST['city'];
        $city = stripslashes($city); 
        $city = strip_tags($city);
        $city = preg_replace('#[^A-Za-z 0-9]#i', '', $city);
        $city = mysql_real_escape_string($city);
  $queryString .= "city='$city'";
  } 
  } else {
  $queryString .= '';
}   

if ($_POST['state'] != '') {

    if (($_POST['fname']) || ($_POST['city']) || ($_POST['country']) || ($_POST['email'])){
      $state = $_POST['state'];
        $state = stripslashes($state); 
        $state = strip_tags($state);
        $state = preg_replace('#[^A-Za-z 0-9]#i', '', $state);
        $state = mysql_real_escape_string($state);
      $queryString .= " AND state='$state'";
    }  else {
  $state = $_POST['state'];
        $state = stripslashes($state); 
        $state = strip_tags($state);
        $state = preg_replace('#[^A-Za-z 0-9]#i', '', $state);
        $state = mysql_real_escape_string($state);
  $queryString .= "state='$state'";
  } 
  } else {
  $queryString .= '';
}   

if ($_POST['country'] != '') {

    if (($_POST['fname']) || ($_POST['city']) || ($_POST['state']) || ($_POST['email'])) {
  $country = $_POST['country'];
  $queryString .= " AND country='$country'";
  }
  else {
  $country = $_POST['country'];
  $queryString .= "country='$country'";
  }
} else {
  $queryString .= '';
}   

if ($_POST['email'] != '') {

    if (($_POST['fname']) || ($_POST['city']) || ($_POST['state']) || ($_POST['country'])){
      $email = $_POST['email'];
                $email = stripslashes($email); 
        $email = strip_tags($email);
        $email = preg_replace('#[^A-Za-z 0-9,.@-]#i', '', $email);
        $email = mysql_real_escape_string($email);
      $queryString .= " AND email='$email'";
    }  else {
  $email = $_POST['email'];
  $queryString .= "email='$email'";
  } 
  } else {
  $queryString .= '';
}   

//////////////  QUERY THE MEMBER DATA USING THE $queryString variable's value
$sql = mysql_query("SELECT id, username, firstname, city, state, country FROM members WHERE $queryString AND emailactivated='1' ORDER BY id ASC"); 
4

3 に答える 3

1

間違いなく、クエリ文字列を構築するための非常に恐ろしい方法です。私はそれをスクラップして最初からやり直すと言いますが、あなたは新しいので、私たちはあなたが持っているもので作業します。

最初のステップは、SQLが機能していると想定するのをやめることです。クエリ呼び出しでエラーチェックが発生しないため、有用なフィードバックの方法でゼロが得られます。したがって、クエリ呼び出しを次のように変更します。

$sql = mysql_query(...query...) or die(mysql_error()); 
                               ^^^^^^^^^^^^^^^^^^^^^^---add this

これで、実際のmysqlエラーメッセージの適切なダンプと、クエリのどこがどのように間違っているかを説明するクエリのスニペットが表示されます。ほとんどの場合、そこに追加するすべてのフィールドを考えると、スペースなどを忘れて、クエリを次のように見せています(とp=qand z=yの間にスペースがないことに注意してください)。qand

これらのエラーメッセージを受け取ったら、構文エラーがどこにあるのか、そしてそれを修正するために何が必要なのかを理解するのがはるかに簡単になります。

于 2012-06-15T03:55:22.427 に答える
0

私が見るいくつかの問題:

  1. issetテストでは未定義の変数を に設定します'undefine'が、クエリを作成するときは をテストし''ます。これは、名前が空白の場合、常に という名前の人を探していることを意味しますundefine

  2. $_POSTコードで変数を変更しようとしないでください。$_POST別の変数にロードして、コードでそれを操作する必要があります。

于 2012-06-15T04:04:13.310 に答える
0

// このように投稿されたすべてのデータを取得します

if(isset($_POST['fname']))
{
   $fname=$_POST['fname'];
}

//すべてのフィールド値を取得

if(empty($fname))
{
}
else
{
     $where . ="fname=$fname and ";
}  
//Check and build where for each field 

//  then remove the last and 

$where  = rtrim($where, ' AND ');

if (empty($where)) {
         $where_str = NULL;
      } else {
         $where_str = "WHERE $where";
      } 

$query ="select fieldNames from tableName ";

$query . =$where_str;
于 2012-06-15T04:47:31.880 に答える