0

php/mysqlからjqueryを使用してjson出力を簡単にリクエストできるようにしようとしています。現在、以下を使用しています。誰かがより良い方法をお勧めできますか?

/do.php?username=bob

<?php
    $str = $_SERVER['QUERY_STRING'];
    if($str != ''){
        if(preg_match("/username/",$str)){
            parse_str($str);
            $json = json_encode(checkUserName($username));
            echo $json;
        }
    }
    function checkUserName($v){
        $db = new DB();
        $db->connectDB();

        $findUsername = mysql_query("SELECT COUNT(*) FROM user WHERE username = '$v'");
        $countUser = mysql_fetch_row($findUsername);
        if($countUser[0] < 1){
            return array('username' => 'false');
        }else{
            return array('username' => 'true');
        }

        $db->disconnectDB();
    }
?>

クリーンな{'username':'false'}または{'username':'true'}が返されます。これは、必要なものに対して機能します。しかし、これを行うためのPHPのより良い方法はありますか?

うわー-素晴らしい答え!古いdbクラスをダンプして、次のように置き換えました。

<?php
  function db_connect(){
    $dbh = new PDO("mysql:host=localhost;dbname=thisdb", "dbuser", "dbpass");
    return ($dbh);
  }
?>

次に、do.phpスクリプトで次の変更を行いました。

<?php
  if(isset($_GET['username'])){
    header('content-type: application/json; charset=UTF-8');
    echo json_encode(checkUserName($_GET['username']));
  }

  function checkUserName($v){
    $dbh = db_connect();
    $sql = sprintf("SELECT COUNT(*) FROM user WHERE username = '%s'", addslashes($v));
    if($count = $dbh->query($sql)){
      if($count->fetchColumn() > 0){
        return array('username'=>true);
      }else{
        return array('username'=>false);
      }
    }
  }
?>

そして私のjqueryは:

function checkUserName(str){
  $.getJSON('actions/do.php?username=' + str, function(data){
    var json = data;
    if(json.username == true){
      // allowed to save username
    }else{
      // not allowed to save username
    }
  });
}
4

4 に答える 4

1
$str = $_SERVER['QUERY_STRING'];
if($str != ''){
    if(preg_match("/username/",$str)){
        parse_str($str);
        $json = json_encode(checkUserName($username));
        echo $json;
    }
}

$_GETこれは、スーパーグローバルを使用することで非常に簡単に記述できます。

if (isset($_GET['username'])) {
    echo json_encode(checkUserName($_GET['username']));
}

内部checkUserName()

$findUsername = mysql_query("SELECT COUNT(*) FROM user WHERE username = '$v'");

$v適切に脱出する必要があります:

$sql = sprintf("SELECT COUNT(*) FROM user WHERE username = '%s'", mysql_real_escape_string($v));
$findUsername = mysql_query($sql);

さらに良いことに、PDO / mysqliを学び、プリペアドステートメントを使用します。

$db->disconnectDB();

持続的接続を使用している場合を除き、このステートメントは必要ありません。その場合、最初に戻り値を変数内に保持し、切断後にのみ戻る必要があります。

于 2012-10-10T04:15:40.130 に答える
1

あなたのDBクラスが何であるかはわかりませんが、これはよりきれいに見えます。

<?php

function checkUserName($v){
    $db = new DB();
    $db->connectDB();

    $findUsername = mysql_query("SELECT COUNT(*) FROM user WHERE username = '$v'");
    $countUser = mysql_fetch_row($findUsername);
    $db->disconnectDB(); // no code after "return" will do effect

    return ($countUser[0] != 0); // returning a BOOL true is better than a string "true"
}

// use addslashes to prevent sql injection, and use isset to handle $_GET variables.
$username = isset($_GET['username']) ? addslashes($_GET['username']) : '';

// the above line is equal to:
//  if(isset($_GET['username'])){
//      $username = addslashes($_GET['username']);
//  }else{
//      $username = '';
//  }

echo json_encode(checkUserName($username));

?>
于 2012-10-10T04:16:26.790 に答える
0

ちなみに、jsonデータを処理したい場合は、次のjqueryようにすることができます

$.ajax({
            type:"POST",
            data:'username=bob',
            url: "do.php",
            success: function(jsonData){
                var jsonArray = eval('(' + jsonData + ')');

                if(jsonArray.username == 'true'){
                    // some action here
                }else if((jsonArray.username == 'false')){
                    // someother action hera
                }



            }
        },"json");
于 2012-10-10T04:27:06.970 に答える
0

修正が必要な場合は、checkUsername関数を次の関数に置き換えてください。

function checkUserName($v){
  $db = new DB();
  $db->connectDB();  

  $findUsername = mysql_query("SELECT username FROM user WHERE username = '$v' LIMIT 1");

  if(mysql_num_rows($findUsername))
    return array('username' => mysql_result($findUsername,0));
  else
    return array('username' => 'false');

}

または、より簡単な方法:

if(isset($_GET['username'])){

     $db = new DB();
     $db->connectDB();

     $query = mysql_query(sprintf("SELECT username FROM user 
                            WHERE username='%s'",
                            mysql_real_escape_string($_GET['username'])
                         );

     if(mysql_num_rows($query))
        $json = array('username'=>mysql_result($query,0));
     else
        $json = array('username'=>false);

     header('content-type:application/json');
     echo json_encode($json);
  }
于 2012-10-10T04:16:27.323 に答える