【问题标题】:php output jsonphp输出json
【发布时间】:2012-10-10 04:06:40
【问题描述】:

我试图让我可以轻松地使用来自 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
    }
  });
}

【问题讨论】:

  • $db-&gt;disconnectDB(); 无法访问。
  • DB 类在哪里?
  • 请修复 SQL 注入漏洞 - 参见 stackoverflow.com/questions/60174/…(最好改用 mysqli_* 或 pdo 代替过时的 mysql_* 函数)。

标签: php mysql json


【解决方案1】:
$str = $_SERVER['QUERY_STRING'];
if($str != ''){
    if(preg_match("/username/",$str)){
        parse_str($str);
        $json = json_encode(checkUserName($username));
        echo $json;
    }
}

使用$_GET superglobal 可以更轻松地编写:

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();

除非您使用持久连接,否则您不需要此语句。如果这样做,则应首先将返回值保留在变量中,并且仅在断开连接后才返回。

【讨论】:

    【解决方案2】:

    我不知道你的 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));
    
    ?>
    

    【讨论】:

      【解决方案3】:

      顺便说一句,如果你想处理jquery中的json数据你可以这样做

      $.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");
      

      【讨论】:

      • 我使用 $.getJSON() 关闭了 jquery
      【解决方案4】:

      如果您想要修复,只需将您的 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);
        }
      

      【讨论】:

        猜你喜欢
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        相关资源
        最近更新 更多